将 UTF-8 字符显示为 \u0394 的 .NET 字符串



问题是我通过 HttpWebResponse API 请求收到大量响应。从这个响应中,我提取此信息并将其传输到单独的字符串。只要没有重音字符或其他非字母顺序的内容,就可以正常工作。例如,当我创建一个带有"é"的字符串时,它显示为 U+00E9 而不是 é。

我已经在互联网上搜索了几天,但我还没有找到一个简单的解决方案。我已经阅读了这篇文章,并且我稍微了解了 UTF-8 格式的含义,但我对应该怎么做才能在字符串中显示特殊字符一无所知。

这是我用来获取WebResponse的代码:

Public Function ExecuteApiRequest(url As String) As String
Dim requestResult As String = ""
global_oauth_timestamp = setTimeStamp()
global_oauth_nonce = setNounce()
Dim headerFormat As String = "OAuth oauth_consumer_key=""{0}"",oauth_nonce=""{1}"",oauth_token=""{2}"",oauth_signature=""{3}"",oauth_signature_method=""{4}"",oauth_timestamp=""{5}"""
Dim authHeader As String = String.Format(headerFormat, Uri.EscapeDataString(global_oauth_consumer_key), Uri.EscapeDataString(global_oauth_nonce), Uri.EscapeDataString(global_oauth_token), Uri.EscapeDataString(global_oauth_signature), Uri.EscapeDataString(global_oauth_signature_method), Uri.EscapeDataString(global_oauth_timestamp))
ServicePointManager.Expect100Continue = False
Dim request As HttpWebRequest
Dim response As HttpWebResponse
Dim streamReader As System.IO.StreamReader  'ghfh,hrgnfgd
Dim encode As Encoding = System.Text.Encoding.GetEncoding("utf-8")
request = WebRequest.Create(url)
request.UserAgent = global_user_agent
request.Method = "GET"
request.Timeout = -1
request.Headers.Add("Authorization", authHeader)
Try
response = DirectCast(request.GetResponse, HttpWebResponse)
streamReader = New System.IO.StreamReader(response.GetResponseStream(), encode)
requestResult = streamReader.ReadLine
request.Abort()
streamReader.Close()
streamReader = Nothing
response.Close()
response = Nothing
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical)
End Try
If requestResult.Contains("You are making requests too quickly.") Then
MsgBox("TOO MANY REQUESTS")
End If
Return requestResult
End Function

如您所见,结果以字符串形式返回,也许问题从那里开始?

也许您应该使用stream.read()函数将响应输出流中的所有内容读取到字节数组中,然后使用该字节数组转换为 UTF-8UTF8Encoding.UTF8.GetString

希望这有帮助!

"页面抓取"会得到HTML。

Web API 调用通常会为您提供 JSON(或 XML——AJAX 中的 X 用于表示 XML)。似乎这就是你所拥有的,因为 \u0394 是一种在字符串文字中表达 é 的可能方式。(另一种方式是简单的é。

文档(如果有)应该会有所帮助,但响应内容类型标头会说application/json

在不属于已关闭的系统之间交换的 JSON 文本 生态系统必须使用 UTF-8 进行编码。 ...注意:没有为此注册定义"字符集"参数。 添加一个实际上对合规收件人没有影响。 —RFC8259

(旧标准允许 UTF-8、UTF-16 和 UTF-32 — 假设 JSON,所有这些都很容易区分。

您的.ReadLine有点奇怪,但 JSON 通常在创建时没有换行符,因此在某种程度上是有意义的。但是,我建议.ReadToEnd().

因此,一旦 requestResult 中有 JSON,就需要对其进行反序列化。最终结果将是您定义的类的实例。(在 C# 中,它可以是dynamic对象。可以轻松地从 JSON 示例生成类。

为了序列化和反序列化JSON,Newtonsoft的 JSON.NET NuGet包非常常见。使用JsonConvert.Deserialize转换为类,或使用JObject.Parse来获取可以像下面JObject.Parse(requestResult)("results").First()("title")一样浏览的对象。

最终,您可能更喜欢像RestSharp这样的综合Web API客户端。

最新更新