【问题标题】:C#, UTF-8 and encoding charactersC#、UTF-8 和编码字符
【发布时间】:2011-06-17 13:41:44
【问题描述】:

这是在黑暗中拍摄,如果这个问题听起来像是疯子的胡言乱语,我提前道歉。

作为与第三方集成的一部分,我需要使用 C# 对一些字符串信息进行 UTF8 编码,以便可以通过多部分形式将其发送到目标服务器。问题是他们拒绝了我的一些提交,可能是因为我没有正确编码他们的内容。

现在,我正试图弄清楚破折号或连字符(我无法仅通过查看它来判断它是哪一个)如何被目标服务器接收或解释为?~@~S(是的,这是一个 5 个字符的字符串,不是您的浏览器出现故障)。不幸的是,我对Encoding.UTF8.GetBytes() 的了解不够透彻,无法知道如何使用字节数组来开始识别问题所在。

如果有人能提供任何提示或建议,我将不胜感激。到目前为止,我唯一的朋友是 MSDN,而且不是很多。

更新 1:经过进一步挖掘,我发现使用 System.Web.HttpUtility.UrlEncode() 编码 EM DASH 字符(“—”)会将其十六进制编码为“%e2%80%94 ”。

我目前在 aHttpWebRequestpost 中发送此信息,内容类型为“application/x-www-form-urlencoded”——这可能是导致问题的原因吗?如果是这样,对一系列值可能包含 Unicode 字符的名称-值对进行编码以便期望 UTF-8 请求的服务器能够理解的正确方法是什么?

【问题讨论】:

  • 从这个结果我猜你可能是 ascii 编码 utf8 编码一个破折号的结果。
  • 即使编码错误,1 个字符的破折号也不太可能被翻译成 5 个字符的序列。这可能不仅仅是编码问题。
  • @Joshua:我认为你已经接近问题的核心。我刚刚在我的原始帖子中添加了更新,提供了更多信息。
  • 不幸的是,我选择了 application/octet-stream 并假设它的两端格式正确,所以我无法为您提供更多帮助。

标签: c# encoding utf-8 character-encoding utf8-decode


【解决方案1】:
byte[] test = System.Text.Encoding.UTF8.GetBytes("-");

应该给你

test[0] = 0x2D (45 as integer).  

验证您是否将 0x2D 发送到目标服务器。

【讨论】:

  • Wireshark 对这类东西很有帮助
  • 我以前从未使用过 Wireshark,但我们的首席开发人员对 Fiddler 非常有经验。我一回到办公室就试一试——谢谢你的提示。
  • Wireshark 的设置非常简单。它允许您查看哪些数据包正在进入您的服务器。您可以通过多种方式过滤数据,以免丢失数据。
  • 顺便说一句,正确输出上述信息的C#代码是什么(test[0] = 0x2D (45 as integer))?
  • 我使用这个函数将字节数组转换为十六进制字符串 public static string BtyeToHexString(byte[] in_record, int startIndex, int count) { string hexString = ""; if (startIndex + count
【解决方案2】:

您可能需要在 Content-Type 标头中添加“charset=utf-8”参数。 您可能还希望有一个Content-Encoding 标头来设置您的编码。标头应包含以下内容:

内容类型:multipart/form-data;字符集=utf-8

否则,Web 服务器不会知道您的字节是 UTF-8 字节,因此会误解它们。

【讨论】:

  • 您是正确的,因为我目前在发送多部分表单时没有明确定义内容编码类型。我刚刚向第三方发送了一封电子邮件,询问他们是否知道默认的预期内容类型是什么——他们可以轻松识别吗?我认为他们正在运行 Microsoft 服务器 (IIS)。
  • UTF-8not a valid Content-Encoding value。该标头用于指示有效负载的压缩方式。它不用于指示字符集。
猜你喜欢
  • 2018-07-02
  • 2012-09-11
  • 2014-06-09
  • 2017-07-27
  • 2017-04-27
  • 2013-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多