c# - c# utf-8 与德语变音符号的转换问题
问题描述
我通过节俭协议从 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"
}
版本 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"
}
版本 3:
private string ConvertUTF8(string str) // str == "Ha�loch, �mely"
{
byte[] bytes = Encoding.Default.GetBytes(str);
return Encoding.UTF8.GetString(bytes); // == "Ha?loch, ?mely"
}
如您所见,版本 3 - 无论出于何种原因 - 将 � 更改为常规 ? 但结果应该是“Haßloch, Ämely”。知道我做错了什么吗?
编辑1:
在 c++ 端,字符串从 QString.toStdString() 转换,然后传递给节俭。根据 QT doc 的 .toStdString() 调用包括到 UTF-8 的转换(也见这里的最佳答案)。所以字符串应该正确传递,thrift 接口似乎也在内部使用 UTF-8。
编辑2:
我试图弄清楚字符串的第一次出现在哪里,并找到了这一行:
Name = iprot.ReadString();
其中Name
是字符串类型并且iprot
是 Thrift.Protocol.TCompactProtocol 类型
对于该ReadString()
方法,thrift doc 说Reads a byte[] (via readBinary), and then UTF-8 decodes it
所以这也不是原因......
编辑3(解决方案):
Marc Gravell 把我推到了这里……刚刚换了
Name = iprot.ReadString();
和
var bytes = iprot.ReadBinary();
Name = Encoding.GetEncoding("Windows-1252").GetString(bytes);
编辑4:
更简单:
var bytes = iprot.ReadBinary();
Name = Encoding.Default.GetString(bytes);
解决方案
如果您有string str
输入,那么您已经丢失了数据。string
( System.String
) 在 .NET 中始终是UTF-16。您需要查看上游,无论输入数据来自何处(可能是从某个文件、字节缓冲区、http-client 或数据库中读取)。通常只是在最初解码数据的位置指定正确的情况。Encoding
事后您无法修复编码;在上面的代码中,你已经无可挽回地失去了你想要的东西。
推荐阅读
- javascript - 使用 JavaScript 读取文本文件并实时更新浏览器中的值
- docker - Docker for Windows 和 WSL1 协同工作
- android - Android的Jetpack DataStore(alpha07版本)的正确实例创建
- swift - 使用关系和谓词访问 Core Data 中的数据
- python - 如何循环单击按钮然后向下单击
- r - 数据框中是否可以有一系列数字?
- java - 如何让用户使用正则表达式 java 输入某种格式
- python - 对象不显示可用方法
- javascript - 反应内存泄漏 - 当通过传递给提供者的孩子的函数更新上下文提供者中的状态时
- powershell - 为什么“Get-PowerBIDataset”Powershell 命令会为我提供工作区中的所有数据集?