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

上一篇: Perl: printing Unicode strings to the Windows console

下一篇: How do I exclusively indent a code block in vim?