Perl:将Unicode字符串打印到Windows控制台
在将Unicode字符串打印到Windows控制台*时遇到了一个奇怪的问题。
考虑这个文本:
אני רוצה לישון
Intermediary
היא רוצה לישון
אתם, הם
Bye
Hello, world!
test
假设它在一个名为“file.txt”的文件中。
当我去*:“type file.txt”时,它打印出来很好。 但是当它从Perl程序打印时,像这样:
use strict;
use warnings;
use Encode;
use 5.014;
use utf8;
use autodie;
use warnings qw< FATAL utf8 >;
use open qw< :std :utf8 >;
use feature qw< unicode_strings >;
use warnings 'all';
binmode STDOUT, ':utf8'; # output should be in UTF-8
my $word;
my @array = ( 'אני רוצה לישון', 'Intermediary',
'היא רוצה לישון', 'אתם, הם', 'Bye','Hello, world!', 'test');
foreach $word(@array) {
say $word;
}
Unicode代码行(这里是希伯来文)每次都会再次出现,部分破碎,如下所示:
E:My DocumentsTechnicalPerl>perl "hello unicode.pl"
אני רוצה לישון
לישון
�ן
Intermediary
היא רוצה לישון
לישון
�ן
אתם, הם
�ם
Bye
Hello, world!
test
(我用UTF-8保存所有内容)。
这很奇怪。 有什么建议么?
(这不是“Console2”问题) - 同样的问题出现在“常规”的Windows控制台上,只有你没有看到希伯来字形)。
*使用“控制台”(也称为“Console2”) - 这是一个很好的小工具,可以使用Windows控制台的Unicode工作 - 例如,请参阅:http://www.hanselman.com/blog/Console2ABetterWindowsCommandPrompt.aspx
**注意:在控制台,当然你必须说:
chcp 65001
您是否尝试过perlmonk的解决方案?
它使用:unix
以避免控制台缓冲区。
这是该链接的代码:
use Win32::API;
binmode(STDOUT, ":unix:utf8");
#Must set the console code page to UTF8
$SetConsoleOutputCP= new Win32::API( 'kernel32.dll', 'SetConsoleOutputCP', 'N','N' );
$SetConsoleOutputCP->Call(65001);
$line1="x{2554}".("x{2550}"x15)."x{2557}n";
$line2="x{2551}".(" "x15)."x{2551}n";
$line3="x{255A}".("x{2550}"x15)."x{255D}";
$unicode_string=$line1.$line2.$line3;
print "THIS IS THE CORRECT EXAMPLE OUTPUT IN PURE PERL: n";
print $unicode_string;
伙计们:继续研究Perlmonks的帖子,结果证明这更整洁,更好:替换:
use Win32::API;
和:
$SetConsoleOutputCP= new Win32::API( 'kernel32.dll', 'SetConsoleOutputCP', 'N','N' );
$SetConsoleOutputCP->Call(65001);
有:
use Win32::Console;
和:
Win32::Console::OutputCP(65001);
留下所有其他的完好无损。
这更符合Perl简洁和魔力的精神。
您还可以使用Win32 :: Unicode :: Console或Win32 :: Unicode :: Native在Windows控制台上实现unicode打印。
链接地址: http://www.djcxy.com/p/28627.html