小编Jor*_*drá的帖子

在C#中从UTF-8转换

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

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));
Run Code Online (Sandbox Code Playgroud)

该程序的输出是:

ö
ö
ö
?? // bytes is 63, 63
Run Code Online (Sandbox Code Playgroud)

如何在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());
 }
Run Code Online (Sandbox Code Playgroud)

C#:

 [DllImport(DLL)]
 private static extern …
Run Code Online (Sandbox Code Playgroud)

c#

3
推荐指数
1
解决办法
103
查看次数

标签 统计

c# ×1