【问题标题】:Converting a UTF-8 greek letters to ASCII using ASCII//IGNORE//TRANSLIT使用 ASCII//IGNORE//TRANSLIT 将 UTF-8 希腊字母转换为 ASCII
【发布时间】:2019-08-09 10:31:02
【问题描述】:

我正在使用 Linux 终端

echo -n "ΒΓΔΕΖΗΘΙΚΛΜΝΞΠΡΣΤΥΦΧΨΩ" | iconv -f utf-8 -t ASCII//IGNORE//TRANSLIT

但错误:非法序列。

预期结果:诸如 Α=A、Γ=G、Δ=D、Ε=E、Λ=L 等。

PS:similar to PHP's problem here 但终端不接受 utf8。

【问题讨论】:

    标签: iconv


    【解决方案1】:

    首先应该是echo -n "ΒΓΔΕΖΗΘΙΚΛΜΝΞΠΡΣΤΥΦΧΨΩ"|iconv -f UTF-8 -t ASCII//TRANSLIT。注意大写的 UTF-8,没有 IGNORE。

    其次,直到最近,glibc 中还缺少一个希腊音译表。 (iconv 是 glibc 的一部分)[1]

    如果该错误仍然影响您,应该有 ???????????????作为输出给出,但没有错误。

    无论如何它已针对 2020-02-01 [2] 发布的 glibc 2.31 [2] 修复

    如果您在新的 glibc 进入您的发行版之前确实需要这个,您可以修补 glibc/locale/C-translit.h.in 并重新编译。

    [1]https://sourceware.org/bugzilla/show_bug.cgi?id=12031

    [2]https://sourceware.org/legacy-ml/libc-announce/2020/msg00001.html


    注意事项

    • UBUNTU 和许多其他 Linux 使用 glibc instead libc
    • 在 UBUNTU 上,您可以使用命令 ldd --versiondpkg -l libc6 检查版本

    【讨论】:

    • 嗨 Digo,很好的答案,谢谢。这是一个老问题,现在我有其他机器...尝试使用 UBUNTU 20 LTS:直接复制/粘贴您的 echo -n "ΒΓΔΕΖΗΘΙΚΛΜΝΞΠΡΣΤΥΦΧΨΩ"|iconv -f UTF-8 -t ASCII//TRANSLIT 会导致 "iconv: 位置 0 处的非法输入序列"
    • 您可以试试/usr/bin/iconv -f UTF-8 -t ASCII//TRANSLIT <<< "ΒΓΔΕΖΗΘΙΚΛΜΝΞΠΡΣΤΥΦΧΨΩ" 并检查libc 版本find /lib -iname 'libc*.so'
    • 嗨,建议的/usr/bin/iconv 命令产生了同样的错误。 find 没有结果。 /lib 中唯一的 libc 是 /lib/libc-client.so.2007e
    • 这很奇怪。然而,我不是特定操作系统如何管理其 glibc 问题的专家。因此,要真正调试它,您需要做的是找出系统上安装的 glibc 版本。另一种途径是下载最新的 glibc 源并在本地编译。有一种方法可以在不替换已安装的二进制版本的情况下对其进行测试。
    • PS:@Diego 可能与 glibc 有一些混淆?例如在 Ubuntu 18 ldd --version = "ldd (Ubuntu GLIBC 2.27-3ubuntu1.2) 2.27"。对于另一种方法(通过 gcc 编译),请参阅 this "linux check glibc" article... 但理想的情况是 inconv 自己说...如果它不说另一个错误。
    猜你喜欢
    • 2012-10-29
    • 2019-10-31
    • 2011-06-19
    • 2012-08-04
    • 2011-06-26
    • 1970-01-01
    • 2011-01-16
    • 2015-08-06
    • 1970-01-01
    相关资源
    最近更新 更多