如何在Mac Os x上修复iconv的奇怪问题

8

我使用的是 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

à => `a

我真的不明白为什么 iconv 在 Mac Os X 上返回这种奇怪的输出,但在 Linux 上一切都很好

有任何帮助或者方向吗?

提前感谢


你在Linux上得到了什么输出? - kch
你对 Mac 输出有什么奇怪的感觉吗?你是使用苹果提供的 Iconv,还是通过 MacPorts 安装的,或者自己编译的,还是其他方式? - kch
你好在Linux上:é => e,à => a - thomas mery
我正在使用提供的iconv或者MAMP提供的iconv。 - thomas mery
4个回答

12
问题在于Mac OSX使用另一个名为libiconv的iconv实现。大多数Linux发行版都有一个包含在libc中的iconv实现。不幸的是,libiconv将像ö、è和ñ这样的字符转换为"o、`e和~n。唯一解决此问题的方法是下载源代码并修改lib目录中的translit.h文件。找到类似以下内容的行:

2, '"', 'o',

并将其替换为以下内容之一:

1, 'o',

我在谷歌上花了几个小时尝试找出解决这个问题的答案,最终决定下载源代码并进行处理。希望这能帮助其他人!


1
我发现一种适合我的需求的解决方案(澄清一下:一个脚本获取一个字符串并将其转换为“永久链接”URL)。
我的解决方案是将 iconv 输出导入到 sed 过滤器中:
echo á é ç this is a test | iconv -f utf8 -t ascii//TRANSLIT | sed 's/[^a-zA-Z 0-9]//g'

以上在OS X Yosemite中的结果为:

a e c this is a test

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


1
这里是不同标准库的比较 http://www.etalabs.net/compare_libcs.html 如您所见,只有当iconv库基于glibc时,转换会正确工作。 - gadelat

0

我猜测在你的 Linux 机器上,地区设置不同……据我所知,iconv 使用当前的地区来转换 UTF-X,而默认情况下,MacOS 的地区设置为 "C",不能处理重音和语言特定的字符……也许在运行 iconv 之前尝试执行以下操作:

setLocale( LC_ALL, "en_EN");

|K<


你好谢谢你但是这似乎不是问题所在,因为我已经更改了语言环境,但它并没有改变任何东西。或者我不知道如何实际更改语言环境,我正在我的.bash_profile中进行以下操作:export LC_ALL=fr_FR.UTF-8运行locale返回:LANG= LC_COLLATE="fr_FR.UTF-8" LC_CTYPE="fr_FR.UTF-8" LC_MESSAGES="fr_FR.UTF-8" LC_MONETARY="fr_FR.UTF-8" LC_NUMERIC="fr_FR.UTF-8" LC_TIME="fr_FR.UTF-8" LC_ALL="fr_FR.UTF-8"希望这有助于找到答案。 - thomas mery

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接