我可以在vim中这样做:
:%s/\%u2013/-/g
如何在Perl中执行等效操作?我认为这会做到但它似乎没有起作用:
perl -i -pe 's/\x{2013}/-/g' my.dat
答案 0 :(得分:36)
对于通用解决方案,Text::Unidecode将几乎任何被抛出的内容转换为纯US-ASCII。
所以在你的情况下,这将起作用:
perl -C -MText::Unidecode -n -i -e'print unidecode( $_)' unicode_text.txt
-C用于确保输入读取为utf8
它将此转换为:
l'été est arrivé à peine après aôut
¿España es un paìs muy lindo?
some special chars: » « ® ¼ ¶ – – — Ṉ
Some greek letters: β ÷ Θ ¬ the α and ω (or is it Ω?)
hiragana? みせる です
Здравствуйте
السلام عليكم
进入这个:
l'ete est arrive a peine apres aout
?Espana es un pais muy lindo?
some special chars: >> << (r) 1/4 P - - -- N
Some greek letters: b / Th ! the a and o (or is it O?)
hiragana? miseru desu
Zdravstvuitie
lslm `lykm
最后一个显示了模块的限制,它无法推断出元音并从原始的阿拉伯语中获得as-salaamu`alaykum。我认为这仍然很好
答案 1 :(得分:4)
这对我有用:
perl -C1 -i -pe 's/–/-/g' my.dat
请注意,第一个栏是\ x {2013}字符本身。
答案 2 :(得分:2)
perl -w -e "
use open ':encoding(utf8)';
use open ':std';
while (<>)
{
s/\x{2013}/-/g;
print;
}
"
我还没有最小化。请参阅“使用公开”声明中的perldoc。
从我的(有限)实验来看,' - p'选项无法识别'use open'指令。 您可以使用'qw()'来引用单词:
perl -w -e "
use open qw( :encoding(utf8) :std );
while (<>)
{
s/\x{2013}/-/g;
print;
}
我不知道'-p'是否服从'使用开放'是一个错误或设计特征。
答案 3 :(得分:0)
或者,您可以只指定要替换的字符的UTF-8编码:
perl -i -pe 's/\xE2\x80\x93/-/g' my.dat
此处十六进制值E28093是十六进制值2013的UTF-8编码。您可以在线找到各种工具来获取字符的UTF-8编码,或者您可以在十六进制编辑器中查看my.dat。 / p>