【问题标题】:How to fix weird issue with iconv on Mac Os x如何解决 Mac Os x 上 iconv 的奇怪问题
【发布时间】:2009-04-30 09:55:50
【问题描述】:

我使用的是 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 X 上,例如:

è => 'e

à => `a

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

有什么帮助吗?还是方向?

提前致谢

【问题讨论】:

  • 你在 linux 上得到的输出是什么?
  • 你觉得 mac 输出有什么奇怪的地方?你是用苹果提供的iconv还是通过macports安装,自己编译,还有什么?
  • Linux 上的你好:é => e, à => a
  • 我正在使用提供的 iconv 或 MAMP 提供的 iconv

标签: macos shell iconv


【解决方案1】:

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

2, '"', 'o',

并将它们替换为以下内容:

1, 'o',

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

【讨论】:

    【解决方案2】:

    我找到了一个适合我需要的解决方法(只是为了澄清一下:脚本获取一个字符串并将其转换为“永久链接”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
    

    【讨论】:

      【解决方案3】:

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

      setLocale( LC_ALL, "en_EN");
      

      |K

      【讨论】:

      • 您好,谢谢,但这似乎不是问题,因为我已经更改了语言环境,但它没有改变任何东西。或者我不知道如何实际更改语言环境我在我的 .bash_profile 导出 LC_ALL=fr_FR.UTF-8 中执行此操作并运行语言环境返回: 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" 希望这个帮助找到答案
      【解决方案4】:

      另一种选择是使用由brew install unac 安装的unaccent

      $ 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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-16
      • 2012-08-15
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      • 2021-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多