如何解决Mac OS x上iconv的奇怪问题

时间:2009-04-30 09:55:50

标签: macos shell iconv

我在 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上一切都很好

任何帮助?还是方向?

提前致谢

4 个答案:

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