先把资料列一下,
字符 URL编码值
space %20
" %22
# %23
% %25
& %26
( %28
) %29
+ %2B
, %2C
/ %2F
: %3A
; %3B
< %3C
= %3D
> %3E
? %3F
@ %4o
\ %5C
| %7C
手头的程序,界面基于ajax,需要向服务器上的servlet发送XML,采用HTTP POST 方式,这种情况下POST比GET当然好得多,GET的URL编码更麻烦。即使如此,编码问题还是给我来了一个下马威。由于XML是用纯文本参数的方式发起请求,当XML内部某个节点值含有“+”的时候,Http传输就会丢失这个字符,这个时候必须将“+”手动转成 “%2B”,同时需要手动转的字符还有“&”->“%26”,“%”->“%25”等。这几个特殊字符是不能用javascript的encodeURI()来编码的,所以即使“笨”一点手动转那也是没办法。不过除了这三个顽固的家伙,尚未发现其它字符也需要在POST方式提交XML文本的情况下先作转换,硬编码看来也不是不可以哈。值得留意的是,“&”在XML里也是特殊字符,所以一般来说我不会对其进行uri编码,而是把它转换成“&”。
字符 URL编码值
space %20
" %22
# %23
% %25
& %26
( %28
) %29
+ %2B
, %2C
/ %2F
: %3A
; %3B
< %3C
= %3D
> %3E
? %3F
@ %4o
\ %5C
| %7C
手头的程序,界面基于ajax,需要向服务器上的servlet发送XML,采用HTTP POST 方式,这种情况下POST比GET当然好得多,GET的URL编码更麻烦。即使如此,编码问题还是给我来了一个下马威。由于XML是用纯文本参数的方式发起请求,当XML内部某个节点值含有“+”的时候,Http传输就会丢失这个字符,这个时候必须将“+”手动转成 “%2B”,同时需要手动转的字符还有“&”->“%26”,“%”->“%25”等。这几个特殊字符是不能用javascript的encodeURI()来编码的,所以即使“笨”一点手动转那也是没办法。不过除了这三个顽固的家伙,尚未发现其它字符也需要在POST方式提交XML文本的情况下先作转换,硬编码看来也不是不可以哈。值得留意的是,“&”在XML里也是特殊字符,所以一般来说我不会对其进行uri编码,而是把它转换成“&”。
做爬虫,发现cookie里面多了一个键值对:
CurTop10KeyWord=%2c%u5434%u654f%2c%u4e2d%u5357%u5927%u5b66
因此后台要用java模拟这样一个值,将%2c%u5434%u654f%2c%u4e2d%u5357%u5927%u5b66转换成string之后,发现是“,吴敏,中南大学”,因此需要将条件转成unicode放在cookie里。一些特殊的字符unicode编码已经放在上面了,下面贴方法。
代码如下:
1.UnicodeToStr
public static String decodeUnicodeToString(String codes) {
if(codes!=null&&codes.length()>0){
ArrayList<String> code_list = new ArrayList<String>();
StringBuffer period = new StringBuffer();
codes = codes.substring(1);
codes += '%';
for (int i = 0; i < codes.length(); i++) { // 拆分字符
if (codes.charAt(i) == '%' && period.length() != 0) {
code_list.add(period.toString());
period = new StringBuffer();
} else {
period.append(codes.charAt(i));
}
}
StringBuffer result = new StringBuffer();
for (String code : code_list) { // 逐个转换
result.append((char) Integer.valueOf(code.substring(1), 16).intValue());
}
return result.toString();
}else return null;
}
if(codes!=null&&codes.length()>0){
ArrayList<String> code_list = new ArrayList<String>();
StringBuffer period = new StringBuffer();
codes = codes.substring(1);
codes += '%';
for (int i = 0; i < codes.length(); i++) { // 拆分字符
if (codes.charAt(i) == '%' && period.length() != 0) {
code_list.add(period.toString());
period = new StringBuffer();
} else {
period.append(codes.charAt(i));
}
}
StringBuffer result = new StringBuffer();
for (String code : code_list) { // 逐个转换
result.append((char) Integer.valueOf(code.substring(1), 16).intValue());
}
return result.toString();
}else return null;
}
2.StrToUnicode
public static String toFormatUnicode(String strText)
throws UnsupportedEncodingException {
char c;
String strRet = "";
int intAsc;
String strHex;
for (int i = 0; i < strText.length(); i++) {
c = strText.charAt(i);
intAsc = (int) c;
strHex = Integer.toHexString(intAsc);
if (intAsc > 128) {
strRet += "%u" + strHex;
} else {
strRet += "%" + strHex;
}
}
return strRet;
}
throws UnsupportedEncodingException {
char c;
String strRet = "";
int intAsc;
String strHex;
for (int i = 0; i < strText.length(); i++) {
c = strText.charAt(i);
intAsc = (int) c;
strHex = Integer.toHexString(intAsc);
if (intAsc > 128) {
strRet += "%u" + strHex;
} else {
strRet += "%" + strHex;
}
}
return strRet;
}
3.测试
public static void main(String args[]) throws IOException, FileNotFoundException{
System.out.println(StrToUnicode.decodeUnicodeToString("%2c%u5434%u654f%2c%u4e2d%u5357%u5927%u5b66"));
System.out.println(StrToUnicode.toFormatUnicode(",吴敏,中南大学"));
System.out.println(StrToUnicode.decodeUnicodeToString("%2c%u5434%u654f%2c%u4e2d%u5357%u5927%u5b66"));
System.out.println(StrToUnicode.toFormatUnicode(",吴敏,中南大学"));
}
运行结果:
,吴敏, 中南大学
%2c%u5434%u654f%2c%u4e2d%u5357%u5927%u5b66
%2c%u5434%u654f%2c%u4e2d%u5357%u5927%u5b66
因此后台CurTop10KeyWord