web-dev-qa-db-ja.com

PerlからUTF-8を出力するにはどうすればよいですか?

「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」が表示されます。

103
Peter Conrey

use utf8;はUnicodeを有効にしません出力-プログラムでUnicodeを入力できます。 print()ステートメントの前に、これをプログラムに追加します。

binmode(STDOUT, ":utf8");

それが役立つかどうかを確認してください。これにより、通常のASCIIではなくUTF-8でSTDOUT出力が行われます。

153
Chris Lutz

open pragma を使用できます。

例えば以下は、UTF-8を使用するようにSTDOUT、STDINおよびSTDERRを設定します。

use open qw/:std :utf8/;
82
draegtun

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";
64
Chas. Owens

また、コードの文字列はutf-8であると言いたいです。 なぜ現代のPerlはデフォルトでUTF-8を避けるのですか? を参照してください。したがって、Perl_UNICODE=SDALだけでなくPerl5OPT=-Mutf8も設定します。

1
Hans Ginzel

おかげで、ついにコード全体に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
0
Sérgio