【问题标题】:convert string from Windows 1256 to UTF-8将字符串从 Windows 1256 转换为 UTF-8
【发布时间】:2018-09-30 09:38:54
【问题描述】:

我想将具有 Windows-1256 的数据库中的字符串转换为 UTF-8。 数据库是波斯语的。

我使用下面的代码,但收到问号:????。

string text= "راوي"; // should be "راوی"
byte[] encoded = Encoding.GetEncoding(1256).GetBytes(text);
string result= Encoding.UTF8.GetString(encoded);

我该如何进行这种转换?

【问题讨论】:

  • 显示用于从数据库中检索 1256 编码值的代码。您的代码示例将无法按预期工作,因为 c# 字符串变量是 utf8 并且将它们强制转换为 1256 会造成乱码。
  • @dlatikay .NET uses the UTF-16 encoding => docs.microsoft.com/en-us/dotnet/standard/base-types/…
  • 正确。我仍然认为我们需要在这里查看数据库代码来提供帮助。一些数据库提供程序在连接属性中有字符编码选项,如果知道我们也在谈论哪个 RDBMS 和驱动程序会很好。
  • 您正在解码 Win-1252 字节,就好像它们是 UTF-8 一样。这是完全错误的,可能与您想要做的相反。 .Net 中的字符串是字符串对象;它们的内部编码无关紧要。仅当出于某种原因要将它们转换为字节时,编码才重要。
  • 我编写了一个 C 程序,将文件从 windows-1256 逐字节转换为 UTF-8。您可以使用任何语言编写相同的程序。在这里查看:github.com/mutawa/win2utf

标签: c# winforms unicode


【解决方案1】:

呈现的代码采用原生 .NET string(使用 UTF-16 编码),将其编码为 Windows-1256,然后 错误解释,当真的不是。因此,UTF-8 的解码当然会为非 ASCII 字符生成?,因为它们一开始不会被编码为 UTF-8。

代码没有按照问题的要求进行。

将 Windows-1256(或任何其他编码)转换为 UTF-8 的正确方法是首先按原样获取源数据并使用原始编码将其解码为 UTF-16,然后将该结果编码为 UTF-8,例如:

byte[] Win1256Data = ...;
string s = Encoding.GetEncoding(1256).GetString(Win1256Data);
byte[] Utf8Data = Encoding.UTF8.GetBytes(s);

或者,Encoding 类有一个 Convert() 方法来为您处理中间转换:

byte[] Win1256Data = ...;
byte[] Utf8Data = Encoding.Convert(Encoding.GetEncoding(1256), Encoding.UTF8, Win1256Data);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    相关资源
    最近更新 更多