「utf8」プラグマを使用してPerlスクリプトを記述しようとしていますが、予期しない結果が生じています。 Mac OS X 10.5(Leopard)を使用しており、TextMateで編集しています。エディターとオペレーティングシステムの両方の設定はすべて、utf-8形式でファイルを書き込むようにデフォルト設定されています。
ただし、次をテキストファイルに入力し、「。pl」として保存して実行すると、非ASCII文字の代わりにわかりやすい「疑問符付きのダイヤモンド」が表示されます。
#!/usr/bin/env Perl -w
use strict;
use utf8;
my $str = 'Çirçös';
print( "$str\n" );
私が間違っていることを知っていますか?出力には「Çirçös」と表示されるはずですが、代わりに「�ir��s」が表示されます。
use utf8;
はUnicodeを有効にしません出力-プログラムでUnicodeを入力できます。 print()
ステートメントの前に、これをプログラムに追加します。
binmode(STDOUT, ":utf8");
それが役立つかどうかを確認してください。これにより、通常のASCIIではなくUTF-8でSTDOUT
出力が行われます。
TMTOWTDI 、作業方法に最適な方法を選択しました。環境メソッドを使用するので、考える必要はありません。
環境 :
export Perl_UNICODE=SDL
コマンドライン :
Perl -CSDL -le 'print "\x{1815}"';
または binmode を使用:
binmode(STDOUT, ":utf8"); #treat as if it is UTF-8
binmode(STDIN, ":encoding(utf8)"); #actually check if it is UTF-8
または PerlIO :
open my $fh, ">:utf8", $filename
or die "could not open $filename: $!\n";
open my $fh, "<:encoding(utf-8)", $filename
or die "could not open $filename: $!\n";
または openプラグマ を使用:
use open ":encoding(utf8)";
use open IN => ":encoding(utf8)", OUT => ":utf8";
また、コードの文字列はutf-8であると言いたいです。 なぜ現代のPerlはデフォルトでUTF-8を避けるのですか? を参照してください。したがって、Perl_UNICODE=SDAL
だけでなくPerl5OPT=-Mutf8
も設定します。
おかげで、ついにコード全体にutf8 :: encodeを配置しない解決策が得られました。 utf8でファイルを読み書きするなど、他の場合に合成して完了し、utf8のYAMLファイルのLoadFileでも動作します。
use utf8;
use open ':encoding(utf8)';
binmode(STDOUT, ":utf8");
open(FH, ">test.txt");
print FH "something éá";
use YAML qw(LoadFile Dump);
my $PUBS = LoadFile("cache.yaml");
my $f = "2917";
my $ref = $PUBS->{$f};
print "$f \"".$ref->{name}."\" ". $ref->{primary_uri}." ";
cache.yamlは次のとおりです。
---
2917:
id: 2917
name: Semanário
primary_uri: 2917.xml