需要帮助识别UTF编码的类型

时间:2017-07-04 17:12:56

标签: java encoding character-encoding urlencode

我很难弄清楚我需要转换为传递数据以获取帖子请求的unicode类型。大部分都是汉字。

示例字符串:

的事故事务院治党派驻地是不是

预期的Unicode:%u7684%u4E8B%u6545%u4E8B%u52A1%u9662%u6CBB%u515A%u6D3E%u9A7B%u5730%u662F%u4E0D%u662F

尝试编码为UTF16-BE: %76%84%4E%8B%65%45%4E%8B%52%A1%5C%40%5℃%40%95%7F%67%1F%8D%27%7B%49%5F%85%62 %08%59%1A

UTF-16中的编码文本:%FF%FE%84%76%8B%4E%45%65%8B%4E%A1%52%62%96%BB%6C%图5A%51%3E%6D%7B 9A%%30%57%2F%66%0D%4E%2F%66

UTF-8编码文本:%E7%9A%84%E4%BA%8B%E6%95%85%E4%BA%8B%E5%8A%A1%E9% 99%A2%E6%B2%BB%E5%85%9A%E6%B4%BE%E9%A9%BB%E5%9C%B0%E6%98%AF%E4%B8%8D%E6%98% AF

正如您所看到的,UTF16-BE是最接近的,但它只需要2个字节,并且每个字符前面应该有一个额外的%u,如预期的unicode所示。

我一直在使用URLEncoder方法来获取编码文本,使用标准的字符集编码,但它似乎并没有返回预期的unicode。

代码:

String text = "的事故事务院治党派驻地是不是";
URLEncoder.encode(text, "UTF-16BE");

2 个答案:

答案 0 :(得分:0)

正如卡亚曼在评论中所说:你的期望是错误的。

这是因为%uNNNN不是Unicode文本的有效URL编码。正如Wikipedia says it

  

Unicode字符存在非标准编码:%uxxxx,其中xxxx是UTF-16代码单元,表示为四个十六进制数字。 此行为未由任何RFC指定,并已被W3C拒绝。

因此,除非您的服务器是非标准输入,否则您的期望是错误的。

相反,请使用UTF-8。正如Wikipedia says it

  

通用URI语法要求在URI中提供字符数据表示的新URI方案实际上必须表示来自未保留集的字符而不进行转换,应将所有其他字符转换为字节。 UTF-8,然后对这些值进行百分比编码。此要求于2005年1月推出,随着RFC 3986的发布。在此日期之前引入的URI方案不受影响。

然而,这是用于在URL中发送数据,例如作为GET的一部分。

要发送文本数据作为application/x-www-form-urlencoded编码POST的一部分,请参阅HTML5 documentation

  
      
  • 如果form元素具有accept-charset属性,请将选定的字符编码作为选择表单编码的结果。

  •   
  • 否则,如果form元素没有accept-charset属性,但文档的字符编码是ASCII兼容的字符编码,那么这就是所选的字符编码。

  •   
  • 否则,让所选字符编码为UTF-8。

  •   

由于大多数网页(“文档”)最近以UTF-8呈现,这可能意味着UTF-8。

答案 1 :(得分:0)

我认为你的想法太过分了。文本的编码不需要"类似于"以任何方式,本文的Unicode代码点串。这是两件不同的事情。

要在POST请求中发送字符串的事故事务院治党派驻地是不是,只需编写整个POST请求并使用UTF-8对其进行编码,结果字节将作为POST请求的主体发送到服务器。

正如@Andreas所指出的,UTF-8是HTML5的默认编码,因此甚至不需要设置accept-charset属性,因为服务器会自动使用UTF-8进行解码如果未设置accept-charset,请求的正文。