linux iconv无法正确地从UTF-8转换为US-ASCII

lmyy7pcs  于 2023-02-15  发布在  Linux
关注(0)|答案(1)|浏览(312)

我需要消除一个大的.xml文件中的特殊字符。因此,我需要一个文件从UTF-8转换为US-ASCII。我相信我应该能够使用iconv通过以下命令来完成此操作:

iconv -f UTF-8 -t US-ASCII//TRANSLIT//IGNORE sample1.xml -o sample2.xml

下面是输入文件的几行:

  • ...从regjsparser的AST...
  • ...正在返回...的“符号”
  • ......一米一纳一克斯→一米二纳一克斯......
  • 安德烈·克鲁兹...
  • 凯特·马钱...

下面是这些代码片段的输出:

  • ...来自regjsparser的AST...(用撇号替换右侧单引号)
  • ...返回...的“symbol”(将左/右双引号替换为常规引号)
  • ... foo-bar-〉fooBar...(将向右箭头替换为破折号和大于)
  • ... Andr?Cruz...(未能识别急性E / U+00 E9/将其替换为常规E)
  • ...... Kat March?n......(未能识别急性A / U+00 E1/将其替换为常规A)

很明显这个工具是可以工作的,因为它替换了一些字符,但是它永远不能替换重音字母。这些文件是CycloneDX生成的BOM文件,所以它们最初应该是UTF-8编码的。机器上安装的iconv来自Debian 2.31 GLIBC库。
我不知道它为什么要处理重音字符。
编辑:这是localelocale -a命令的打印输出。不确定这些值是否与此问题相关。
场所

+ locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

区域设置-a

+ locale -a
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_COLLATE to default locale: No such file or directory
C
C.UTF-8
POSIX

我很难理解这些LC值意味着什么以及它们是如何工作的。

1zmg4dgp

1zmg4dgp1#

已通过运行以下命令修复此问题

export LC_ALL="C.UTF-8"
iconv -f UTF-8 -t US-ASCII//TRANSLIT//IGNORE sample1.xml -o sample2.xml

看起来locale参数的原始值默认为en-US.UTF-8,即使它在机器上不存在。所以你需要运行locale -a来确定你有什么选项,并选择一个最适合你的需要。看起来大多数标签为xx.UTF-8的东西都可以用于翻译目的。
我了解到这个导出的值只在当前会话中应用,并且每次启动新会话时都需要重置。如果您想永久设置locale值,您需要执行以下操作:https://www.tecmint.com/set-system-locales-in-linux/

相关问题