文件句柄上的utf8编译指示和utf8编码让我感到困惑。例如,这个明显简单的代码......
use utf8;
print qq[fü];
要清楚,“fü”上的十六进制转储是66 c3 bc
,如果我没有弄错,那就是正确的UTF8。
打印66 fc
,它不是UTF8,而是Unicode或者拉丁语-1。关闭use utf8
,我得到66 c3 bc
。这与我的期望相反。
现在让我们添加文件句式pramgas。
use utf8;
binmode *STDOUT, ':encoding(utf8)';
print qq[fü];
现在我得到66 c3 bc
。但请删除use utf8
,我得66 c3 83 c2 bc
这对我没有任何意义。
使用UTF8制作我的代码DWIM是正确的做法吗?
PS我的语言环境设置为“en_US.UTF-8”和Perl 5.10.1。
答案 0 :(得分:6)
use utf8;
表示您的源代码是以UTF8编码的。添加
binmode *STDOUT, ':encoding(utf8)';
print qq[fü];
您要求脚本的输出也以UTF8编码。
如果你写过
print "f\x{00FC}\n";
您不需要use utf8;
。
答案 1 :(得分:0)
use utf8;
只表示您的源代码(包括字符串文字)是UTF-8。您还需要设置输入和输入的编码。输出流。
您可能希望在环境中设置PERL_UNICODE
变量。我把它设置为SAL
,它会像这样分解:
STDIN
/ STDOUT
/ STDERR
为UTF-8 @ARGV
为UTF-8 请参阅PERL_UNICODE中的the -C
option和perlrun。
您还可以使用the open
pragma设置默认编码。
如果您在分发给其他人的模块中执行此操作,则可能需要
use open ':locale';
因此,对于不使用UTF-8语言环境的用户,不会意外启用UTF-8。