c#utf-8与德语变音符号的转换问题

Dom*_*mMa 1 c# qt thrift utf-8 thrift-protocol

我通过thrift协议从c ++后端获取一些信息,包含带有德语变音符号的字符串(名称).现在这些变音符号显示为问号,所以我认为我正在尝试将它们转换为utf-8,尽管thrift似乎传递字符串为utf-8无论如何.

原始数据来自postgresql数据库,并在将其发送到thrift接口之前正确显示在c ++代码中.

我已经尝试了3种不同的版本进行转换,但它们都没有真正做任何事情我被困在这里.

版本1:

private string ConvertUTF8(string str) // str == "Ha?loch, ?mely"
{
  byte[] bytSrc;
  byte[] bytDestination;
  string strTo = string.Empty;

  bytSrc = Encoding.Unicode.GetBytes(str);
  bytDestination = Encoding.Convert(Encoding.Unicode, Encoding.UTF8, bytSrc);
  strTo = Encoding.UTF8.GetString(bytDestination);

  return strTo; // strTo == "Ha?loch, ?mely"
}
Run Code Online (Sandbox Code Playgroud)

版本2:

private string ConvertUTF8(string str) // str == "Ha?loch, ?mely"
{
  byte[] bytes = str.Select(c => (byte)c).ToArray();
  return Encoding.UTF8.GetString(bytes); // == "Ha?loch, ?mely"
}
Run Code Online (Sandbox Code Playgroud)

版本3:

private string ConvertUTF8(string str) // str == "Ha?loch, ?mely"
{
  byte[] bytes = Encoding.Default.GetBytes(str);
  return Encoding.UTF8.GetString(bytes); // == "Ha?loch, ?mely"
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,版本3 - 无论出于何种原因 - 将 更改为常规?但结果应该是"Haßloch,Ämely".知道我做错了什么吗?

编辑1:

在c ++端,字符串从QString.toStdString()转换,然后传递给thrift.根据QT doc,.toStdString()调用包括转换为UTF-8(另请参见此处的顶部答案).所以字符串应该正确传递,而thrift接口似乎也在内部使用UTF-8.

编辑2:

我试图找出,第一次出现的字符串将在哪里找到这一行:

Name = iprot.ReadString();
Run Code Online (Sandbox Code Playgroud)

其中Name是string iprot类型,类型为Thrift.Protocol.TCompactProtocol

对于这种ReadString()方法,节俭文档说Reads a byte[] (via readBinary), and then UTF-8 decodes it这样也不是原因......

编辑3(解决方案):

Marc Gravell把我推到了这里......刚换下来

Name = iprot.ReadString();
Run Code Online (Sandbox Code Playgroud)

var bytes = iprot.ReadBinary();
Name = Encoding.GetEncoding("Windows-1252").GetString(bytes);
Run Code Online (Sandbox Code Playgroud)

编辑4:

更简单:

var bytes = iprot.ReadBinary();
Name = Encoding.Default.GetString(bytes);
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 5

如果你得到一个string str输入,你已经丢失了数据..NET中的string(System.String)始终是UTF-16.您需要查看上游,输入数据来自哪里(可能是从某个文件,字节缓冲区,http客户端或数据库读取).它通常只是指定了正确的情况下,Encoding 在您最初解码数据点.

事后你无法修改编码; 在上面的代码中,你已经无可挽回地失去了你想要的东西.