我有一个 UTF-8 格式的文件,其中包含多种语言的文本。很多都是人的名字。我需要将其转换为 ASCII,并且需要结果看起来尽可能合适。
有多种方法可以将较宽的编码转换为较窄的编码。最简单的转换是用一些占位符替换所有非 ASCII 字符,例如“_”。如果我知道文件所用的语言,则还有其他可能性,例如罗马化。
Unix 上可用的 Unix 工具或编程语言库可以为我提供从 UTF-8 到 ASCII 的体面(尽力)转换?
大部分文本都是欧洲拉丁语言。
答案1
这对某些事情有用:
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? ?????
使用预组合字符返回 。
答案2
konwert utf8-ascii
它将根据转换表进行尽力而为的转换。如果您大致了解输入语言,则可以使用特定于语言的过滤器提供更好的结果,例如
konwert utf8-xmetodo
将世界语转换为 x-metodo 表示形式,
konwert UTF8-tex
将尝试进行变音符号的 TeX 表示,有语言特定的参数:
konwert UTF8-ascii/de
会将“ä”音译为“ae”(德语的习惯),而不是简单的“a”
konwert UTF8-ascii/rosyjski
将使用波兰规则来音译俄语,而不是“类似英语”的规则,等等......
答案3
尝试uni2ascii -B input.txt >output.txt
答案4
我有一个 UTF-8 格式的文件,其中包含多种语言的[人名][我想将其转换为有意义的 ASCII 格式]。
您的意思是您希望能够将以下名称转换为相关人员不会反对的某个 ASCII 字符串?
- ஸ்றீனிவாஸராமானுஜன்ஐயங்கார்
- 奥巴德·阿德·阿德·阿德
我怀疑没有自动化工具可以做到这一点。人名可以没有拉丁化,也可以有很多拉丁化。软件无法选择文化上可接受的版本。至少在软件不了解相关人员的文化的情况下是这样。