gpt4 book ai didi

c# - 如何在我的 C# 代码中正确处理 Web 响应中的 UTF-8?

转载 作者:太空狗 更新时间:2023-10-29 20:34:43 24 4
gpt4 key购买 nike

首先,我从 Joel Spolsky 中学到的关于文本编码的大部分知识文章。

我目前正在编写一个 C# 网络系统来在我们的 Google Search Appliance 上执行查询,读取结果并在我们自己的自定义 UI 中将其呈现给用户。但是,当我向用户显示文本摘要时存在编码问题。

当我直接在 chrome/IE/whatever 中查询 GSA 时,我得到以下响应

Postgame Notes No. 8 seed DePaul vs. No. 9 seed USF Game 6 – Second
Round

在我的 C# 代码中,我使用以下代码读取该响应:

        var request = WebRequest.Create(LastQueryUrl);
var response = (HttpWebResponse)request.GetResponse();

if (response.StatusCode != HttpStatusCode.OK)
return null;

using (var reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8))
content = reader.ReadToEnd();

当我调试 content 变量时,我看到该字符串已转换为:

USF Game 6 � Second

我 99% 确定来自 GSA 的数据是 UTF-8 格式,因为他们的 xml 上的其他点以及文档中的各种花絮。即使,如果我使用 System.Text.Encoding.Unicode 读取流,而不是任何文本都不可读。

我哪里做错了,我怎样才能让文本正确显示?


编辑: 使用 System.Text.Encoding.GetEncoding("ISO-8859-1") 给我

USF Game 6 Second

没有问号,虽然破折号没有出现。

最佳答案

您可以尝试执行此代码(而不是您的 using block )并再次粘贴结果吗?我假设您使用的是 .NET 4。

using (var responseStream = response.GetResponseStream())
using (var memoryStream = new MemoryStream())
{
responseStream.CopyTo(memoryStream);
byte[] bytes = memoryStream.ToArray();
content = BitConverter.ToString(bytes);
}

编辑:我注意到您没有在帖子中粘贴整个返回的字符串。是因为字符串的其余部分包含 secret 数据吗?如果是这样,请不要粘贴上面建议的结果。

编辑2:要使结果正确呈现,您可以使用Encoding.GetEncoding(1252) 但是,我建议您不要那样做,原因我很快就会解释。

说明:据我了解,您的问题似乎是发送方的编码错误。您说他们的文档声明了 UTF-8,这显然与他们的 XML 声明 ISO-8859-1 相矛盾。实际上,使用的编码不是两者中的任何一种。

在您上传的十六进制字符串中,罪魁祸首字符的字节值为 0x96,并且出现在序列 20-96-20 的中间。在 UTF-8 和 ISO-8859-1(以及它们之前的 ASCII)中,0x20 是一个空格字符。然而,在 UTF-8 , 0x96 是一个连续字节,并且是not valid除非前面有一个起始字节(0x20 不是)。在 ISO-8859-1 , 0x96 是 C1 控制字符,因此不是可打印字符(无法向用户显示)。

因此,我们可以推断原始字符编码既不是UTF-8也不是ISO-8859-1,而是Windows-1252。 ,有时被认为是 ISO-8859-1 的“超集”,因为它用可显示字符替换了 0x800x9F 范围的控制字符。事实上,在 Windows-1252 中,0x96 是您期望的破折号字符。

考虑到上述情况,通过假定 Windows-1252 编码来解决您的问题可能是安全的;但是,如果我是你,我会联系供应商并告知他们这个缺陷。

using (var stream = response.GetResponseStream())
using (var reader = new StreamReader(stream, System.Text.Encoding.GetEncoding(1252)))
content = reader.ReadToEnd();

关于c# - 如何在我的 C# 代码中正确处理 Web 响应中的 UTF-8?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9981419/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com