如何用ASCII替换Unicode字符

10

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

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

问题是在我的Unix环境中,sed命令无法识别字符Ã。因此,我想用它的十六进制值替换它。如果我要使用C3,语法会是什么样子?

我将使用此命令模板来替换其他字符,例如:

sed -i 's/©/ /g'


你的意思是像这样吗?http://stackoverflow.com/questions/22450563/sed-matching-unicode-blocks-with - Leo
1
你的终端使用哪种字符集?输入文本使用什么编码?在UTF-8中,Ã是0xC3 0x83,而字符0x83是ISO 8859-1中的控制代码,这可能会导致问题。我想你不能只在系统上设置LANG=en_US.UTF-8 - yellowantphil
"sed"可以完成这项工作。请查看我的答案。 - ajaaskel
4个回答

18

"sed"命令中可以使用十六进制值。

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

好的,这个字符是由两个字节组合成的 "c3 83"。让我们将其替换为单个字节 "A":


Ok,那个字符是由两个字节组合成的 "c3 83"。让我们用单个字节 "A" 替换它:
echo "Ã" |sed 's/\xc3\x83/A/g'
A

说明:\x表示对于"sed"来说,后面跟着一个十六进制代码。


通常我会用 <<< 来写这些,但是管道符号对于普通读者更容易理解正在发生什么。 - ajaaskel
你的意思是什么,“用<<<写它们”? - isomorphismes
1
如果你想知道十六进制转储中的 0a 是什么,那就是来自 echo 命令的 LF 字符。这就是为什么它被忽略了。或者你可以使用 echo -n 命令来不打印 LF - wisbucky
我必须通过所有三个部分(而不是两个)才能成功替换“e2 80 af”字符。这可以成为一个普遍规则吗? - ka3ak

9

You can use iconv:

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

3
你是指GNU iconv。并非所有版本的iconv都支持音译。 - user539810
1
可以尝试一下。 - midori
谢谢,但我将使用此作为模板创建其他sed命令,以将某些字符替换为空格,例如: sed -i 's/©/ /g' - Sandeep Johal

8

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


4

还有来自ICUuconv

示例:

  • uconv -x "::NFD; [:非间隔标记:] > ; ::NFC;":用于去除重音符号
  • uconv -x "::Latin; ::Latin-ASCII;":用于拉丁/ ASCII 音译
  • uconv -x "::Latin; ::Latin-ASCII; ([^\x00-\x7F]) > ;":用于拉丁/ ASCII 音译并删除剩余的码点>0x7F
  • ...

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


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