我在 Mac Os X 10.5(但我在10.4上转载了这个问题)
我正在尝试使用 iconv 将 UTF-8文件转换为ASCII
utf-8文件包含'éàç'
等字符我希望重音字符变成最接近的ascii等价物
所以
我的命令是:
iconv -f UTF-8 -t ASCII // TRANSLIT // IGNORE myutf8file.txt
在Linux机器上运行良好
但是在我当地的Mac Os X上我得到了这个例子:
è=> “E
à=> `一个
我真的不明白为什么iconv在mac os x上返回这个奇怪的输出但是在linux上一切都很好
任何帮助?还是方向?
提前致谢
答案 0 :(得分:9)
问题是Mac OSX使用另一种名为libiconv的iconv实现。大多数Linux发行版都有iconv的实现,它是libc的一部分。不幸的是,libiconv将ö,è和ñ等字符音译为“o,`e和~n。修复此问题的唯一方法是下载源代码并修改lib目录中的translit.h文件。找到看起来像这样的行:
2,''','o',
并用以下内容替换它们:
1,'o',
我花了几个小时在谷歌上试图弄清楚这个问题的答案,最后决定下载源代码并乱用它。希望这有助于某人!
答案 1 :(得分:0)
我的猜测是,你的linux机器上的语言环境设置不同...... 据我所知,iconv使用当前的语言环境来翻译UTF-X,默认情况下,macos的语言环境设置为“C”(显然)不处理重音符号和语言特定的字符...也许尝试这样做在运行iconv之前:
setLocale( LC_ALL, "en_EN");
| K<
答案 2 :(得分:0)
我找到了一个适合我需求的解决方法(只是为了澄清:脚本获取一个字符串并将其转换为“永久链接”URL。
我的解决方法是将iconv
输出汇总到sed
过滤器:
echo á é ç this is a test | iconv -f utf8 -t ascii//TRANSLIT | sed 's/[^a-zA-Z 0-9]//g'
OS X约塞米蒂的上述结果是:
a e c this is a test
答案 3 :(得分:0)
另一种选择是使用由unaccent
安装的brew install unac
:
$ unaccent utf-8<<<é
e
unaccent
不会转换分解形式的字符(例如LATIN SMALL LETTER E
后跟COMBINING ACUTE ACCENT
),但您可以使用uconv
将字符转换为组合形式:
$ unaccent utf-8<<<$'e\u0301'
é
$ uconv -f utf-8 -t utf-8 -x NFC<<<$'e\u0301'|unaccent utf-8
e
brew install icu4c;ln -s /usr/local/opt/icu4c/bin/uconv /usr/local/bin
安装uconv
。