如何使用此 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
您使用 /\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
我有一个包含此 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
您使用 /\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