1

我是ÐиÑилл ÐаÑанник从 C++ 组件中获取的,我需要对其进行解码。该字符串始终采用 UTF-8 编码。经过多次 RnD,我想出了以下解码方法。

String text = Encoding.UTF8
                      .GetString(Encoding.GetEncoding("iso-8859-1")
                      .GetBytes("ÐиÑилл ÐаÑанник"));

但这不是硬编码"iso-8859-1"吗,如果出现西里尔字符以外的字符会怎样。所以我想要一个通用的方法来解码一个 UTF-8 字符串。

提前致谢。

4

2 回答 2

3

当您键入文本时,计算机只能看到字节。在这种情况下,当您在 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,并被邮政员工解码。

于 2013-04-18T13:17:56.043 回答
0

字符源只能以一种编码传输,这意味着它可以是 iso-8859-1 或其他编码,但不能同时使用两者(这意味着您可能首先对逆向工程西里尔字母有误)

您能否发布您输入的预期 UTF-8 输出?

于 2013-04-18T12:56:18.527 回答