代码之家  ›  专栏  ›  技术社区  ›  Mohsen

将字符串从Windows 1256转换为UTF-8

  •  0
  • Mohsen  · 技术社区  · 6 年前

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

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

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

    如何进行此转换?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Remy Lebeau    6 年前

    显示的代码采用本机代码。网 string (使用UTF-16编码),将其编码到Windows-1256,然后 错误解释 结果是UTF-8,而实际上不是。因此,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);