Hi Dan,

[Silence “Wide character” warning globally one time]
Dan Muey schrieb am 29.07.2010 um 16:59 (-0500):
> 
> I've a situation where a large code base will be outputting "byte
> strings" and "unicode strings" from a number of sources.

All lumped together? This will likely mean encoding issues.

> I essentially need to do 
>      no warnings "utf8";

That's hiding the problem.

> [ -- Problem: Unicode string gives warning -- ]

Sorry, but no, the warning is not the problem: it's an indication to
the user making him aware of the actual problem, which is printing wide
characters to a single-byte (narrow) output handle.

>     perl -le 'print "Think before you code™ (bytes string)";print "Hello 
> \x{201C}World\x{201D} (Unicode String)";'

  perl -CO -le 'print "Hello \x{201C}World\x{201D}";'

See: perldoc perlrun

You need the equivalent of -CO in your script:

  binmode STDOUT, ':utf8';

>     perl -le 'binmode STDOUT, "utf8";print "Think before you code™ (bytes 
> string)";print "Hello \x{201C}World\x{201D} (Unicode String)";'

You're mungling bytes and Unicode characters together. The result is, of
course, wrong. Pick either bytes or Unicode as your standard encoding.
Convert input accordingly.

> Is there any super voo doo that can be done?

The best voodoo is understanding Perl's Unicode handling by reading
Juerd's pages [1], which have also been included in the docs of current
Perl versions; so read those as well; but don't read the old docs, they
do contain some documentation bugs.

You might also want to read the archives of this list to see how I
managed to make some progress in understanding thanks to the good
answers I got here.

[1] http://juerd.nl/perl
-- 
Michael Ludwig

Reply via email to