中文网页编解码问题

摘要:
或者您要发送的请求参数的值是“http://openhome.cc“该值如何?如果是GET请求,则不能直接键入:http://openhome.cc/addBookmar.do?url=http://openhome.ccURI规范定义了一些保留字符,例如“:”、“/”、“?”“&”、“=”、“@”和“%”等字符都在URI中发挥作用。如果要在请求参数的URI中表示保留字符,则必须在%字符之后的十六进制值表示中表示此字符的八位值。这是URI规范中的百分比编码,通常称为URI编码或URL编码。
-1、解决httpexchange输入中文乱码问题
// parse request
Map<String, Object> parameters = new HashMap<String, Object>();
                        
//It's not exactly the answer to my question, but it helped me to solve the issue nonetheless.
//The mistake I have made is that I'm using URI.getQuery (that decodes the parameters) instead of using URI.getRawQuery. I was assuming that HttpServer was doing the decoding; this assumption was wrong.
String query = requestedUri.getQuery();

这里要使用getQuery() 而不是getRawQuery)

  0、说明:0.1、首先是unicode转义字符

在涉及Web前端开发时, 有时会遇到uXXXX格式表示的字符, 其中XXXX是16进制数字的字符串表示形式, 在js中这个叫Unicode转义字符, 和 同属于转义字符. 在其他语言中也有类似的, 可能还有其它变形的格式.

0.2、url编码/百分比编码

HTTP 請求參數,必須使用請求參數名稱與請求參數值,中間以等號(=)表示成對關係,現在問題來了,如果請求參數值本身包括=符號怎麼辦?又或許你想發送的請求 參數值是「http://openhome.cc」這個值呢?假設是GET請求,你不能直接這麼在網址列上鍵入:http://openhome.cc/addBookmar.do?url=http://openhome.cc

在URI的規範中定義了一些保留字元(Reserved character),像是「:」、「/」、「?」、「&」、「=」、「@」、「%」等字元,在URI中都有它的作用,如果你要在請求參數上表達URI中的保留字元,必須在%字元之後以十六進位數值表示方式,來表示該字元的八個位元數值。

例如,「:」字元真正儲存時的八個位元為00111010,用十六進位數值來表示則為3A,所以必須使用「%3A」來表示「:」,「/」字元儲存時的八個 位元為00101111,用十六進位表示則為2F,所以必須使用「%2F」來表示「/」字元,所以想發送的請求參數值是「http: //openhome.cc」的話,則必須使用以下格式:http://openhome.cc/addBookmar.do?url=http%3A%2F%2Fopenhome.cc。這是URI規範中的百分比編碼(Percent-Encoding),也就是俗稱的URI編碼或URL編碼。

 

1、16进制解码

 

static final Pattern reUnicode = Pattern.compile("\\u([0-9a-zA-Z]{4})");

public static String decode(String s) {

    Matcher m = reUnicode.matcher(s);

    StringBuffer sb = new StringBuffer(s.length());

    while (m.find()) {

        m.appendReplacement(sb,

                Character.toString((char) Integer.parseInt(m.group(1), 16)));

    }

    m.appendTail(sb);

    return sb.toString();

}

 2、然后网页解码

 URLDecoder.decode(url,"UTF-8")

3、综合就是

decode( URLDecoder.decode(url,"UTF-8"))

4、参考文献

http://netwjx.github.io/blog/2012/07/07/encode-and-decode-unicode-escape-string/

http://openhome.cc/Gossip/Encoding/URLEncoding.html

免责声明:文章转载自《中文网页编解码问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇CSS定位(postion)和移动(float)即时聊天IM之二 openfire 整合现有系统用户下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

.net Core 调用微信Jsapi接口,H5解析二维码

项目里需要用到扫描二维码,自己实现,不会。 找到了两种解决方案: 通过reqrcode.js,这是一个前端解析二维码内容的js库。如果二维码比较清晰,用这种效果也不错 调用微信扫一扫功能,这种效果很好。但是调试接口超级麻烦。 具体实现:前端代码(vue)(前端用到 vux) <template> <div class="main"&g...

02_编程规约——集合处理

1.【强制】关于hashCode和equals的处理,必须遵循如下规则 1.1 只要重写equals,就必须重写hashCode。 1.2 因为Set存储的是不重复对象,依据hashCode和equals进行判断,所以Set存储的对象必须重写这两个方法。 1.3 如果自定义对象为Map的键,那么必须重写hashCode和equals。 说明:String重...

FTP文件上传下载(C#)

下面是ftp上传下载工具,不能直接运行,请删除不必要的代码。 /// <summary> /// ftp文件上传下载 /// </summary> public class FtpHelper { private string FtpServer; private st...

各种电子面单-Api接口(顺丰、快递鸟、菜鸟)

目录 术语 电子面单样式 对接接口各家对比 各家合作流程对比 接口定义及说明 Request Params 系统级参数(公共参数) 接口参数 Response Params Java栗子 术语 对于一般人,电子面单的意思可能并不是很了解;说白了,就是快递员给你打印的快递单的电子版。 专业解释: 电子面单是一种通过热敏纸打印输出纸质物流面...

C#中IntPtr

C#中IntPtr System.Object System.ValueType System.IntPtr 1.C#中的IntPtr类型被称之为“平台特定的整数类型”,用于本机资源,例如窗口句柄。 2.资源的大小取决于使用的硬件和操作系统,即此类型的实例在32位硬件和操作系统中将是32位,在64位硬件和操作系统中将是64位;但其大小总是足以包含系统的...

[转]JAVA URL请求

使用Java发送GET、POST请求 ——节选自《疯狂Java讲义》    URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和 URL 之间的通信链接。程序可以通过URLConnection实例向该URL发送请求、读取URL引用的资源。 通常创建一个和 URL 的连接,并发送请求、读取此 URL 引用...