从 ANSI 转换为 UTF-8 时 iconv 失败

从 ANSI 转换为 UTF-8 时 iconv 失败

我使用 Shell 脚本将文件的编码从 ANSI 转换为 UTF-8。我使用以下命令:

iconv -f "windows-1252" -t "UTF-8" $csvname -o $mobcsvname

这里,csvname 和 mobcsvname 是变量,用于存储输入和输出文件名。脚本运行时没有任何错误,但输出文件保持与原始文件相同的编码,即 ANSI。

我究竟做错了什么?

答案1

UTF-8 具有可变长度的字符。有些字符是一个字节,有些字符是两个字节等等。所有 ASCII 字符(最初为 7 位,范围从 0 到 127)都用一个字节编码。这意味着包含

你好世界

几乎任何西方编码已经是有效的 UTF-8。即使你尝试转换它,输出将是相同iconv 将不会添加字节顺序标记。

当然,如果文件包含

摩托罗拉

它会不是仍为有效的 UTF-8。

默认情况下,Notepad++ 非常悲观:除非它在文件开头遇到字节顺序标记或者任何看起来像 UTF-8 的字节序列,否则它会将该文件视为非 UTF-8。

您可以在“设置”→“首选项”→“新建文档”→“编码”下更改此行为。选中“应用于打开的 ANSI 文件”。

要检查文件是否确实包含任何会发生变化的字符,请使用以下 Python 3 脚本:

#!/bin/env python3

with open("INSERT FILE NAME HERE", "rb") as f:
   while 1:
      byte_s = f.read(1)
      if not byte_s:
         break
      byte = byte_s[0]
      if byte > 127:
         print("Got extended ASCII character")

它将逐字节读取文件并检查是否有任何字节大于 127。如果没有,则再次:您的文件已经是有效的 UTF-8。

相关内容