Encoding 用UTF-8编码替换CP850安全吗

Encoding 用UTF-8编码替换CP850安全吗,encoding,utf-8,Encoding,Utf 8,我有一个老项目读取CP850编码的文件。但它处理重音字符时出错(例如,Montréal变为MontrÚal)。 我想用UTF-8替换CP850。问题是: 安全吗?换句话说,我们可以假设UTF-8是一个超集,并且编码方式与CP850编码字符相同吗 谢谢 我尝试了hexdump,下面是我的csv文件的示例,是UTF-8吗 000000d0 76 20 64 65 20 4d 61 72 6c 6f 77 65 2c 2c 4d 6f |v de Marlowe,,Mo| 000000e0 6

我有一个老项目读取CP850编码的文件。但它处理重音字符时出错(例如,Montréal变为MontrÚal)。 我想用UTF-8替换CP850。问题是:

安全吗?换句话说,我们可以假设UTF-8是一个超集,并且编码方式与CP850编码字符相同吗

谢谢

我尝试了hexdump,下面是我的csv文件的示例,是UTF-8吗

000000d0  76 20 64 65 20 4d 61 72  6c 6f 77 65 2c 2c 4d 6f  |v de Marlowe,,Mo|
000000e0  6e 74 72 c3 a9 61 6c 2c  51 43 2c 48 34 41 20 20  |ntr..al,QC,H4A  |

如果您所说的超集是指UTF-8是否包含CP850的所有字符,那么就简单地说是的,因为UTF-8可以使用可变长度编码(1–4字节)对所有有效的Unicode代码点进行编码

如果您的意思是字符编码方式相同,那么正如您所看到的,情况并非如此,因为é(U+00E9)在CP850中编码为
82
,在UTF-8中编码为
C3 A9

我看不到字符集/代码页将Ú编码为
82
,但在CP850中,Ú编码为
E9
,CP850是Ú的ISO-8859-1表示形式,因此可能您的转换方式错误(即,您正在将文件从ISO-8859-1转换为CP850,并且您希望从CP850转换为UTF-8)

下面是一个使用
hd
iconv
的示例:

hd test.cp850.txt
00000000  4d 6f 6e 74 72 82 61 6c                           |Montr.al|
00000008

iconv --from cp850 --to utf8 test.cp850.txt > test.utf8.txt

hd test.utf8.txt
00000000  4d 6f 6e 74 72 c3 a9 61  6c                       |Montr..al|
00000009

这正是我想要的,谢谢。你有解决办法吗?我有一个CSV文件,没有编码信息。我们将如何选择使用哪种编码来读取文件?我有CSV文件,并且使用了CP850编码。但其中一个CSV文件未能正确读取。我们如何选择另一种超级编码来读取文件,并且不会影响其他已经使用CP850正确读取的文件?如果您假设它是CP850,并且您得到的是MontrÚal,我会假设该文件是CP1252或ISO-8859-1。我知道CP1252编码与CP850不同,即使它是一个超级集。ISO-8859-1怎么样?它可以用来取代CP850而没有副作用吗?你可以看到字节
c3a9
的é,所以它肯定是UTF-8编码。为了回答您最初的问题,UTF-8肯定是CP850的超集,因为UTF-8可以表示所有Unicode字符。但它不是一个二进制超集,因为相同的字符在每个字符集中由不同的字节表示。“我有一个CSV文件,没有编码信息。”:那么你就丢失了数据。如果没有这些基本元数据,文本文件只包含字节。字符编码的使用是作者和读者之间的协议。您只能在更改协议后更改编码。