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

标签 c#

我有一个 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/

相关文章:

C# ResXResourceSet 未按照官方示例进行解析

c# - 如何通过 HttpPostedFileBase 与 ViewModel 一起发送上传的文件?

带示例代码的 C# 分步教程

c# - 在运行时从数据库创建类

c# - 我如何在我的 .net 项目中使用谷歌文档

c# - 如何在WPF中捏

c# - 如何使用 MTP 从 USB 设备上传和下载数据(设备不是相机)

c# - 局部变量上的冲突线程

C# SendMessage 点击按钮

c# - Azure Function C# 中的单元测试