文档库 最新最全的文档下载
当前位置:文档库 › 课题_QT 十六进制字符串转化为十六进制编码

课题_QT 十六进制字符串转化为十六进制编码

课题_QT 十六进制字符串转化为十六进制编码

QT 十六进制字符串转化为十六进制编码

/*************************************************

Function: hexStringtoByteArray()

Description: 十六进制字串转化为十六进制编码

Calls: formatString()

Called By:

Input: hex->待转化的十六进制字串

Output: NULL

Return: QByteArray

Others: NULL

*************************************************/

QByteArray Omron::hexStringtoByteArray(QString hex)

{

QByteArray ret;

hex=hex.trimmed();

formatString(hex,2,' ');

QStringList sl=hex.split(" ");

foreach(QString s,sl)

{

if(!s.isEmpty())

ret.append((char)s.toInt(0,16)&0xFF);

}

return ret;

}

/*************************************************

Function: formatString()

Description: 将十六进制字串每字节中间加空格分隔

Calls:

Called By:hexStringtoByteArray()

Input: org->待处理的字串

n->间隔数默认为2

ch->分隔标志,在此取空格

Output: NULL

Return: void

Others: NULL

*************************************************/

void Omron::formatString(QString &org, int n=2, const QChar &ch=QChar(' '))

{

int size= org.size();

int space= qRound(size*1.0/n+0.5)-1;

if(space<=0)

return;

for(int i=0,pos=n;i

{

org.insert(pos,ch);

}

}

java中文乱码字符集

java中文解决大全 Abstract:本文深入分析了Java程序设计中Java编译器对java源文件和JVM对class类文件的编码/解码过程,通过此过程的解析透视出了Java编程中中文问题产生的根本原因,最后给出了建议的最优化的解决Java中文问题的方法。 1.中文问题的来源 计算机最初的操作系统支持的编码是单字节的字符编码,于是,在计算机中一切处理程序最初都是以单字节编码的英文为准进行处理。随着计算机的发展,为了适应世界其它民族的语言(当然包括我们的汉字),人们提出了UNICODE编码,它采用双字节编码,兼容英文字符和其它民族的双字节字符编码,所以,目前,大多数国际性的软件内部均采用UNICODE编码,在软件运行时,它获得本地支持系统(多数时间是操作系统)默认支持的编码格式,然后再将软件内部的UNICODE转化为本地系统默认支持的格式显示出来。Java的JDK和JVM即是如此,我这里说的JDK是指国际版的JDK,我们大多数程序员使用的是国际化的JDK版本,以下所有的JDK均指国际化的JDK版本。我们的汉字是双字节编码语言,为了能让计算机处理中文,我们自己制定的gb2312、GBK、GBK2K等标准以适应计算机处理的需求。所以,大部分的操作系统为了适应我们处理中文的需求,均定制有中文操作系统,它们采用的是GBK,GB2312编码格式以正确显示我们的汉字。如:中文Win2K默认采用的是GBK编码显示,在中文WIN2k中保存文件时默认采用的保存文件的编码格式也是GBK的,即,所有在中文WIN2K中保存的文件它的内部编码默认均采用GBK编码,注意:GBK是在GB2312基础上扩充来的。 由于Java语言内部采用UNICODE编码,所以在JAVA程序运行时,就存在着一个从UNICODE编码和对应的操作系统及浏览器支持的编码格式转换输入、输出的问题,这个转换过程有着一系列的步骤,如果其中任何一步出错,则显示出来的汉字就会出是乱码,这就是我们常见的JAVA中文问题。 同时,Java是一个跨平台的编程语言,也即我们编写的程序不仅能在中文windows上运行,也能在中文Linux等系统上运行,同时也要求能在英文等系统上运行(我们经常看到有人把在中文win2k上编写的JAVA程序,移植到英文Linux上运行)。这种移植操作也会带来中文问题。 还有,有人使用英文的操作系统和英文的IE等浏览器,来运行带中文字符的程序和浏览中文网页,它们本身就不支持中文,也会带来中文问题。 几乎所有的浏览器默认在传递参数时都是以UTF-8编码格式来传递,而不是按中文编码传递,所以,传递中文参数时也会有问题,从而带来乱码现象。

Java中文乱码问题产生原因分析

Java中文乱码问题产生原因分析 在计算机中,只有二进制的数据,不管数据是在内存中,还是在外部存储设备上。对于我们所看到的字符,也是以二进制数据的形式存在的。不同字符对应二进制数的规则,就是字符的编码。字符编码的集合称为字符集。 17.1.1 常用字符集 在早期的计算机系统中,使用的字符非常少,这些字符包括26个英文字母、数字符号和一些常用符号(包括控制符号),对这些字符进行编码,用1个字节就足够了(1个字节可以表示28=256种字符)。然而实际上,表示这些字符,只使用了1个字节的7位,这就是ASCII编码。

1.ASCII ASCII(American Standard Code for Information Interchange,美国信息互换标准代码),是基于常用的英文字符的一套电脑编码系统。每一个ASCII码与一个8位(bit)二进制数对应。其最高位是0,相应的十进制数是0~127。例如,数字字符“0”的编码用十进制数表示就是48。另有128个扩展的ASCII码,最高位都是1,由一些图形和画线符号组成。ASCII是现今最通用的单字节编码系统。 ASCII用一个字节来表示字符,最多能够表示256种字符。随着计算机的普及,许多国家都将本地的语言符号引入到计算机中,扩展了计算机中字符的范围,于是就出现了各种不同的字符集。 2.ISO8859-1 因为ASCII码中缺少£、ü和许多书写其他语言所需的字符,为此,可以通过指定128以后的字符来扩展ASCII码。国际标准组织(ISO)定义了几个不同的字符集,它们是在ASCII码基础上增加了其他语言和地区需要的字符。其中最常用的是ISO8859-1,通常叫做Latin-1。Latin-1包括了书写所有西方欧洲语言不可缺少的附加字符,其中0~127的字符与ASCII码相同。ISO 8859另外定义了14个适用于不同文字的字符集(8859-2到8859-15)。这些字符集共享0~127的ASCII码,只是每个字符集都包含了128~255的其他字符。 3.GB2312和GBK GB2312是中华人民共和国国家标准汉字信息交换用编码,全称《信息交换用汉字编码字符集-基本集》,标准号为GB2312-80,是一个由中华人民共和国国家标准总局发布的关于简化汉字的编码,通行于中国大陆和新加坡,简称国标码。 因为中文字符数量较多,所以采用两个字节来表示一个字符,分别称为高位和低位。为了和ASCII码有所区别,中文字符的每一个字节的最高位都用1来表示。GB2312字符集是几乎所有的中文系统和国际化的软件都支持的中文字符集,也是最基本的中文字符集。它包含了大部分常用的一、二级汉字和9区的符号,其编码范围是高位0xa1-0xfe,低位也是0xa1-0xfe,汉字从0xb0a1开始,结束于0xf 7fe。 为了对更多的字符和符号进行编码,由前电子部科技质量司和国家技术监督局标准化司于1995年12月颁布了GBK(K是“扩展”的汉语拼音第一个字母)编码规范,在新的编码系统里,除了完全兼容GB2312外,还对繁体中文、一些不常用的汉字和许多符号进行了编码。它也是现阶段Windows和其他一些中文操作系统的默认字符集,但并不是所有的国际化软件都支持该字符集。不过要注意的是GBK不是国家标准,它只是规范。GBK字符集包含了20 902个汉字,其编码范围是0x8140-0xfefe。 每个国家(或区域)都规定了计算机信息交换用的字符编码集,这就造成了交流上的困难。想像一下,你发送一封中文邮件给一位远在西班牙的朋友,当邮件通过网络发送出去的时候,你所书写的中文字符会按照本地的字符集GBK转换为二进制编码数据,然后发送出去。当你的朋友接收到邮件(二进制数据)后,查看信件时,会按照他所用系统的字符集,将二进制编码数据解码为字符,然而由于两种字符集之间编码的规则不同,导致转换出现乱码。这是因为,在不同的字符集之间,同样的数字可能对应了不同的符号,也可能在另一种字符集中,该数字没有对应符号。 为了解决上述问题,统一全世界的字符编码,由Unicode协会1制定并发布了Unicode编码。 4.Unicode Unicode(统一的字符编码标准集)使用0~65535的双字节无符号数对每一个字符进行编码。它不仅包含来自英语和其他西欧国家字母表中的常见字母和符号,也包含来自古斯拉夫语、希腊语、希伯来语、阿拉伯语和梵语的字母表。另外还包含汉语和日语的象形汉字和韩国的Hangul音节表。 目前已经定义了40000多个不同的Unicode字符,剩余25000个空缺留给将来扩展使用。其中大约20 1Unicode协会是由IBM、微软、Adobe、SUN、加州大学伯克利分校等公司和组织所组成的非营利性组织。

Java中编码以及Unicode总结

Java中编码以及Unicode总结 1.基本概念 ●bit 位只能是0或者1 ●byte 字节一个字节是8位,1 byte=8 bits 计算机表示的基本单位 ●KB,MB,GB,TB,PB是以1024与byte进行换算 ●进制用符号进行计数十进制、二进制、八进制(011)、十六进制(0xFF) 字符文字和符号的总称 ●字符集多个字符集合的总称。ASCII字符集、GB2312字符集、GBK字符集、BIG5 字符集、GB18003字符集、Unicode字符集 ●byte可表示2^8=256个字符的表示 0 0×00 0000,0000 1 0×01 0000,0001 2 0×01 0000,0010 127 0×7F 0111,1111 -128 0×80 1000,0000 -2 0xFE 1111,1110 -1 0xFF 1111,1111 ●以补码的形式表示的二进制编码。 -2的表示,2=0000,0010,反码1111,1101,补码=反码+1= 1111,1110表示的就是1111,1110-1=1111,1101,取反就是0000,0010也就是2,所以 就是-2 2.字符集和编码 2.1.字符(Character) 字符(Character)是文字与符号的总称,包括文字、图形符号、数学符号等。 2.2.字符集(Character Set) 一组抽象字符的集合就是字符集(Character Set)。字符集常常和一种具体的语言文字对应起来,该文字中的所有字符或者大部分常用字符就构成了该文字的字符集,比如英文字符集。一组有共同特征的字符也可以组成字符集,比如繁体汉字字符集、日文汉字字符集。字符集的子集也是字符集。 计算机要处理各种字符,就需要将字符和二进制内码对应起来,这种对应关系就是字符编码(Encoding)。制定编码首先要确定字符集,并将字符集内的字符排序,然后和二进制数字对应起来。根据字符集内字符的多少,会确定用几个字节来编码。每种编码都限定了一个明确的字符集合,叫做被编码过的字符集(Coded Character Set),这是字符集的另外一个含义。通常所说的字符集大多都是指编码字符集(Coded Character Set)。

java判断文件编码或文本流编码的方法

判定文件编码或文本流编码的方法 在程序中,文本文件经常用来存储标准的ASCII码文本,比如英文、加减乘除等号这些运算符号。文本文件也可能用于存储一些其他非ASCII字符,如基于GBK的简体中文,基于GIG5的繁体中文等等。在存储这些字符时需要正确指定文件的编码格式;而在读取这些文本文件时,有时候就需要自动判定文件的编码格式。 按照给定的字符集存储文本文件时,在文件的最开头的三个字节中就有可能存储着编码信息,所以,基本的原理就是只要读出文件前三个字节,判定这些字节的值,就可以得知其编码的格式。其实,如果项目运行的平台就是中文操作系统,如果这些文本文件在项目内产生,即开发人员可以控制文本的编码格式,只要判定两种常见的编码就可以了:GBK和UTF-8。由于中文Windows默认的编码是GBK,所以一般只要判定UTF-8编码格式。 对于UTF-8编码格式的文本文件,其前3个字节的值就是-17、-69、-65,所以,判定是否是UTF-8编码格式的代码片段如下: Java代码 1java.io.File f=new java.io.File("待判定的文本文件名"); 2try{ 3java.io.InputStream ios=new java.io.FileInputStream(f); 4byte[] b=new byte[3]; 5ios.read(b); 6ios.close(); 7if(b[0]==-17&&b[1]==-69&&b[2]==-65) 8System.out.println(f.getName()+"编码为UTF-8"); 9else System.out.println(f.getName()+"可能是GBK"); 10}catch(Exception e){ 11 e.printStackTrace(); 12} 上述代码只是简单判定了是否是UTF-8格式编码的文本文件,如果项目对要判定的文本文件编码不可控(比如用户上传的一些HTML、XML等文本),可以采用一个现成的开源项目:cpdetector,它所在的网址是:https://www.wendangku.net/doc/8693048.html,/。它的类库很小,只有500K左右,利用该类库判定文本文件的代码如下: Java代码

计算机常见编码

计算机常见编码 一.有关编码的基础知识 1. 位 bit 最小的单元 字节 byte 机器语言的单位 1byte=8bits 1KB=1024byte 1MB=1024KB 1GB=1024MB 2. 二进制 binary 八进制 octal 十进制 decimal 十六进制 hex 3. 字符:是各种文字和符号的总称,包括各个国家的文字,标点符号,图形符号,数字等。 字符集:字符集是多个符号的集合,每个字符集包含的字符个数不同。 字符编码:字符集只是规定了有哪些字符,而最终决定采用哪些字符,每一 个字符用多少字节表示等问题,则是由编码来决定的。计算机要 准确的处理各种字符集文字,需要进行字符编码,以便计算机能 够识别和存储各种文字。 二.常见字符集的编码介绍: 常见的字符集有:ASCII 字符集,GB2312 字符集,BIG5 字符集,GB18030 字符集,Unicode 字符集,下面一一介绍: 1. ASCII 字符集: 定义: 美国信息互换标准代码,是基于罗马字母表的一套电脑编码系统,主要显示 英语和一些西欧语言,是现今最通用的单字节编码系统。 包含内容: 控制字符(回车键,退格,换行键等) 可显示字符(英文大小写,阿拉伯数字,西文符号) 扩展字符集(表格符号,计算符号,希腊字母,拉丁符号) 编码方式: 第 0-31 号及 127 号是控制字符或通讯专用字符; 第 32-126 号是字符,其中 48-57 号为 0-9 十个阿拉伯数字,65-90 号为 26 个大写英文字母,97-122 号为 26 个英文小写字母,其余为一些标点符号,运 算符号等。 在计算机存储单元中,一个 ASCII 码值占一个字节(8 个二进制位),最高位 是用作奇偶检验位。【奇偶校验是指:在代码传送的过程中,用来检验是否 出错的一种方法。】奇偶校验分为奇校验和偶校验。奇校验规定:正确的代 码一个字节中 1 的个数必须是奇数,若非奇数,则在最高位添 1;偶校验规 定:正确的代码一个字节中 1 的个数必须是奇数,若非奇数,则在最高位添 1。

java字符集编码

ASCII(American Standard Code for Information Interchange,美国信息互换标准代码),是基于常用的英文字符的一套电脑编码系统。我们知道英文中经常使用的字符、数字符号被计算机处理时都是以二进制码的形式出现的。这种二进制码的集合就是所谓的ASCII码。每一个ASCII码与一个8位(bit)二进制数对应。其最高位是0,相应的十进制数是0-127。如,数字“0”的编码用十进制数表示就是48。另有128个扩展的ASCII码,最高位都是1,由一些制表符和其它符号组成。ASCII是现今最通用的单字节编码系统。 GB2312:GB2312码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集-基本集》。主要用于给每一个中文字符指定相应的数字,也就是进行编码。一个中文字符用两个字节的数字来表示,为了和ASCII码有所区别,将中文字符每一个字节的最高位置都用1来表示。 GBK:为了对更多的字符进行编码,国家又发布了新的编码系统GBK(GBK的K是“扩展”的汉语拼音第一个字母)。在新的编码系统里,除了完全兼容GB2312 外,还对繁体中文、一些不常用的汉字和许多符号进行了编码。 ISO-8859-1:是西方国家所使用的字符编码集,是一种单字节的字符集,而英文实际上只用了其中数字小于128的部分。 Unicode:这是一种通用的字符集,对所有语言的文字进行了统一编码,对每一个字符都用2个字节来表示,对于英文字符采取前面加“0”字节的策略实现等长兼容。如“a” 的ASCII码为0x61,UNICODE 就为0x00,0x61。 UTF-8:Eight-bit UCS Transformation Format,(UCS,Universal Character Set,通用字符集,UCS 是所有其他字符集标准的一个超集)。一个7位的ASCII码值,对应的UTF码是一个字节。如果字符是 0x0000,或在0x0080与0x007f之间,对应的UTF码是两个字节,如果字符在0x0800与0xffff之间,对应的UTF码是三个字节。 我们运行java程序时,JVM有自己所支持的编码种类,用以下代码可以看到: Map m=Charset.availableCharsets(); Set names=m.keySet(); Iterator it=names.iterator(); while(it.hasNext()) { System.out.println(it.next()); } 然后可以通过以下代码看到我们目前JVM所使用的编码: Properties pps=System.getProperties(); pps.list(System.out); 具体来说什么是编码,什么是解码? 在InputStreamReader JDK有这样描述:It reads bytes and decodes them into characters using a specified charset.(用指定的字符集将字节数组解码成字符串)。 相反OutputStreamWriter 描述:Characters written to it are encoded into bytes using a specified charset.(用指定的字符集将字符串编码成字节数组)。 理解这个以后一切好办了啦!

Java中的字符集编码入门(二)编码字符集与字符集编码的区别

需要再一次强调的是,无论历史上的UCS还是现如今的Unicode,两者指的都是编码字符集,而不是字符集编码。花费一点时间来理解好这件事,然后你会发现对所有网页的,系统的,编码标准之间的来回转换等等繁杂事务都会思路清晰,手到擒来。 首先说说最一般意义上的字符集。 一个抽象字符集其实就是指字符的集合,例如所有的英文字母是一个抽象字符集,所有的汉字是一个抽象字符集,当然,把全世界所有语言的符号都放在一起,也可以称为一个抽象字符集,所以这个划分是相当人为的。之所以说“抽象”二字,是因为这里所提及的字符不是任何具体形式的字符,拿汉字中的“汉”这个字符来说,您在这篇文章中看到的这个“汉”其实是这个字符的一种具体表现形式,是它的图像表现形式,而且它是用中文(而非拼音)书写而成,使用宋体外观;而当人们用嘴发出“汉”这个音的时候,他们是在使用“汉”的另一种具体表现形式——声音,但无论如何,两者所指的字符都是“汉”这个字。同一个字符的表现形式可能有无数种(点阵表示,矢量表示,音频表示,楷体,草书等等等等),把每一种表现形式下的同一个字符都纳入到字符集中,会使得集合过于庞大,冗余高,也不好管理。因此抽象字符集中的字符,都是指唯一存在的抽象字符,而忽略它的具体表现形式。 抽象字符集中的诸多字符,没有顺序之分,谁也不能说哪个字符在哪个字符前面,而且这种抽象字符只有人能理解。在给一个抽象字符集合中的每个字符都分配一个整数编号之后(注意这个整数并没有要求大小),这个字符集就有了顺序,就成为了编码字符集。同时,通过这个编号,可以唯一确定到底指的是哪一个字符。当然,对于同一个字符,不同的字符集所制定的整数编号也不尽相同,例如“儿”这个字,在Unicode中,它的编号是0x513F,(为方便起见,以十六进制表示,但这个整数编号并不要求必须是以十六进制表示)意思是说它是Unicode这个编码字符集中的第0x513F个字符。而在另一种编码字符集比如Big5中,这个字就是第0xA449个字符了。这种情况的另一面是,许多字符在不同的编码字符集中被分配了相同的整数编号,例如英文字母“A”,在ASCII及Unicode中,

JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换

【适用范围】 适用EOS所有版本,操作系统不限,数据库不限 【问题描述和定位】 JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换 【解决方案和步骤】 1、函数介绍 在Java中,字符串用统一的Unicode编码,每个字符占用两个字节,与编码有关的两个主要函数为:1)将字符串用指定的编码集合解析成字节数组,完成Unicode-〉charsetName转换 public byte[] getBytes(String charsetName) throws UnsupportedEncodingException 2)将字节数组以指定的编码集合构造成字符串,完成charsetName-〉Unicode转换 public String(byte[] bytes, String charsetName) throws UnsupportedEncodingException 2、Unicode与各编码之间的直接转换 下面以对中文字符串"a中文"的编码转换为例,来了解各种编码之间的转换 1)Unicode和GBK 测试结果如下,每个汉字转换为两个字节,且是可逆的,即通过字节可以转换回字符串 String-GBK〉ByteArray:\u0061\u4E2D\u6587(a中文)-〉0x61 0xD6 0xD0 0xCE 0xC4 ByteArray-GBK〉String:0x61 0xD6 0xD0 0xCE 0xC4-〉\u0061\u4E2D\u6587(a中文)2)Unicode和UTF-8 测试结果如下,每个汉字转换为三个字节,且是可逆的,即通过字节可以转换回字符串 String-UTF-8〉ByteArray:\u0061\u4E2D\u6587(a中文)-〉0x61 0xE4 0xB8 0xAD 0xE 6%0x96 0x87 ByteArray-UTF-8〉String:0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87-〉\u0061\u4E2D\u6 587(a中文)

Java中的字符集编码入门(五)Java代码中的字符编码转换Part 1

如果你是JVM的设计者,让你来决定JVM中所有字符的表示形式,你会不会允许使用各种编码方式的字符并存? 我想你的答案是不会,如果在内存中的Java字符可以以GB2312,UTF-16,BIG5等各种编码形式存在,那么对开发者来说,连进行最基本的字符串打印、连接等操作都会寸步难行。例如一个GB2312的字符串后面连接一个UTF-8的字符串,那么连接后的最终结果应该是什么编码的呢?你选哪一个都没有道理。 因此牢记下面这句话,这也是Java开发者的共同意志:在Java中,字符只以一种编码形式存在,那就是UTF-16。 但“在Java中”到底是指在哪里呢?就是指在JVM中,在内存中,在你的代码里声明的每一个char,String类型的变量中。例如你在程序中这样写 char han='汉'; 在内存的相应区域,这个字符就表示为0x6C49。可以用下面的代码证明一下: char han='汉'; System.out.format("%x",(short)han); 输出是: 6c49 反过来用UTF-16编码来指定一个字符也可以,像这样: char han=0x6c49; System.out.println(han); 输出是: 汉 这其实也是说,只要你正确的读入了“汉”这个字,那么它在内存中的表示形式一定是0x6C49,没有任何其他的值能代表这个字(当然,如果你读错了,那结果是什么就不知道了,范伟说:读,读错了呀,那还等于好几亿呢;本山大哥说:好几亿你也没答上,请听下一题)。 JVM的这种约定使得一个字符存在的世界分为了两部分:JVM内部和OS的文件系统。在JVM内部,统一使用UTF-16表示,当这个字符被从JVM内部移到外部(即保存为文件系统中的一个文件的内容时),就进行了编码转换,使用了具体的编码方案(也有一种很特殊的情况,使得在JVM内部也需要转换,不过这个是后话)。 因此可以说,所有的编码转换就只发生在边界的地方,JVM和OS的交界处,也就是你的各种输入输出流(或者Reader,Writer类)起作用的地方。 话头扯到这里就必须接着说Java的IO系统。 尽管看上去混乱繁杂,但是所有的IO基本上可以分为两大阵营:面向字符的Reader啊Wrtier啊,以及面向字节的输入输出流。 下面我来逐一分解,其实一点也不难。 面向字符和面向字节中的所谓“面向”什么,是指这些类在处理输入输出的时候,

WEB开发中的JAVA字符编码经验总结

WEB开发中的JA V A字符编码经验总结 一、概要 在JAVA应用程序特别是基于WEB的程序中,经常遇到字符的编码问题。为了防止出 现乱码,首先需要了解JAVA是如何处理字符的,这样就可以有目的地在输入/输出环节中增加必要的转码。其次,由于各种服务器有不同的处理方式,还需要多做试验,确保使用 中不出现乱码。 二、基本概念 2.1 JAVA中字符的表达 JAVA中有char、byte、String这几个概念。char 指的是一个UNICODE字符,为16 位的整数。byte 是字节,字符串在网络传输或存储前需要转换为byte数组。在从网络接 收或从存储设备读取后需要将byte数组转换成String。String是字符串,可以看成是由char组成的数组。String 和 char 为内存形式,byte是网络传输或存储的序列化形式。举例: 英 String ying = “英”; char ying = ying.charAt(0); String yingHex = Integer.toHexString(ying); 82 F1 byte yingGBBytes = ying.getBytes(“GBK”); GB编码的字节数值 D3 A2 2.2 编码方式的简介 String序列化成byte数组或反序列化时需要选择正确的编码方式。如果编码方式不 正确,就会得到一些0x3F的值。常用的字符编码方式有ISO8859_1、GB2312、GBK、 UTF-8/UTF-16/UTF-32。 ISO8859_1用来编码拉丁文,它由单字节(0-255)组成。 GB2312、GBK用来编码简体中文,它有单字节和双字节混合组成。最高位为1的字节 和下一个字节构成一个汉字,最高位为0的字节是ASCII码。 UTF-8/UTF-16/UTF-32是国际标准UNICODE的编码方式。用得最多的是UTF-8,主要是因为它在对拉丁文编码时节约空间。 UNICODE值 UTF-8编码 U-00000000 - U-0000007F: 0xxxxxxx U-00000080 - U-000007FF: 110xxxxx 10xxxxxx U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

java中文乱码终极解决方案

中文乱码终极解决方案 乱码问题好像跟我们中国程序员特别有缘,一直困扰着我们,从开始的JSP乱码问题,STRUTS乱码问题,到现在的AJAX乱码问题,无一不是搞得许多程序员焦头烂额的,整天骂XXX产品对中文支持不了,UTF-8无法使用中文啊什么的,其实这里面被骂的产品中其实99%以上是对中文支持非常好的,而出现乱码的原因只是因为自身对国际化支持以及文件编码等信息的认识不知造成的。要知道一个产品那么流行,怎么可能对中文支持不了呢,下面就开始一一帮大家解决这些问题。 1 、编码 --想要解决好中文问题,对编码肯定是不能一概不懂了,编码是解决中文乱码问题的根本。 编码比较常用的有: UTF-8 , GBK , GB2312 , ISO-8859-1 ,除了 iso-8859-1 之外的其它三个编码都能很好的支持中文,但它们都兼容 ISO-8859-1 的编码(就是说无论编码怎么改变,只要是 ISO-8859-1 中的字符,永远不会出现乱码)。 这四种编码中, GB2312 是中国规定的汉字编码,也可以说是简体中文的字符集编码 ; GBK 是 GB2312 的扩展 , 除了兼容 GB2312 外,它还能显示繁体中文,还有日文的假名 ; 而 UTF-8 虽然也支持中文,但却与 GB 码不兼容(编码值不同)。 UTF-8 使用的是可变长的 UNICODE 编码,编码可能是 1 位 16 进制(即 ISO-8859-1 中的字符,其编码也是相同的)也有可能是 2 位或 3 位的 16 进制。 UTF-8 的优点是:1 、与 CPU 字节顺序无关 , 可以在不同平台之间交流。 2 、容错能力高 , 任何一个字节损坏后 , 最多只会导致一个编码码位损失 , 不会链锁错误 ( 如 GB 码错一个字节就会整行乱码 ) ,所以在国际化处理中基本都是建议使用 UTF-8 作为编码。 2、文件的编码 --虽然说只要设置了正确的编码就可以使字符正确显示了,但如果忽略了文件保存时的编码的话,那可是会让你走进迷雾中的。 文件编码最常使用的有两种:ANSI和UTF-8,光看名字估计你都可以猜到了,ANSI就是我们保存文件时使用的默认编码,而UTF-8则需自己设置。对于编码的改变,我使用的工具是NOTEPAD和ECLIPSE,NOTEPAD 使用最简单,只要打开文件后在另存为中选择相应的编码就行了,而且它对编码的支持非常好;而在ECLIPSE 中,只要稍微设置一下就行了,打开首选项,然后选择:常规->内容类型(ContentType),在右边选中你想改变保存编码的文件类型,然后在下方的缺省编码中改变其值,最后点击更新(UPDATE)按钮即可。 而在其它的编辑器中,默认保存的内容都是GB2312或者GBK(NOTEPAD中对应ANSI).而根据前面所说的UTF-8和GBK,GB2312等的编码值是不同的这一点,可以知道,如果文件使用了UTF-8,那么字符编码就必须使用UTF-8,否则编码值的不同就可能造成乱码。而这也就是为什么那么多的人使用了UTF-8编码后还会产生乱码的根本原因。(JS和JSP都是这个道理) 3、JSP,STRUTS等的中文乱码解决方案 其实解决的方法只有一个: request.setCharacterEncoding(encoding); 方法只有一种,但处理方式就多种多样了,初学者会在JSP页面上直接使用,而有经验的程序员会使用过滤器。而现在所要说的方法也是过滤器。这里以统一使用UTF-8作为编码作为例子说明。具体过程就不多说了,网上有很多教程。偷懒一点的,到TOMCAT中复制就行了。在TOMCAT的目录下的 \webapps\jsp-examples\WEB-INF\classes\filters\找到SetCharacterEncodingFilter.java 这个类,放到你的程序中并配置好映射路径。配置好后基本上你的乱码问题就解决了。但要映射路径中需要注意的就是不能使用 '*' < filter-mapping > < filter-name > Set Character Encoding

相关文档