在使用unicode字符(在Ubuntu bash中)时,这不起作用:
$ perl -pC -e's/[à]/a/gu' <<< 'à'
à
$ perl -pC -e's/[b]/a/gu' <<< 'b'
a
尽管PCRE似乎支持它(至少根据regex101)。
我做错了什么?我在perl命令中遗漏了一些标志吗?
这在javascript中“只是工作”,所以如果我能在命令行中想出一个简单的一行程序,我会使用node...但是我仍然想知道为什么Perl命令不工作。
对于上下文:
我尝试使用/[àâáãä]/a/g
、/[òôóõö]/o/g
等替换来关联字典文件(即删除单词列表的重音等),这样我就可以使用它来使拼写检查对重音不敏感(例如在IntelliJ Idea中)。
基本上,以下是制作“附加”额外词典的步骤:
1.下载该语言的.dic文件(所有单词的列表)
1.使用grep过滤包含非ascii/可替换字符的单词
1.连续使用正则表达式替换使单词不区分重音
1.在IDE中导入附加的.dic文件(以及标准语言词典)
4条答案
按热度按时间ih99xse11#
一种实用的方法是使用Text::Unidecode
打印
a
。模块将Unicode文本转换为纯ASCII。另一种方法:使用Unicode::Normalize分解字符(“规范化”),以便字符及其diacritical marks(组合重音)被分离成它们自己的码点,同时它们仍然形成有效的字形,然后使用简单的正则表达式删除变音符号(
\p{NonspacingMark}
或\p{Mn}
)。这两种方式都会有例外和边缘情况,但我认为它可能只是做你需要的。
对于包含特定(文字)字符的代码,需要通过utf8 pragma和
use utf8;
或命令行标志-Mutf8
告诉Perl程序源代码是UTF-8yc0p9oo02#
您需要添加
-Mutf8
来告诉Perl程序是使用UTF-8而不是ASCII编码的。osh3o9ms3#
简短的答案是将
-Mutf8
添加到命令行。如果你不确定Perl是如何解释你在命令行上写的内容的,你可以用核心的
B::perlstring()
函数让它把它吐回给你,或者用B::Deparse
来背离整个脚本。这将很快说明你的问题。(在这里把'à'字符括在括号里没有任何作用。)第一个
看到你的替代品中有两个字符了吗?
然后,您可以立即看到
use utf8
如何修复您的问题。第一次
您可以使用
perlstring()
来确保Perl正在接收您认为的输入。第一个
您可以看到,如果没有
-C
,Perl将接收2个分解的字符。根据具体情况,Perl会将字符转储为八进制代码(
\340
)或十六进制代码(\xE0
)。注意,您总是可以将命令行中的原始unicode字符替换为转义代码版本。这是一个很好的方法,可以明确否则会产生歧义的字符。如果你不想记住UTF8模式,你可以把这些选项放在
PERL5OPT
环境变量中,或者创建一个shell别名。第一个
或者作为shell别名。
有关如何使用Swiss Army Chainsaw命令行的更多信息,请参见perlrun。
另请参阅B::Deparse。
4sup72z84#
下面是我实现步骤2和3的方法。
例如,这可以用在these字典中(尽管我没有在每种语言上测试它)。
asciify-dic
示例用法: