如何在Perl中用ASCII替换Unicode字符?

时间:2010-02-22 06:33:31

标签: perl unicode utf-8

我可以在vim中这样做:

:%s/\%u2013/-/g

如何在Perl中执行等效操作?我认为这会做到但它似乎没有起作用:

perl -i -pe 's/\x{2013}/-/g' my.dat

4 个答案:

答案 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)

嗯,有点难熬。这似乎是这样做的(MacOS X 10.6.2上的Perl 5.10.0):

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>