我有一个UTF-8文件,其中包含多种语言的文本。其中很多是人们的名字。我需要将其转换为ASCII,并且我需要结果看起来尽可能体面。
有多种方法可以实现从较宽编码到较窄编码的转换。最简单的转换是将所有非ASCII字符替换为某个占位符,例如“ _”。如果我知道文件所用的语言,则还有其他可能性,例如罗马化。
Unix上可用的哪种Unix工具或编程语言库可以使我从UTF-8到ASCII的转换(尽力而为)?
大部分文本使用基于欧洲拉丁语的语言。
我有一个UTF-8文件,其中包含多种语言的文本。其中很多是人们的名字。我需要将其转换为ASCII,并且我需要结果看起来尽可能体面。
有多种方法可以实现从较宽编码到较窄编码的转换。最简单的转换是将所有非ASCII字符替换为某个占位符,例如“ _”。如果我知道文件所用的语言,则还有其他可能性,例如罗马化。
Unix上可用的哪种Unix工具或编程语言库可以使我从UTF-8到ASCII的转换(尽力而为)?
大部分文本使用基于欧洲拉丁语的语言。
Answers:
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
这将对某些事情起作用:
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确实可以,但这是一个错误。
iconv -f utf-8 -t ascii//TRANSLIT
对我来说很好 它将弯引号改为直引号。谢谢。
//TRANSLIT
也适用于其他字符集,例如iso-8859-1//TRANSLIT
。
iconv
给iconv: illegal input sequence at position 1234
我截断文件。如果它只是删除了字符并尝试再次选取该序列,那将是很好的。
我有一个UTF-8文件,其中包含多种语言的[人物姓名] [我想将其转换为有意义的ASCII码]。
您的意思是您希望能够将以下名称转换为相关人员不反对的某些ASCII字符串?
我怀疑没有自动工具可以做到这一点。个人名称可能没有或有很多拉丁语。软件无法选择文化上可接受的版本。至少并非没有该软件对所涉人员的文化有很多了解。
perl -e 'use utf8; use Text::Unidecode; print unidecode("عبد الله الثاني بسين")'
产生``bd llh lthny bn lHsyn`'',对于我的目的来说这足够好音译。
我最终将Perl与Text :: Unidecode结合使用。例:
perl -e 'use utf8; use Text::Unidecode; print unidecode("عبد الله الثاني بسين")
产生bd llh lthny bn lHsyn
,这对我来说是可以接受的结果。