如何使用这个perl单行程序查找4位unicode字符?

如何使用这个perl单行程序查找4位unicode字符?,perl,unicode,Perl,Unicode,我有一个unicode字符ỗ 以UTF-8格式保存在记事本中的文件 我试过这句话 C:\blah>perl-wln-e/\x{1ed7}/并打印;“blah.txt 但它没有把它捡起来。如果文件中有一个类似“a”(unicode十六进制61)的字母,则\x{61}会将其拾取。但是对于4位unicode字符,我在提取字符时遇到问题。您的脚本工作正常。问题是用于搜索的unicode。因为您的文件是utf-8,所以您的唯一搜索参数需要是E1、BB或97。检查下面的文件编码以及它如何更改搜索条件 U

我有一个unicode字符

以UTF-8格式保存在记事本中的文件

我试过这句话

C:\blah>perl-wln-e/\x{1ed7}/并打印;“blah.txt


但它没有把它捡起来。如果文件中有一个类似“a”(unicode十六进制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
(大写字母“o”表示“输出”)相当于在脚本开始之前添加以下内容:

binmode(STDOUT, ":utf8")
类似地,
-CI
相当于:

binmode(STDIN, ":utf8")

但在你的情况下,你没有使用标准输入法。相反,
-n
在代码周围环绕一个循环,用于打开命令行上列出的每个文件。因此,您可以改为使用
-Ci
':utf8'
I/O层添加到Perl为输入打开的每个文件中。您可以将
-Ci
-CO
组合为:
-CiO

谢谢,是的,这很有效
perl-wln-e/\x{e1}\x{bb}\x{97}/并打印;“blah.txt
@barlop,通常,最好对输入进行解码,对输出进行编码:
perl-CSD-wlne“如果打印,请打印”blah.txt
您可能还必须将代码页更改为65001才能正确输出。我的CMD使用代码页437,所以输出看起来像这样╗ù
@HåkonHæchcp 65001和支持字符的字体,如courier new。我把cmd的特质放在一边!您是否已指示perl您有UTF8格式的输入文件?您可以通过运行
perl-n-E“say printf'%vX',$"blah.txt
来显示perl实际读取的字符代码。检查输出是否匹配
\x{1ed7}
。您可能还需要检查CMD用于输出的代码页,并在输入文件句柄上添加UTF-8 IO层(例如
perl-Ci…
)和正确的输出IOlayer@HåkonHægland谢谢。如果我使用
xxd-p blah.txt
来显示其中的十六进制,那么我会得到
efbbbfe1bb97
。efbbbf是一种utf-8 bom。e1bb97是字符的utf-8编码。你知道为什么如果我说printf“%vX”,它会输出EF.BB.BF.E1.BB.971,也就是说,它最后会输出一个1吗?类似地,如果我有一个ascii文件,其中只有字母“z”(7a为十六进制),我使用xxd-PA.txt,它会显示7a。但是perl的那行代码是7A1(也就是说,它在末尾加了一个1)@barlop您如何运行
xxd
?在CMD提示符中,我得到
'xxd'不被识别为内部或外部命令
@HåkonHægland A)它随cygwin
C:\cygwin64\bin\xxd.exe
C:\cygwin\bin\xxd.exe
B)而来(不太为人所知!)它自VIM 7以来就随VIM而来<代码>C:\ProgramFiles(x86)\Vim\vim74\xxd.exe这里的
\Vim\vim82\xxd.exe
谢谢。因此,当阅读时告诉它您正在以UTF-8的形式阅读它,那么您用\x指定的东西就是UTF-32或UTF-16代码。。但是,如果不告诉它您正在读取UTF-8,那么您指定的字节本质上是UTF-8?!如果把输出放在一边,只看它是如何读取的,那么当我执行
perl-n-Ci-E“说printf'%vX',$”blah.txt时,也就是说。。。。行来显示它正在读取的内容。。你是我的utf-8文件。小写字母i显示FEFF.1ED71(一个utf-16的东西,因为它的开头是一个utf-16 BOM)。大写字母I表示utf-8。因此,无论哪种方式,它似乎都能够毫无困惑地阅读它。而且,即使只是输入也可能涉及转换,例如使用小写字母i.@barlop Windows程序喜欢将BOM添加到utf-8编码的文件中。@barlop使用\x指定的东西是utf-32或utf-16代码。。。不,这是一个Unicode码点。Perl在内部使用utf-8,但这对用户来说是透明的。当源数据转换为内部格式时,您只需告诉Perl它使用的是什么编码。@Shawn好的,谢谢,我看到代码点与编码无关。就像一个由三部分组成的系统。代码点、编码和标志符号。