将UTF-8文件转换为ASCII(尽力而为)


23

我有一个UTF-8文件,其中包含多种语言的文本。其中很多是人们的名字。我需要将其转换为ASCII,并且我需要结果看起来尽可能体面。

有多种方法可以实现从较宽编码到较窄编码的转换。最简单的转换是将所有非ASCII字符替换为某个占位符,例如“ _”。如果我知道文件所用的语言,则还有其他可能性,例如罗马化。

Unix上可用的哪种Unix工具或编程语言库可以使我从UTF-8到ASCII的转换(尽力而为)?

大部分文本使用基于欧洲拉丁语的语言。


1
你知道哪种语言开始吗?例如,如何处理变音符号的不可用性(如ö一样)有所不同。在德语中,您总是可以写“ oe”,但是例如在荷兰语中,最好用破折号后加上破译的字符来更好地描述变音符号的可用性(在那里,“ oe”将是完全不同的diphthong)
Anthon

您如何定义“尽可能体面”?真正的困难在于定义映射。相比之下,编程任务微不足道。实际使用的映射变化很大,并且可能以两种方式特定于语言:它们取决于文本的语言和读者的假定语言(特别是在罗马化方面)。
Jukka K. Korpela 2014年

@ JukkaK.Korpela当然是由那些我所要求的创建“ Unix上可用的Unix工具或编程语言库”的人定义的。如果我能得到的最好的结果就是用下划线替换所有非ASCII代码,那么我无能为力了。除了编写自己的工具,我不会。我想Unix @ SO可能不是这个问题的最佳选择……
user7610 2014年

1
@ user7610除iconv和外tr,还有Unidecode。我不熟悉它,但是如果可以使用Python,它可能会做您想要的。
yellowantphil 2014年

1
@yellowantphil或JavaScript / node中的node-unidecode,C♯中的UnidecodeSharp或Perl中的Text :: Unidecode,恰好是此名称的第一名。我想还有其他版本。
user7610 2014年

Answers:


11
konwert utf8-ascii

它将尽最大努力进行转换,具体取决于转换表。如果您大致了解输入语言,则可以使用特定语言的过滤器,以获得更好的结果,例如

konwert utf8-xmetodo

是世界语到x-metodo表示的转换,

konwert UTF8-tex

将尝试做TeX变音符号表示,有特定于语言的参数:

konwert UTF8-ascii/de

会将“ä”音译为“ ae”(德语习惯),而不是普通的“ a”

konwert UTF8-ascii/rosyjski

将使用波兰语规则而不是“英语式”规则来音译俄语,等等。


这是konwert网站的最新位置吗?它包装在任何地方吗?github.com/taw/konwert/tree/master/konwert-1.8
Nemo

25

这将对某些事情起作用:

iconv -f utf-8 -t ascii//TRANSLIT

echo ĥéĺłœ π | iconv -f utf-8 -t ascii//TRANSLIT返回helloe ?。任何iconv不知道如何转换的字符都将替换为问号。

iconv是POSIX,但我不知道所有系统是否都具有该TRANSLIT选项。它在Linux上对我有效。另外,该IGNORE选项将静默丢弃目标字符集中无法表示的字符(请参阅参考资料man iconv_open)。

下一个但与POSIX兼容的选项是使用tr。此命令用问号替换所有非ASCII代码点。它一次读取一个字节的UTF-8文本。取决于是否使用组合重音符号或预组合字符对“É”进行替换,“?”可以用E?或代替?

echo café äëïöü | tr -d '\200-\277' | tr '\300-\377' '[?*]'

该示例caf? ?????使用预设的字符返回。


tr并不意味着一次工作一个字节。GNU tr确实可以,但这是一个错误。
斯特凡Chazelas

3
iconv -f utf-8 -t ascii//TRANSLIT对我来说很好 它将弯引号改为直引号。谢谢。
Panic

请注意,iconv会阻塞重音符号,例如拼音。
sventechie '16

请注意,它//TRANSLIT也适用于其他字符集,例如iso-8859-1//TRANSLIT
Skippy le Grand Gourou

iconviconv: illegal input sequence at position 1234我截断文件。如果它只是删除了字符并尝试再次选取该序列,那将是很好的。
jozxyqk


2

我有一个UTF-8文件,其中包含多种语言的[人物姓名] [我想将其转换为有意义的ASCII码]。

您的意思是您希望能够将以下名称转换为相关人员不反对的某些ASCII字符串?

  • ஐயங்கார்
  • عبداللهالثانيبنالحسين

我怀疑没有自动工具可以做到这一点。个人名称可能没有或有很多拉丁语。软件无法选择文化上可接受的版本。至少并非没有该软件对所涉人员的文化有很多了解。

另请参阅/programming//a/1398403/477035


2
perl -e 'use utf8; use Text::Unidecode; print unidecode("عبد الله الثاني بسين")'产生``bd llh lthny bn lHsyn`'',对于我的目的来说这足够好音译。
user7610

4
@ user7610:很好,但约旦国王阿卜杜拉二世可能不同意。万一重要的人向首席执行官抱怨,我会准备做一个解释:-)
RedGrittyBrick

2

我最终将Perl与Text :: Unidecode结合使用。例:

perl -e 'use utf8; use Text::Unidecode; print unidecode("عبد الله الثاني بسين")

产生bd llh lthny bn lHsyn,这对我来说是可以接受的结果。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.