如何使用此 perl one liner 查找 4 位 unicode 字符?

How do I find a 4 digit unicode character using this perl one liner?

我有一个包含此 unicode 字符的文件

文件在记事本中保存为 UTF-8

我试过这条线

C:\blah>perl -wln -e "/\x{1ed7}/ and print;" blah.txt

但它没有接收到它。如果文件有像 'a'(unicode hex 61) 这样的字母,那么 \x{61} 会选择它。但是对于 4 位 unicode 字符,我在提取字符时遇到了问题。

您的脚本运行良好。问题是您用于搜索的 unicode。由于您的文件是 utf-8,因此您的唯一搜索参数需要是 E1、BB 或 97。检查以下文件编码以及它如何改变搜索条件。

 UTF-8 Encoding:    0xE1 0xBB 0x97
 UTF-16 Encoding:   0x1ED7
 UTF-32 Encoding:   0x00001ED7

资源https://www.compart.com/en/unicode/U+1ED7

您使用 /\x{1ed7}/ 的想法是正确的。问题是您的正则表达式想要匹配字符,但您给它的是字节。您需要告诉 Perl 在读取字节时从 UTF-8 解码字节,然后在写入字节时将它们编码为 UTF-8:

perl -CiO -ne "/\x{1ed7}/ and print" blah.txt

-C 选项控制如何将 Unicode 语义应用于输入和输出文件句柄。因此,例如 -CO('output' 的大写 'o')相当于在脚本开始之前添加:

binmode(STDOUT, ":utf8")

类似地,-CI等同于:

binmode(STDIN, ":utf8")

但在您的情况下,您没有使用 STDIN。相反,-n 围绕您的代码包装了一个循环,用于打开 command-line 上列出的每个文件。因此,您可以改为使用 -Ci':utf8' I/O 层添加到 Perl 打开以供输入的每个文件。您可以将 -Ci-CO 组合为:-CiO