9

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 Documents\Technical\Perl>perl "hello unicode.pl"
אני רוצה לישון
לישון
�ן

Intermediary
היא רוצה לישון
לישון
�ן

אתם, הם
�ם

Bye
Hello, world!
test

(すべてを UTF-8 で保存します)。

これは非常に奇妙です。助言がありますか?

(これは「Console2」の問題ではありません* - 「通常の」Windows コンソールでも同じ問題が発生しますが、ヘブライ語のグリフが表示されないだけです)。


* 「Console」(「Console2」とも呼ばれる) の使用 - これは、Windows コンソールで Unicode を操作できる便利な小さなユーティリティです

** 注: コンソールでは、もちろん次のように言う必要があります。

chcp 65001
4

4 に答える 4

5

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;
于 2012-02-21T01:38:59.233 に答える
3

みんな: Perlmonks の投稿を研究し続けていると、これはさらにきちんとしていて優れていることがわかります: replace:
use Win32::API;
and:

$SetConsoleOutputCP= new Win32::API( 'kernel32.dll', 'SetConsoleOutputCP', 'N','N' );
$SetConsoleOutputCP->Call(65001);

と:

use Win32::Console;

と:

 Win32::Console::OutputCP(65001);

他のすべてをそのままにしておきます。
これはさらに、Perl の簡潔さと魔法の精神に基づいています。

于 2012-02-21T20:33:10.653 に答える
1

Win32::Unicode::ConsoleまたはWin32::Unicode::Nativeを使用して、Windows コンソールで Unicode を出力することもできます。

于 2012-02-21T05:16:52.830 に答える