提交服务器请求中文字符乱码,需要进行编码转换

35 篇文章 0 订阅
12 篇文章 0 订阅
  1. import java.io.UnsupportedEncodingException;  
  2.   
  3. /** 
  4.  * 转换字符串的编码 
  5.  */  
  6. public class ChangeCharset {  
  7.  /** 7位ASCII字符,也叫作ISO646-US、Unicode字符集的基本拉丁块 */  
  8.  public static final String US_ASCII = "US-ASCII";  
  9.   
  10.  /** ISO 拉丁字母表 No.1,也叫作 ISO-LATIN-1 */  
  11.  public static final String ISO_8859_1 = "ISO-8859-1";  
  12.   
  13.  /** 8 位 UCS 转换格式 */  
  14.  public static final String UTF_8 = "UTF-8";  
  15.   
  16.  /** 16 位 UCS 转换格式,Big Endian(最低地址存放高位字节)字节顺序 */  
  17.  public static final String UTF_16BE = "UTF-16BE";  
  18.   
  19.  /** 16 位 UCS 转换格式,Little-endian(最高地址存放低位字节)字节顺序 */  
  20.  public static final String UTF_16LE = "UTF-16LE";  
  21.   
  22.  /** 16 位 UCS 转换格式,字节顺序由可选的字节顺序标记来标识 */  
  23.  public static final String UTF_16 = "UTF-16";  
  24.   
  25.  /** 中文超大字符集 */  
  26.  public static final String GBK = "GBK";  
  27.   
  28.  /** 
  29.   * 将字符编码转换成US-ASCII码 
  30.   */  
  31.  public String toASCII(String str) throws UnsupportedEncodingException{  
  32.   return this.changeCharset(str, US_ASCII);  
  33.  }  
  34.  /** 
  35.   * 将字符编码转换成ISO-8859-1码 
  36.   */  
  37.  public String toISO_8859_1(String str) throws UnsupportedEncodingException{  
  38.   return this.changeCharset(str, ISO_8859_1);  
  39.  }  
  40.  /** 
  41.   * 将字符编码转换成UTF-8码 
  42.   */  
  43.  public String toUTF_8(String str) throws UnsupportedEncodingException{  
  44.   return this.changeCharset(str, UTF_8);  
  45.  }  
  46.  /** 
  47.   * 将字符编码转换成UTF-16BE码 
  48.   */  
  49.  public String toUTF_16BE(String str) throws UnsupportedEncodingException{  
  50.   return this.changeCharset(str, UTF_16BE);  
  51.  }  
  52.  /** 
  53.   * 将字符编码转换成UTF-16LE码 
  54.   */  
  55.  public String toUTF_16LE(String str) throws UnsupportedEncodingException{  
  56.   return this.changeCharset(str, UTF_16LE);  
  57.  }  
  58.  /** 
  59.   * 将字符编码转换成UTF-16码 
  60.   */  
  61.  public String toUTF_16(String str) throws UnsupportedEncodingException{  
  62.   return this.changeCharset(str, UTF_16);  
  63.  }  
  64.  /** 
  65.   * 将字符编码转换成GBK码 
  66.   */  
  67.  public String toGBK(String str) throws UnsupportedEncodingException{  
  68.   return this.changeCharset(str, GBK);  
  69.  }  
  70.    
  71.  /** 
  72.   * 字符串编码转换的实现方法 
  73.   * @param str  待转换编码的字符串 
  74.   * @param newCharset 目标编码 
  75.   * @return 
  76.   * @throws UnsupportedEncodingException 
  77.   */  
  78.  public String changeCharset(String str, String newCharset)  
  79.    throws UnsupportedEncodingException {  
  80.   if (str != null) {  
  81.    //用默认字符编码解码字符串。  
  82.    byte[] bs = str.getBytes();  
  83.    //用新的字符编码生成字符串  
  84.    return new String(bs, newCharset);  
  85.   }  
  86.   return null;  
  87.  }  
  88.  /** 
  89.   * 字符串编码转换的实现方法 
  90.   * @param str  待转换编码的字符串 
  91.   * @param oldCharset 原编码 
  92.   * @param newCharset 目标编码 
  93.   * @return 
  94.   * @throws UnsupportedEncodingException 
  95.   */  
  96.  public String changeCharset(String str, String oldCharset, String newCharset)  
  97.    throws UnsupportedEncodingException {  
  98.   if (str != null) {  
  99.    //用旧的字符编码解码字符串。解码可能会出现异常。  
  100.    byte[] bs = str.getBytes(oldCharset);  
  101.    //用新的字符编码生成字符串  
  102.    return new String(bs, newCharset);  
  103.   }  
  104.   return null;  
  105.  }  
  106.   
  107.  public static void main(String[] args) throws UnsupportedEncodingException {  
  108.   ChangeCharset test = new ChangeCharset();  
  109.   String str = "This is a 中文的 String!";  
  110.   System.out.println("str: " + str);  
  111.   String gbk = test.toGBK(str);  
  112.   System.out.println("转换成GBK码: " + gbk);  
  113.   System.out.println();  
  114.   String ascii = test.toASCII(str);  
  115.   System.out.println("转换成US-ASCII码: " + ascii);  
  116.   gbk = test.changeCharset(ascii,ChangeCharset.US_ASCII, ChangeCharset.GBK);  
  117.   System.out.println("再把ASCII码的字符串转换成GBK码: " + gbk);  
  118.   System.out.println();  
  119.   String iso88591 = test.toISO_8859_1(str);  
  120.   System.out.println("转换成ISO-8859-1码: " + iso88591);  
  121.   gbk = test.changeCharset(iso88591,ChangeCharset.ISO_8859_1, ChangeCharset.GBK);  
  122.   System.out.println("再把ISO-8859-1码的字符串转换成GBK码: " + gbk);  
  123.   System.out.println();  
  124.   String utf8 = test.toUTF_8(str);  
  125.   System.out.println("转换成UTF-8码: " + utf8);  
  126.   gbk = test.changeCharset(utf8,ChangeCharset.UTF_8, ChangeCharset.GBK);  
  127.   System.out.println("再把UTF-8码的字符串转换成GBK码: " + gbk);  
  128.   System.out.println();  
  129.   String utf16be = test.toUTF_16BE(str);  
  130.   System.out.println("转换成UTF-16BE码:" + utf16be);  
  131.   gbk = test.changeCharset(utf16be,ChangeCharset.UTF_16BE, ChangeCharset.GBK);  
  132.   System.out.println("再把UTF-16BE码的字符串转换成GBK码: " + gbk);  
  133.   System.out.println();  
  134.   String utf16le = test.toUTF_16LE(str);  
  135.   System.out.println("转换成UTF-16LE码:" + utf16le);  
  136.   gbk = test.changeCharset(utf16le,ChangeCharset.UTF_16LE, ChangeCharset.GBK);  
  137.   System.out.println("再把UTF-16LE码的字符串转换成GBK码: " + gbk);  
  138.   System.out.println();  
  139.   String utf16 = test.toUTF_16(str);  
  140.   System.out.println("转换成UTF-16码:" + utf16);  
  141.   gbk = test.changeCharset(utf16,ChangeCharset.UTF_16LE, ChangeCharset.GBK);  
  142.   System.out.println("再把UTF-16码的字符串转换成GBK码: " + gbk);  
  143.   String s = new String("中文".getBytes("UTF-8"),"UTF-8");  
  144.   System.out.println(s);  
  145.  }  
  146. }  
   
import java.io.UnsupportedEncodingException;

/**
 * 转换字符串的编码
 */
public class ChangeCharset {
 /** 7位ASCII字符,也叫作ISO646-US、Unicode字符集的基本拉丁块 */
 public static final String US_ASCII = "US-ASCII";

 /** ISO 拉丁字母表 No.1,也叫作 ISO-LATIN-1 */
 public static final String ISO_8859_1 = "ISO-8859-1";

 /** 8 位 UCS 转换格式 */
 public static final String UTF_8 = "UTF-8";

 /** 16 位 UCS 转换格式,Big Endian(最低地址存放高位字节)字节顺序 */
 public static final String UTF_16BE = "UTF-16BE";

 /** 16 位 UCS 转换格式,Little-endian(最高地址存放低位字节)字节顺序 */
 public static final String UTF_16LE = "UTF-16LE";

 /** 16 位 UCS 转换格式,字节顺序由可选的字节顺序标记来标识 */
 public static final String UTF_16 = "UTF-16";

 /** 中文超大字符集 */
 public static final String GBK = "GBK";

 /**
  * 将字符编码转换成US-ASCII码
  */
 public String toASCII(String str) throws UnsupportedEncodingException{
  return this.changeCharset(str, US_ASCII);
 }
 /**
  * 将字符编码转换成ISO-8859-1码
  */
 public String toISO_8859_1(String str) throws UnsupportedEncodingException{
  return this.changeCharset(str, ISO_8859_1);
 }
 /**
  * 将字符编码转换成UTF-8码
  */
 public String toUTF_8(String str) throws UnsupportedEncodingException{
  return this.changeCharset(str, UTF_8);
 }
 /**
  * 将字符编码转换成UTF-16BE码
  */
 public String toUTF_16BE(String str) throws UnsupportedEncodingException{
  return this.changeCharset(str, UTF_16BE);
 }
 /**
  * 将字符编码转换成UTF-16LE码
  */
 public String toUTF_16LE(String str) throws UnsupportedEncodingException{
  return this.changeCharset(str, UTF_16LE);
 }
 /**
  * 将字符编码转换成UTF-16码
  */
 public String toUTF_16(String str) throws UnsupportedEncodingException{
  return this.changeCharset(str, UTF_16);
 }
 /**
  * 将字符编码转换成GBK码
  */
 public String toGBK(String str) throws UnsupportedEncodingException{
  return this.changeCharset(str, GBK);
 }
 
 /**
  * 字符串编码转换的实现方法
  * @param str  待转换编码的字符串
  * @param newCharset 目标编码
  * @return
  * @throws UnsupportedEncodingException
  */
 public String changeCharset(String str, String newCharset)
   throws UnsupportedEncodingException {
  if (str != null) {
   //用默认字符编码解码字符串。
   byte[] bs = str.getBytes();
   //用新的字符编码生成字符串
   return new String(bs, newCharset);
  }
  return null;
 }
 /**
  * 字符串编码转换的实现方法
  * @param str  待转换编码的字符串
  * @param oldCharset 原编码
  * @param newCharset 目标编码
  * @return
  * @throws UnsupportedEncodingException
  */
 public String changeCharset(String str, String oldCharset, String newCharset)
   throws UnsupportedEncodingException {
  if (str != null) {
   //用旧的字符编码解码字符串。解码可能会出现异常。
   byte[] bs = str.getBytes(oldCharset);
   //用新的字符编码生成字符串
   return new String(bs, newCharset);
  }
  return null;
 }

 public static void main(String[] args) throws UnsupportedEncodingException {
  ChangeCharset test = new ChangeCharset();
  String str = "This is a 中文的 String!";
  System.out.println("str: " + str);
  String gbk = test.toGBK(str);
  System.out.println("转换成GBK码: " + gbk);
  System.out.println();
  String ascii = test.toASCII(str);
  System.out.println("转换成US-ASCII码: " + ascii);
  gbk = test.changeCharset(ascii,ChangeCharset.US_ASCII, ChangeCharset.GBK);
  System.out.println("再把ASCII码的字符串转换成GBK码: " + gbk);
  System.out.println();
  String iso88591 = test.toISO_8859_1(str);
  System.out.println("转换成ISO-8859-1码: " + iso88591);
  gbk = test.changeCharset(iso88591,ChangeCharset.ISO_8859_1, ChangeCharset.GBK);
  System.out.println("再把ISO-8859-1码的字符串转换成GBK码: " + gbk);
  System.out.println();
  String utf8 = test.toUTF_8(str);
  System.out.println("转换成UTF-8码: " + utf8);
  gbk = test.changeCharset(utf8,ChangeCharset.UTF_8, ChangeCharset.GBK);
  System.out.println("再把UTF-8码的字符串转换成GBK码: " + gbk);
  System.out.println();
  String utf16be = test.toUTF_16BE(str);
  System.out.println("转换成UTF-16BE码:" + utf16be);
  gbk = test.changeCharset(utf16be,ChangeCharset.UTF_16BE, ChangeCharset.GBK);
  System.out.println("再把UTF-16BE码的字符串转换成GBK码: " + gbk);
  System.out.println();
  String utf16le = test.toUTF_16LE(str);
  System.out.println("转换成UTF-16LE码:" + utf16le);
  gbk = test.changeCharset(utf16le,ChangeCharset.UTF_16LE, ChangeCharset.GBK);
  System.out.println("再把UTF-16LE码的字符串转换成GBK码: " + gbk);
  System.out.println();
  String utf16 = test.toUTF_16(str);
  System.out.println("转换成UTF-16码:" + utf16);
  gbk = test.changeCharset(utf16,ChangeCharset.UTF_16LE, ChangeCharset.GBK);
  System.out.println("再把UTF-16码的字符串转换成GBK码: " + gbk);
  String s = new String("中文".getBytes("UTF-8"),"UTF-8");
  System.out.println(s);
 }
}



------------------------------------------------------------------------------------------------------------------


        java中的String类是按照unicode进行编码的,当使用String(byte[] bytes, String encoding)构造字符串时,encoding所指的是bytes中的数据是按照那种方式编码的,而不是最后产生的String是什么编码方式,换句话说,是让系统把bytes中的数据由encoding编码方式转换成unicode编码。如果不指明,bytes的编码方式将由jdk根据操作系统决定。

        当我们从文件中读数据时,最好使用InputStream方式,然后采用String(byte[] bytes, String encoding)指明文件的编码方式。不要使用Reader方式,因为Reader方式会自动根据jdk指明的编码方式把文件内容转换成unicode编码。

        当我们从数据库中读文本数据时,采用ResultSet.getBytes()方法取得字节数组,同样采用带编码方式的字符串构造方法即可。

ResultSet rs;
bytep[] bytes = rs.getBytes();
String str = new String(bytes, "gb2312");

不要采取下面的步骤。

ResultSet rs;
String str = rs.getString();
str = new String(str.getBytes("iso8859-1"), "gb2312");

        这种编码转换方式效率底。之所以这么做的原因是,ResultSet在getString()方法执行时,默认数据库里的数据编码方式为iso8859-1。系统会把数据依照iso8859-1的编码方式转换成unicode。使用str.getBytes("iso8859-1")把数据还原,然后利用new String(bytes, "gb2312")把数据从gb2312转换成unicode,中间多了好多步骤。

        从HttpRequest中读参数时,利用reqeust.setCharacterEncoding()方法设置编码方式,读出的内容就是正确的了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值