2

utf8::encodeプラグマを使用するときに問題がありますuse open qw(:std :utf8);

#!/usr/bin/env perl

use v5.16;
use utf8;
use open qw(:std :utf8);

use Data::Dumper;

my $word = "+банк";
say Dumper($word);
say utf8::is_utf8($word) ? 1 : 0;

utf8::encode($word);
say Dumper($word);
say utf8::is_utf8($word) ? 1 : 0;

出力

$VAR1 = "+\x{431}\x{430}\x{43d}\x{43a}";
1
$VAR1 = '+банк';
0

このプラグマを削除するとuse open qw(:std :utf8);、すべて問題ありません。

$VAR1 = "+\x{431}\x{430}\x{43d}\x{43a}";
1
$VAR1 = '+банк';
0

よろしくお願いします!

4

2 に答える 2

6

に置き換える場合utf8::encode($word);use open qw(:std :utf8);、実際には を削除する必要がありますutf8::encode($word);。動作しないバージョンでは、2 回エンコードしています。

于 2013-05-10T14:09:26.750 に答える
2

utf8::encode は、perl が utf8 を出力することを期待するファイルハンドルに出力しようとしている場合に必要なものではありません。

utf8::encode は、この文字列を取得して、各文字が入力文字列の utf8 エンコーディングのバイトである文字列を提供します。これは通常、必要に応じて perl が自動的に utf8 に変換しない何らかの方法でその文字列を使用する場合にのみ行われます。

say length($word);エンコードの後に​​ a を追加すると、$word が元の 5 文字ではなく 9 文字であることがわかります。

于 2013-05-10T16:20:16.873 に答える