【问题标题】:How to replace Unicode characters with ASCII如何用 ASCII 替换 Unicode 字符
【发布时间】:2014-11-21 00:25:58
【问题描述】:

我有以下命令将 Unicode 字符替换为 ASCII 字符。

sed -i 's/Ã/A/g'

问题是我的 Unix 环境中的 sed 命令无法识别 Ã,所以我假设您将其替换为十六进制值。如果我改用C3,语法会是什么样子?

我将此命令用作其他字符的模板,我想用空格替换,例如:

sed -i 's/©/ /g'

【问题讨论】:

  • 你的意思是这样吗? stackoverflow.com/questions/22450563/…
  • 您的终端使用什么字符集?输入文本使用什么编码? UTF-8 中的 Ã 是 0xC3 0x83,而字符 0x83 是 ISO 8859-1 中的控制码,所以这可能是个问题。我想你不能只在你的系统上设置LANG=en_US.UTF-8
  • "sed" 将完成这项工作。请看我的回答。

标签: bash shell unix unicode sed


【解决方案1】:

可以在“sed”中使用十六进制值。

echo "Ã" | hexdump -C
00000000  c3 83 0a                                          |...|
00000003

好的,那个字符是两个字节的组合“c3 83”。让我们用单字节“A”替换它:

echo "Ã" |sed 's/\xc3\x83/A/g'
A

说明:\x 表示“sed”后面跟着一个十六进制代码。

【讨论】:

  • 通常我会用
  • 你是什么意思“用
  • 如果您想知道 hexdump 中的 0a 是什么,它是来自 echoLF 字符。这就是它被忽略的原因。或者您可以使用echo -n 不打印LF
  • 我必须将所有三个部分(不是两个)都传递给 sed 才能成功替换 'e2 80 af' 字符。这可以作为一般规则吗?
【解决方案2】:

尝试设置 LANG=C,然后在 Unicode 范围内运行它:
echo "hi ☠ there ☠" | LANG=C sed "s/[\x80-\xFF]//g"

【讨论】:

    【解决方案3】:

    你可以使用iconv:

    iconv -f utf-8 -t ascii//translit
    

    【讨论】:

    • 你的意思是 GNU iconv。并非所有版本的 iconv 都支持音译。
    • 可以,但他可以试一试
    • 谢谢,但我使用它作为模板来创建其他 sed 命令,这些命令将用空格替换某些字符,例如:sed -i 's/©/ /g'
    【解决方案4】:

    还有uconv,来自ICU

    例子:

    • uconv -x "::NFD; [:Nonspacing Mark:] > ; ::NFC;": 去除重音
    • uconv -x "::Latin; ::Latin-ASCII;": 用于音译拉丁/ascii
    • uconv -x "::Latin; ::Latin-ASCII; ([^\x00-\x7F]) > ;": 用于音译 latin/ascii 并删除剩余的代码点 > 0x7F
    • ...

    echo "À l'école ☠" | uconv -x "::Latin; ::Latin-ASCII; ([^\x00-\x7F]) > ;" 给:A l'ecole

    【讨论】:

      猜你喜欢
      • 2018-07-02
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      • 2016-06-20
      • 2011-06-16
      • 2018-04-19
      • 2011-04-26
      相关资源
      最近更新 更多