我(迟来的)第一次测试 Unicode 水域并且我无法理解为什么编码的过程,然后解码一个阿拉伯字符串会产生分离出单词组成的单个字符的效果。
在下面的示例中,单词“ﻟﻠﺒﻴﻊ”由 5 个单独的字母组成:“ع”、“ي”、“ب”、“ل”、“ل”,从右到左书写。根据周围的上下文(相邻的字母),字母会改变形式
use strict;
use warnings;
use utf8;
binmode( STDOUT, ':utf8' );
use Encode qw< encode decode >;
my $str = 'ﻟﻠﺒﻴﻊ'; # "For sale"
my $enc = encode( 'UTF-8', $str );
my $dec = decode( 'UTF-8', $enc );
my $decoded = pack 'U0W*', map +ord, split //, $enc;
print "Original string : $str\n"; # ل ل ب ي ع
print "Decoded string 1: $dec\n" # ل ل ب ي ع
print "Decoded string 2: $decoded\n"; # ل ل ب ي ع
附加信息
将字符串粘贴到此帖子时,呈现反转,因此看起来像“ﻊﻴﺒﻠﻟ”。我正在手动反转它以使其看起来“正确”。正确的 hexdump 如下所示:
$ echo "ﻟﻠﺒﻴﻊ" | hexdump 0000000 bbef ef8a b4bb baef ef92 a0bb bbef 0a9f 0000010
Perl 脚本的输出(根据 ikegami 的要求):
$ perl unicode.pl | od -t x1 0000000 4f 72 69 67 69 6e 61 6c 20 73 74 72 69 6e 67 20 0000020 3a 20 d8 b9 d9 8a d8 a8 d9 84 d9 84 0a 44 65 63 0000040 6f 64 65 64 20 73 74 72 69 6e 67 20 31 3a 20 d8 0000060 b9 d9 8a d8 a8 d9 84 d9 84 0a 44 65 63 6f 64 65 0000100 64 20 73 74 72 69 6e 67 20 32 3a 20 d8 b9 d9 8a 0000120 d8 a8 d9 84 d9 84 0a 0000127
如果我只是打印
$str
:$ perl unicode.pl | od -t x1 0000000 4f 72 69 67 69 6e 61 6c 20 73 74 72 69 6e 67 20 0000020 3a 20 d8 b9 d9 8a d8 a8 d9 84 d9 84 0a 0000035
最后(根据ikegami的要求):
$ grep 'For sale' unicode.pl | od -t x1 0000000 6d 79 20 24 73 74 72 20 3d 20 27 d8 b9 d9 8a d8 0000020 a8 d9 84 d9 84 27 3b 20 20 23 20 22 46 6f 72 20 0000040 73 61 6c 65 22 20 0a 0000047
Perl 细节
$ perl -v This is perl, v5.10.1 (*) built for x86_64-linux-gnu-thread-multi (with 53 registered patches, see perl -V for more detail)
输出到文件反转字符串:“ﻊﻴﺒﻠﻟ”
问题
我有一些:
如何在打印时保留每个字符的上下文?
为什么原始字符串作为单个字母打印到屏幕上,即使它没有被“处理”?
打印到文件时,单词是相反的(我猜这是由于脚本的从右到左的性质)。有什么办法可以防止这种情况发生吗?
为什么以下不成立:
$str !~ /\P{Bidi_Class: Right_To_Left}/;