我使用 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。