我正在准备一个脚本来对外国脚本中写的字符进行成对比较,我想从目标词中提取单个字符以进行比较。
当地址为>的字符时256被硬编码到脚本中,unpack
正确地确定地址:例如,U + 0268(= 616十进制)(LATIN SMALL LETTER I WITH STROKE
)的序列,后跟修饰符U + 0301(= 769十进制) )(COMBINING ACUTE ACCENT
)被正确解析(第一个MWE)。
然而,从命令行或外部文本文件,解析是按字节完成的。所以不是616我得到(201,168),而不是769我得到(204,129)。在两个字节的情况下,它通常是X→(d1,d2),其中X = 64×(d1-194)+ d2。 (第二届MWE)。
$ perl -e 'use utf8; @a= unpack("U*","fɨ́kà"); print "@a\n";'
102 616 769 107 97 768
(fɨkà)
$ echo 'use utf8; @a=unpack("U*",$ARGV[0]); print "@a\n";' | perl - fɨ́kà
102 201 168 204 129 107 97 204 128
(FEI ?? KAI€)
我能做些什么来让第二个MWE正常工作吗?后处理使(201,168)→(616)看起来太粗糙了。该脚本正在从bash shell运行。
$ echo $BASH_VERSION
4.3.30(1)-release
This is perl 5, version 20, subversion 2 (v5.20.2) built for x86_64-linux-gnu-thread-multi
(with 39 registered patches, see perl -V for more detail)
答案 0 :(得分:3)
问题是Perl默认情况下不会将命令行参数解码为UTF-8。通过交换机-CA可以做到这一点:
$ echo 'use utf8; @a=unpack("U*",$ARGV[0]); print "@a\n";' | perl -CA - fɨ́kà
102 616 769 107 97 768
你可能想要-CAS(args + STD *文件句柄)甚至-CASD(加上你打开的每个文件)