java 中文编码问题

java常规编码问题

package com.boco;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;


public class UnicodeCase {
                 public static void main(String[] args) throws UnsupportedEncodingException {
  byte[] str1="中".getBytes("utf8");
  byte[] str2="中".getBytes("gbk");
  byte[] str3="中".getBytes("iso8859-1");
  for(int i=0;i<str1.length;i++){
  System.out.print(str1[i]);
  }

                                           System.out.println();
  System.out.println(str1);
  System.out.println(str2);
  System.out.println(str3);
  String a=new String(str1,"utf8");
  String b=new String(str2,"gbk");
  String c=new String(str3,"iso8859-1");
  String d=new String(str1,"iso8859-1");
  System.out.println(a);
  System.out.println(b);
  System.out.println(c);
  System.out.println(new String(d.getBytes("iso8859-1"),"utf8"));
  
}
}


运行结果:

-28-72-83
[B@f62373
[B@19189e1
[B@1f33675


?

出现此种问题主要是  java对中文字符的编码问题  

汉字 utf-8 三个字节表示  gbk 2个字节表示   

没有iso8859-1编码 但是可以表示  (属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。比如,字母a的编码为0x61=97。 很明显,iso8859-1编码表示的字符范围很窄,无法表示中文字符。但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用iso8859-1编码来表示。而且在很多协议上,默认使用该编码。比如,虽然"中文"两个字不存在iso8859-1编码,以gb2312编码为例,应该是"d6d0 cec4"两个字符(Java字符占2个字节),使用iso8859-1编码的时候则将它拆开为4个字节来表示:"d6 d0 ce c4"(事实上,在进行存储的时候,也是以字节为单位处理的))

getBytes() 是Java编程语言中将一个字符串转化为一个字节数组byte[]的方法。String的getBytes()方法是得到一个系统默认的编码格式的字节数组。将一个String类型的字符串中包含的字符转换成byte类型并且存入一个byte[]数组中。在java中的所有数据底层都是字节,字节数据可以存入到byte数组。(详情可以查看api  免费下载地址http://download.csdn.net/detail/docuxu/9908841)

从上面的实例程序中 我们可以看出 utf8 和gbk的编码格式 在字符串和字节数组的形式下 可以相互转化。而 iso8859-1此种编码格式则在字符串转化为字节数组后 无法恢复。如果真的需要使用iso8859-1编码格式  我们可以使用utf或gbk的编码格式将其先转化为字节数组 然后再使用iso8859-1 最后还是通过对应编码恢复 知识中间对字节数组使用了iso8859-1。



URL参数编码问题

一、为什么要用URLEncoder

客户端在进行网页请求的时候,网址中可能会包含非ASCII码形式的内容,比如中文。而直接把中文放到网址中请求是不允许的,所以需要用URLEncoder编码地址,网址中的非ASCII码内容转换成可以传输的字符。
不会被编码的内容:
1.大写字母A-Z
2.小写字母a-z
3.数字 0-9
4.标点符 - _ . ! ~ * ' (和 ,)


二、编码原理
1、将需要转换的内容(ASCII码形式之外的内容),用十六进制表示法转换出来,并在之前加上%开头
eg:  0x9c  URLEncoder --> %9c

2、内容中的空格‘ ’ ,全部用+代替

3、注:与Hex不同,Hex是将所有的字符转换为16进制表示,而URLEncoder是将ASCII码集之外的转换为%加上相应的16进制,而ASCII码集内的字符不进行处理


三、应用场景
1、所有的GET请求
2、网址中有中文等情况
3、POST请求,所有的Key和Value在提交之前都要经过URLEncoder

四、示例
try {
    String a = URLEncoder.encode("a", "UTF-8");
    Log.i("encode","a 进行URLEncoder编码后-->"+a );
    String b = URLEncoder.encode("a中", "UTF-8");
    Log.i("encode","a中 进行URLEncoder编码后-->"+b );
    String decode = nURLDecoder.decode("a%E4%B8%AD", "UTF-8");
    Log.i("encode","a%E4%B8%AD 进行URLDecoder解码后-->"+decode);
} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
}
运行结果:
a 进行URLEncoder编码后-->a
a中 进行URLEncoder编码后-->a%E4%B8%AD
a%E4%B8%AD 进行URLDecoder解码后-->a中
可以看出 字符'a' 并没有编码  而 中文 '中' 进行了编码
与URLEncoder编码对应的是URLDecoder解码 
可以看出 "a中"--编码-->"a%E4%B8%AD"--解码-->"a中"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值