【发布时间】:2017-09-21 14:46:06
【问题描述】:
我正在从 C# 文件中读取一些二进制数据,还有需要正确解码的字符串。
例如 windows-1251 代码页我没有问题,但 ISO6937 的结果不正确 - 看起来 C# 忽略了 two byte chars (accent+char)。
我正在使用这种方式从字节中解码字符串:
Encoding.Convert(Encoding.GetEncoding("20269"), Encoding.UTF8, data)
例子:
克拉科夫
字节[] = 4B 72 61 6B C2 6F 77
结果 - Krak´ow
我做了一些研究,但我只找到了来自 MediaPortal at their GitHub 的一些代码,它们手动读取两个字节字符 - 这不是最好的方法。
是我做错了什么还是这是 Visual Studio 错误? (如果这不能正常工作,为什么他们赋予了 ISO6937 编码的能力?)
【问题讨论】:
-
这不是“Visual Studio”错误,也不是 C# 错误; 可能 .NET 框架和/或 Windows 在该编码中存在故障。您是否 100% 确定这是该字符串的正确字节表示?我真的不熟悉 ISO6937。不过,老实说:如果您迁移到 UTF8,那对您来说会容易得多。至于“如果这不能正常工作,为什么他们赋予了 ISO6937 编码的能力?” - 如果它被窃听,可能是因为他们当时不知道它有故障。错误发生。
-
感谢您的回答,不幸的是二进制数据不是我生成的,我别无选择,必须阅读它,因为它是由一些非常旧的应用程序保存的:(字符串也可以:4B 72 61 6B C2 6F 77 K rak [ ó ] w
-
幸运的是,这个 实际上 看起来是一个很容易实现的编码 - 只有 13 个多字节标记,所以你可以只检查高位(或者见鬼,只是0xC1-0xCF 的特殊情况) - 替换图也很小 - en.wikipedia.org/wiki/ISO/IEC_6937 - 所以是的,我同意它通过
Encoding.GetEncoding无法正常工作是非常令人烦恼和失望的,但是:它应该是一个小时的工作来解决它...... -
使用
ByteArrayToString方法找到here,并运行它:Console.WriteLine(ByteArrayToString(Encoding.GetEncoding(20269).GetBytes("Kraków".ToCharArray())));,我得到的这些字节与你的不同:“4b72616b3f77”。也许我在转换 c# 字符时遗漏了一些东西?另请注意,我使用的是Encoding.GetEncoding(20269),因为Encoding.GetEncoding("20269")为我抛出了异常。 -
@Quantic 我认为关键是:编码不起作用:) 检查维基百科,4B 72 61 6B C2 6F 77(来自 OP)确实是正确的字节
标签: c# string unicode encoding utf-8