PerlはもともとUnicodeフレンドリーではなく、UTF-8の操作には明示的な指示が必要です。現代のPerlは文字列を内部抽象(utf8フラグ付きスカラー)として保持できますが、入出力操作は特別な注意が必要です。
binmode, :encoding(UTF-8))。use utf8;を使用します。open my $fh, '<:encoding(UTF-8)', 'myfile.txt' or die $!; binmode STDOUT, ':encoding(UTF-8)';
Encode、utf8、open、charnames。use Encode; my $bytes = encode('UTF-8', $string); # バイトを取得 my $string = decode('UTF-8', $bytes); # 文字列を取得
スクリプトの冒頭に
use utf8;を追加するだけで、すべての入出力操作がUTF-8で行われますか?
回答: いいえ!use utf8;ディレクティブはソース内のUnicodeリテラルのみを解釈します。入出力にはopen時またはbinmode/openプラグマを介してIO層を設定する必要があります!例えば:
binmode STDOUT, ':encoding(UTF-8)'; open my $fh, '>:encoding(UTF-8)', $filename;
歴史
歴史
歴史
PerlサービスをMySQLクライアントと統合する際、クライアントの設定をutf8に無視して、バイト文字列で作業しました。Webインターフェースとの接点で欠陥が発生し、一部の文字が壊れ、いくつかのリクエストがデータ構造を「壊しました」です。Encodeを介した明示的な再エンコードと'mysql_enable_utf8'の設定が役立ちました。