【问题标题】:Handle Non-UTF-8 Characters in Byte Array处理字节数组中的非 UTF-8 字符
【发布时间】:2014-07-18 01:48:35
【问题描述】:

我有一个字节数组,其中包含一些不是 UTF-8 的字符。这些字符不能使用 UTF-8 编码反序列化。所以,我的问题是,我怎样才能处理这些字符并使字符串在任何语言中都可读。

例如,如果我有一个数组:

byte[] b = myArrayWithNonUTF8Characters;

我尝试使用以下方法反序列化数组:

DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(MyObject));

MyObject objResponse = (MyObject)jsonSerializer.ReadObject(new MemoryStream(b));

然后我收到一个错误,即数组包含无效的 UTF8 字节

有什么办法可以做到这一点?

PS:请不要给我这个答案:string s = System.Text.Encoding.UTF8.GetString(b, 0, b.Length); 它只会返回替换非 UTF-8 字符的符号。

【问题讨论】:

  • 那么文本的编码是什么?这些数据是从哪里来的?您是否乐于使用替代 JSON 库,例如Json.NET?
  • @JonSkeet 该数组来自网络服务。 byte[] b = _client.UploadValues(address, "POST", nvc); 而且我不知道它的编码。有什么办法可以查到吗?
  • HTTP 响应应包含在 Content-Encoding 标头中。要在代码中找到它,您可能需要使用 WebRequest/WebResponse 或 HttpClient 而不是 WebClient。
  • 您必须使用正确的编码对其进行转换。试图猜测编码会导致奇怪的结果。
  • @JonSkeet 我不确定是否可以使用 HTTPClient。你知道其他解决方法吗?

标签: c# utf-8


【解决方案1】:

UTF 的美妙之处在于它可以对大多数语言中的字符进行编码;所以你可以在同一个字符流中同时使用希腊语和日语。

如果没有 UTF,您的整个流(或者在您的情况下是一个数组)必须使用由代码页定义的单一语言。每个字符由一个 ASCII 字节表示,但实际字符由代码页确定(有关详细信息,请参阅http://en.wikipedia.org/wiki/Code_page)。

例如,如果您的文本是用希腊语编写的,您可以使用 Code Page 111:

System.Text.Encoding.GetEncoding(111)

简而言之,您需要知道 ASCII 文本是用什么语言编写的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    相关资源
    最近更新 更多