完整的java字符串编码转换代码
package book.String;
import java.io.UnsupportedEncodingException;
/** *//**
* 转换字符串的编码
* @author joe
*
*/
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 转换格式,Litter 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";
public static final String GB2312 = "GB2312";
/** *//** 将字符编码转换成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);
}
/** *//** 将字符编码转换成GB2312 */
public String toGB2312(String str) throws UnsupportedEncodingException ...{
return this.changeCharset(str,GB2312);
}
/** *//**
* 字符串编码转换的实现方法
* @param str 待转换的字符串
* @param newCharset 目标编码
*/
public String changeCharset(String str, String newCharset) throws UnsupportedEncodingException ...{
if(str != null) ...{
//用默认字符编码解码字符串。与系统相关,中文windows默认为GB2312
byte[] bs = str.getBytes();
return new String(bs, newCharset); //用新的字符编码生成字符串
}
return null;
}
/** *//**
* 字符串编码转换的实现方法
* @param str 待转换的字符串
* @param oldCharset 源字符集
* @param newCharset 目标字符集
*/
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);
System.out.println();
String iso88591 = test.toISO_8859_1(str);
System.out.println("转换成ISO-8859-1码:" + iso88591);
System.out.println();
gbk = test.changeCharset(iso88591, ISO_8859_1, GBK);
System.out.println("再把ISO-8859-1码的字符串转换成GBK码:" + gbk);
System.out.println();
String utf8 = test.toUTF_8(str);
System.out.println();
System.out.println("转换成UTF-8码:" + utf8);
String utf16be = test.toUTF_16BE(str);
System.out.println("转换成UTF-16BE码:" + utf16be);
gbk = test.changeCharset(utf16be, UTF_16BE, 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, UTF_16LE, GBK);
System.out.println("再把UTF-16LE编码的字符串转换成GBK码:" + gbk);
System.out.println();
String utf16 = test.toUTF_16(str);
System.out.println("转换成UTF-16码:" + utf16);
String gb2312 = test.changeCharset(utf16, UTF_16, GB2312);
System.out.println("再把UTF-16编码的字符串转换成GB2312码:" + gb2312);
}
}
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()方法设置编码方式,读出的内容就是正确的了 注:
默认是utf8的,这个要看你的操作系统是什么编码的了,我在繁体版Windows下是BIG5的,在简体版下是utf8的,通常在页面返回的值都跟jsp教程页面的编码有关,简体字一般用gb2312,而你用gbk是包括gb2312和big5的;这里的问题的解析为,获得str不是一定是gbk,只是gbk的str能够获得,过滤了非gbk的字符。读取文件的时候,你可以在文件中加入非gbk字符看看(即是乱码)。
完整的java字符串编码转换代码的更多相关文章
- JAVA字符串编码转换常用类
		
无论是对程序的本地化还是国际化,都会涉及到字符编码的转换的问题.尤其在web应用中常常需要处理中文字符,这时就需要进行字符串的编码转换,将字符串编码转换为GBK或者GB2312.一.关键技术点: ...
 - JAVA 字符串编码转换
		
/** * 字符串编码转换的实现方法 * @param str 待转换编码的字符串 * @param newCharset 目标编码 * @return * @throws UnsupportedEn ...
 - java字符串应用之字符串编码转换
		
[转载]原文地址:https://blog.csdn.net/zhouyong80/article/details/1900100 无论是对程序的本地化还是国际化,都会涉及到字符编码的转换的问题.尤其 ...
 - java中字符串编码转换
		
Java 正确的做字符串编码转换 字符串的内部表示? 字符串在java中统一用unicode表示( 即utf-16 LE) , 对于 String s = "你好哦!"; 如果源码 ...
 - java字符编码转换
		
在开发的过程中.字符编码经常令我们头痛.经常会出现各种各样的乱码.以下就介绍java的编码转换和常见的乱码是使用什么样的编码去读取的: 先看一张图片: watermark/2/text/aHR0cDo ...
 - loadrunner 脚本开发-字符串编码转换
		
字符串编码转换 by:授客 QQ:1033553122 相关函数 lr_convert_string_encoding函数 功能:字符串编码转换 原型: int lr_convert_string ...
 - java String编码转换
		
/** * Get XML String of utf-8 * * @return XML-Formed string */ public static String getUTF8XMLString ...
 - java字符串大小写转换的两种方法
		
转载自:飞扬青春sina blogjava字符串大小写转换的两种方法 import java.io..* public class convertToPrintString { pu ...
 - java字符编码转换研究(转)
		
1. 概述 本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等. 在下面的描述中,将以"中文"两个字为例,经查表可以知道其GB2312编码是" ...
 
随机推荐
- Lucene.Net 2.3.1开发介绍 —— 三、索引(六)
			
原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(六) 2.2 Field的Boost 如果说Document的Boost是一条线,那么Field的Boost则是一个点.怎么理解这个点呢 ...
 - 爱在watir(1)----一切从搭讪开始
			
Tom和Coco是有名的加班狂人.Tom加班改bug,Coco加班回归bug. 两人经常加班到很晚,Tom是男孩子,很自然的担负起护送Coco的任务.他打车先送Coco回去,然后自己回家.不过Tom和 ...
 - html ui设计案例
			
1.jquery特效:http://www.5icool.org 2. http://www.open-lib.com/Lib/1992.jsp
 - 研读asp.net排课功能实现学习笔记
			
1.datatable.select 方法,返回的是一个datarow数组 DataRow[] drs = dtHBKC.Select("Subject ...
 - Eclipse 修改maven 仓储Repository位置
			
简述: 使用两个Nexus, 需要配置两份不同的Maven仓库 步骤: 1. 下载新的Maven运行包 2. 进入conf/ 修改setting.xml项 <localRepository> ...
 - hdu 3488  Tour
			
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3488 题意:给你一个N个顶点M条边的带权有向图,要你把该图分成1个或多个不相交的有向环.且所有定点都只 ...
 - WPF 设置WebBrowser控件不弹脚本错误提示框
			
using System.Reflection; using System.Windows; using System.Windows.Controls; using System.Windows.N ...
 - [置顶] C++为什么是C++而不是++C
			
来自<C++ primer> 问:C++为什么是C++而不是++C 答 :C++之名是Rick Mascitti在1983年夏天定名,c说明它的本质实在C语言演化而来的,”++“是C语言的 ...
 - Cocos2d-x 3.1.1 Lua实例-AccelerometerTest(重力加速计)
			
Cocos2d-x 3.1.1 Lua实例-AccelerometerTest(重力加速计) 本篇博客介绍Cocos2d-x的第一个实例--重力加速计測试.效果图(注:这里无法模拟重力感应): --[ ...
 - TRIZ系列-创新原理-29-气动或液压结构原理
			
气动或液压结构原理的详细表述例如以下:1)用气态或液态部件替代固体部件.能够用空气或者水,也能够用气垫或水垫,使这些部件膨胀.这条原理符合系统的动态性进化法则-柔性化.在改造系统时,我们能够尝试将系统 ...