gpt4 book ai didi

c# - 在 C# 中从 UTF-8 转换

转载 作者:行者123 更新时间:2023-11-30 14:05:42 27 4
gpt4 key购买 nike

我有一个 C++ 库,它生成一些使用 UTF-8 编码的字符串。该库由能够使用 ddlexport 访问字符串的 C# 库使用。

C# 代码创建一个 StringBuilder,C++ 填充此对象中的字符。但是非 ASCII 的字符是不可能被正确检索的。

例如:字符串“ö”使用代码 195 和 182 的两个字节进行编码,对应于 UTF-8 中该字符的编码 (0xC3 0xB6)。如果我在 C# 中创建相同的字符串,它会使用一个字节和代码 246 进行编码,这也与 Windows 中该字符的编码相对应。

我已尝试使用“Encoding.Convert”方法,但无法将原始字符串转换为正确的编码字符串。

我试图用这段代码重现这个问题:

StringBuilder str1 = new StringBuilder(2);
str1.Append("ö");
Console.WriteLine(str1.ToString());

StringBuilder str2 = new StringBuilder(2);
str2.Append((char)246);
Console.WriteLine(str2.ToString());

// This is the StringBuilder that I get from the C++ code
StringBuilder str3 = new StringBuilder(2);
str3.Append((char)195);
str3.Append((char)182);
Console.WriteLine(str3.ToString());

byte[] bytes = Encoding.Convert(Encoding.UTF8, Encoding.ASCII, Encoding.UTF8.GetBytes(str3.ToString()));
Console.WriteLine(Encoding.ASCII.GetString(bytes));

这个程序的输出是:

ö
ö
ö
?? // bytes is 63, 63

如何将 Windows 代码 246 中的 UTF-8 代码 0xC3 0xB6(或 195 182)转换为可能?

编辑:

我已经通过 Marc Gravell 的回答解决了这个问题,只是将我的 StringBuilder 转换为字节数组。但我想知道我用来在 C++ 和 C# 之间传递字符串的方法是否错误:

C++代码:

 __declspec(dllexport)void Competitor_getDescription(ICompetitor *competitor, char *buf) {
strcpy(buf, competitor->getDescription().c_str());
}

C#:

 [DllImport(DLL)]
private static extern void Competitor_getDescription(IntPtr obj, StringBuilder str);
public String GetDescription()
{
StringBuilder str = new StringBuilder(50);
Competitor_getDescription(this.ptr, str);
return str.ToString();
}

最佳答案

你写:

the string "ö" is encoded using two bytes with the codes 195 and 182

但是你的代码说:

str3.Append((char)195);
str3.Append((char)182);

这两个概念完全不同。您的 C# 添加了两个代码点,而不是两个字节。这些代码点只有在被视为 unicode 时才有意义 - 你不能问 bytes 是什么,除非我们定义了特定的编码,但就 UTF-8 而言,它们对应于字节序列 0xC3分别为 0x83 和 0xC2 0xB6。

如果你想解码 UTF-8,那么:解码 UTF-8:

byte[] bytes = new byte[] { 195, 182 };
string s = Encoding.UTF8.GetString(bytes); // ö, code-point 246

关于c# - 在 C# 中从 UTF-8 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54550721/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com