当您键入文本时,计算机只能看到字节。在这种情况下,当您在 C++ 程序中键入西里尔字符时,计算机会将每个字符转换为其对应的 UTF-8 编码字符。
string typedByUser = "Привет мир!";
byte[] input = Encoding.UTF8.GetBytes(typedByUser);
然后你的 C++ 程序出现,查看字节并认为它是 ISO-8859-1 编码的。
string cppString = Encoding.GetEncoding("iso-8859-1").GetString(input);
// ÐÑÐ¸Ð²ÐµÑ Ð¼Ð¸Ñ!
你对此无能为力。然后你得到错误编码的字符串,并且不得不假设它是错误的 ISO-8859-1 编码的 UTF-8。这个假设被证明是正确的,但您无法以任何方式确定这一点。
byte[] decoded = Encoding.GetEncoding("iso-8859-1").GetBytes(cppString);
string text = Encoding.UTF8.GetString(decoded);
// Привет мир!
请注意,ISO-8859-1 是 ISO 西欧编码,与原始输入是西里尔文这一事实无关。例如,如果输入是日文 UTF-8 编码,您的 C++ 程序仍会将其解释为 ISO-8859-1:
string typedByUser = "こんにちは、世界!";
byte[] input = Encoding.UTF8.GetBytes(typedByUser);
string cppString = Encoding.GetEncoding("iso-8859-1").GetString(input);
// ããã«ã¡ã¯ãä¸çï¼
byte[] decoded = Encoding.GetEncoding("iso-8859-1").GetBytes(cppString);
string text = Encoding.UTF8.GetString(decoded);
// こんにちは、世界!
C++ 程序将始终将输入解释为 ISO-8859-1,无论它是西里尔文、日文还是纯英文。所以这个假设总是正确的。
但是,您还有一个额外的假设,即原始输入是 UTF-8 编码的。我不确定这是否总是正确的。它可能取决于程序、它使用的输入机制以及操作系统使用的默认编码。例如,C++ 程序假设原始输入是 ISO-8859-1 编码的,这是错误的。
顺便说一句,字符编码一直存在问题。一个很好的例子是一位法国学生给他的俄罗斯朋友的一封信,信封上的西里尔地址被错误地写为 ISO-8859-1,并被邮政员工解码。