Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中从UTF-8转换# 我有一个C++库,它使用UTF-8生成一些字符串。该库由一个C#库使用,该库能够使用ddlexport访问字符串 < >代码创建一个StrugBuudor,C++填充了这个对象中的字符。但是,无法正确检索非ASCII字符_C# - Fatal编程技术网

在C中从UTF-8转换# 我有一个C++库,它使用UTF-8生成一些字符串。该库由一个C#库使用,该库能够使用ddlexport访问字符串 < >代码创建一个StrugBuudor,C++填充了这个对象中的字符。但是,无法正确检索非ASCII字符

在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

e、 g:字符串“ö”使用两个字节编码,代码为195和182,这与UTF-8()中该字符的编码相对应。如果我在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++来传递字符串的方法是否错误:< /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