【问题标题】:Inconsistent results parsing unicode strings in perl unpack在 perl unpack 中解析 unicode 字符串的结果不一致
【发布时间】:2015-11-16 03:53:13
【问题描述】:

我正在准备一个脚本来对用外国脚本编写的字符进行成对比较,我想从目标单词中提取单个字符进行比较。

当地址 > 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

(fÉ¨Ì kaÌ€)

我可以做些什么来让第二个 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)

【问题讨论】:

    标签: bash perl unicode


    【解决方案1】:

    问题在于 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(加上您打开的每个文件)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-24
      • 2015-03-11
      • 2014-07-19
      • 2015-05-09
      • 2019-05-07
      • 2011-11-26
      • 2012-10-12
      • 1970-01-01
      相关资源
      最近更新 更多