8

我在Mac Os X 10.5 上(但我在 10.4 上重现了这个问题)

我正在尝试使用iconvUTF-8 文件转换为 ASCII

utf-8 文件包含像“éàç”这样的字符

我希望将重音字符变成最接近的 ascii 等价物

所以

我的命令是这样的:

iconv -f UTF-8 -t ASCII//TRANSLIT//IGNORE myutf8file.txt

在 Linux 机器上运行良好

但在我本地的 Mac Os XI 上,例如:

è => 'e

à => `一个

我真的不明白为什么 iconv 在 mac os x 上返回这个奇怪的输出但在 linux 上一切都很好

有什么帮助吗?或方向?

提前致谢

4

4 回答 4

12

问题在于 Mac OSX 使用了另一个名为 libiconv 的 iconv 实现。大多数 Linux 发行版都有一个 iconv 的实现,它是 libc 的一部分。不幸的是,libiconv 将 ö、è 和 ñ 等字符音译为“o、`e 和 ~n。解决此问题的唯一方法是下载源代码并修改 lib 目录中的 translit.h 文件。查找如下所示的行:

2, '"', 'o',

并用这样的东西替换它们:

1, 'o',

我在谷歌上花了几个小时试图找出这个问题的答案,最后决定下载源代码并破解它。希望这对某人有帮助!

于 2010-03-27T00:56:23.217 回答
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
于 2015-06-14T18:00:39.537 回答
0

我的猜测是,在您的 linux 机器上,语言环境设置不同......据我所知,iconv 使用当前语言环境来翻译 UTF-X,默认情况下,macos 将语言环境设置为“C”(显然) 不处理重音和特定语言的字符......也许在运行 iconv 之前尝试这样做:

setLocale( LC_ALL, "en_EN");

|K<

于 2009-04-30T14:44:29.573 回答
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.

于 2016-08-12T19:26:51.840 回答