在C中从UTF-8转换# 我有一个C++库,它使用UTF-8生成一些字符串。该库由一个C#库使用,该库能够使用ddlexport访问字符串 < >代码创建一个StrugBuudor,C++填充了这个对象中的字符。但是,无法正确检索非ASCII字符
e、 g:字符串“ö”使用两个字节编码,代码为195和182,这与UTF-8()中该字符的编码相对应。如果我在C#中创建相同的字符串,它将使用一个字节编码,代码246也对应于Windows中该字符的编码 我尝试使用“Encoding.Convert”方法,但无法将原始字符串转换为正确的编码字符串 我试图用这段代码重现这个问题:在C中从UTF-8转换# 我有一个C++库,它使用UTF-8生成一些字符串。该库由一个C#库使用,该库能够使用ddlexport访问字符串 < >代码创建一个StrugBuudor,C++填充了这个对象中的字符。但是,无法正确检索非ASCII字符,c#,C#,e、 g:字符串“ö”使用两个字节编码,代码为195和182,这与UTF-8()中该字符的编码相对应。如果我在C#中创建相同的字符串,它将使用一个字节编码,代码246也对应于Windows中该字符的编码 我尝试使用“Encoding.Convert”方法,但无法将原始字符串转换为正确的编码字符串 我试图用这段代码重现这个问题: StringBuilder str1 = new StringBuilder(2); str1.Append("ö"); Console.WriteLine(str1.T
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++来传递字符串的方法是否错误:< /P>
< > C++代码:
__declspec(dllexport)void Competitor_getDescription(ICompetitor *competitor, char *buf) {
strcpy(buf, competitor->getDescription().c_str());
}
C#:
你写道:
字符串“ö”使用代码为195和182的两个字节进行编码
但是你的代码说:
str3.Append((char)195);
str3.Append((char)182);
这两个概念是完全不同的。您的C#添加了两个代码点,而不是两个字节。这些代码点仅在被视为unicode时才有意义-除非我们定义了特定的编码,否则无法询问字节是什么,但就UTF-8而言,它们分别对应于字节序列0xC3 0x83和0xC2 0xB6
如果要解码UTF-8,则:解码UTF-8:
246不是Windows代码,而是Unicode值。<代码>这是我从C++代码< /代码>中得到的StrugBuuter——不,不是。您只需添加两个字符。请告诉我们您从库中得到了什么,以及如何处理它。更好地发布互操作代码等。UTF-8是一个流编码,通过将<代码>字节[]/code >从C++传递到C*,然后使用UTF8. GESTSTRIN(),您可能会有更多的成功。
str3.Append((char)195);
str3.Append((char)182);
byte[] bytes = new byte[] { 195, 182 };
string s = Encoding.UTF8.GetString(bytes); // ö, code-point 246