ユニコードは難題かもしれませんし、Perlには独自の特徴があります。 基本的に、Perlは、Unicodeに関するすべての入出力手段を取り巻くファイアウォールを設置しています。 I/OへのパスにエンコーディングがあるかどうかをPerlに伝えなければなりません。そうであれば、ルールは任意の入力に対してDECODE、および/または任意の出力に対してENCODEです。
デコードインは{encoding}のデータをPerlの内部表現に変換します。これはおそらくバイトとコードポイントの組み合わせです。
エンコードアウトは正反対です。
したがって、実際には2つの異なるエンコードに「デコード」および「エンコードアウト」することが可能です。あなたはそれが何であるかを伝えるだけです。エンコード/デコードは通常ファイルI/Oレイヤーを介して行われますが、Encodeモジュール(ディストリビューションの一部)を使用して、エンコード間を手動で前後に変換することができます。
perldocs on Unicodeは軽い読み込みではありません。
これは視覚化に役立つサンプルです(他にも多くの方法があります)。
use strict;
use warnings;
use Encode;
# This is an internalized string with these UTF-8 codepoints
# ----------------------------------------------
my $internal_string_1 = "\x{C7}\x{69}\x{64}\x{65}\x{6D}\x{5F}\x{15E}\x{65}\x{6E}\x{65}\x{72}\x{20}\x{48}\x{FC}\x{73}\x{6E}\x{FC}\x{20}\x{54}\x{61}\x{11F}\x{6C}\x{69}\x{70}";
# Open a temp file for writing as UTF-8.
# Output to this file will be automatically encoded from Perl internal to UTF-8 octets.
# Write the internal string.
# Check the file with a UTF-8 editor.
# ----------------------------------------------
open (my $out, '>:utf8', 'temp.txt') or die "can't open temp.txt for writing $!";
print $out $internal_string_1;
close $out;
# Open the temp file for readin as UTF-8.
# All input from this file will be automatically decoded as UTF-8 octets to Perl internal.
# Read/decode to a different internal string.
# ----------------------------------------------
open (my $in, '<:utf8', 'temp.txt') or die "can't open temp.txt for reading $!";
$/ = undef;
my $internal_string_2 = <$in>;
close $in;
# Change the binmode of STDOUT to UTF-8.
# Output to STDOUT will now be automatically encoded from Perl internal to UTF-8 octets.
# Capture STDOUT to a file then check with a UTF-8 editor.
# ----------------------------------------------
binmode STDOUT, ':utf8';
print $internal_string_2, "\n\n";
# Use encode() to convert an internal string to UTF-8 octets
# Format the UTF-8 octets to hex values
# Print to STDOUT
# ----------------------------------------------
my $octets = encode ("utf8", $internal_string_2);
print "Encoded (out) string -> UTF-8 (octets):\n";
print " length = ".length($octets)."\n";
print " octets = $octets\n";
print " HEX val = ";
for (split //, $octets) {
printf ("0x%X ", ord($_));
}
print "\n\n";
# Use decode() to convert external UTF-8 octets to an internal string.
# Format the internal string to codepoints (hex values).
# Print to STDOUT.
# ----------------------------------------------
my $internal_string_3 = decode ("utf8", $octets);
print "Decoded (in) string <- UTF-8 (octets):\n";
print " length = ".length($internal_string_3)."\n";
print " string = $internal_string_3\n";
print " code points = ";
for (split //, $internal_string_3) {
printf ("\\x{%X} ", ord($_));
}
出力
Çidem_Şener Hüsnü Tağlip
Encoded (out) string -> UTF-8 (octets):
length = 29
octets = Ãidem_Åener Hüsnü TaÄlip
HEX val = 0xC3 0x87 0x69 0x64 0x65 0x6D 0x5F 0xC5 0x9E 0x65 0x6E 0x65 0x72 0x20 0x48 0xC3 0xBC 0x73 0x6E 0xC3 0xBC 0x20 0x54 0x61 0xC4 0x9F 0x6C 0x69 0x70
Decoded (in) string <- UTF-8 (octets):
length = 24
string = Çidem_Şener Hüsnü Tağlip
code points = \x{C7} \x{69} \x{64} \x{65} \x{6D} \x{5F} \x{15E} \x{65} \x{6E} \x{65} \x{72} \x{20} \x{48} \x{FC} \x{73} \x{6E} \x{FC} \x{20} \x{54} \x{61} \x{11F} \x{6C} \x{69} \x{70}
出典
2012-03-15 21:07:07
sln
関連しているが*ありません*重複:http://stackoverflow.com/questions/5555613/does-w-match-all-alphanumeric-characters-defined-in-the -unicode-standard、http://stackoverflow.com/questions/1796573/regex-word-breaker-in-unicode –
あなたは 'open MYINPUTFILE、 '<:encoding(UTF-8)'、$ ARGV [0] ... '。さもなければあなたの入力は生の(オクテット)であり、期待どおりに解釈されません。 – mob
認識できない文字\ xC3; C:/ Users/erogol/Documents/Aptana Studio 3 Workspace/Automata/file.txt行の第5列の近くにある - ここではMufeの後ろに - でマークされています。このエラーはユーザーには認識されず、 ... " – erogol