我们经常会遇到编码问题。
Java
号称国际化的语言,是因为它的
class
文件采用
UTF-8
,而
JVM
运行时使用
UTF-16
(至于为什么
JVM
中要采用
UTF-16
,我没看过
相关的资料,但我猜可能是因为
JAVA
里面一个字符
(char)
就是
16
位的
,而UTF-16正是双字节编码),都是
unicode
的编码。
unicode
的目标就是能支持世界上所有的字符集,也就是说几乎所有的字符集包含的字符在
unicode
中都有对应的编码。在
unicode
中,字符与代码的映射关
系,就是
unicode
字符集,称为
UCS(Unicode Character Set)
,每个
unicode
字符编码称为
code point
(代码点?)。
UTF-8
和
UTF-16
是不同的
UCS
编码方法,
UTF
就是
UCS Transformation Format
。;
在
Java
中,
String
的
getBytes()
方法就是对特定的字符串
(unicode)
按照给定的字符集进行编码(
encode
),
new String()
则可以按照某个字符集将字节流转换回
unicode
(
decode
)。
Java
里面的每一个
String
都是
unicode
编码。
再来看页面,如果不做特殊处理,
Form
的提交就按照页面的
ContentType
设置中的字符集进行编码转换,发送到后台,后台必须利用
req.setCharacterEncoding
来指定参数的编码格式
(
不同的应用服务器应有不同的指定方式
)
,才能正确解码。
Java
里面的
encode
和
decode
都是相对于
unicode
而言的,
encode
的意思是将
char[] --> XXX Encoding byte[]
,
decode
就是由
XXX Encoding byte[] --> char[]
。平常,当我们说
“
将
GBK
编码转换为
UTF-8
编码
”
的时候,实际的意思就是:
GBK Encoding byte[] --> UTF-8 Encoding byte[]
,这种转换只有在需要用
byte[]
传输数据的时候才有意义,否则便是毫无意义的。
首先要说明的一点是:
Java
中的
String
对象就是一个
unicode
编码的字符串。
但是,我们通常会听到有人说:
“
我们需要将
String
由
ISO-8859-1
转换为
GBK
编码
”
,这又是怎么回事呢?实际上,我们并不是
要
“
将
一个由
ISO-8859-1
编码的
String
转换为
GBK
编码的
String”
,反复说明的是,
JAVA
中的
String
都是
unicode
编码的,所以不存在
“ISO- 8859-1
编码的
String”
或
“GBK
编码的
String”
这样的说法。而需要转换的唯一的原因是
String
进行了错误的编码。我们经常会碰到由
ISO-8859- 1
转换为诸如
GBK/UTF-8
等等这样的需求。所谓的转换过程是:
String --> byte[] -->String
。
也许
你非常清楚这个过程的代码:
new String(text.getBytes("ISO-8859-1"),"GBK")
。但是,要真正理解起来并不是那么简单。表面上看似乎很容易理解,
不就是将
text String
对象按照
ISO-8859-1
的方式编码为
byte[]
然后再把它按照
GBK
的方式转换为
String
吗?但是这句代码很容易会被误解为:
“
将
text String
由
ISO-8859-1
转换为
GBK
编码
”
,这种说法是错误的。难道你见过用这样的代码:
new String(text.getBytes("GBK"),"UTF-8")
来对
String
进行编码转换的吗?
之所以你会经常看到
new String(text.getBytes("ISO-8859-1"),"GBK")
这句代码,是因为一个
GBK
的字节流被错误地以
ISO-8859- 1
的方式转换为
String
(
unicode
)了!发生这种情况最普遍的地方是一个
GBK
编码的网页向后台提交数据的时候,就有可能会看到这句代码的出
现。
GBK
的流被错误的当成
ISO-8859-1
的流,所以便得到了一个错误的
String
。由于
ISO-8859-1
是单字节编码,所以每个字节被按照原样转换为
String
,也就是说,虽然这是一个错误的转换,但编码没有改变,所以我们仍然有机会把编码转换回来!所以那句经典的
new String(text.getBytes("ISO-8859-1"),"GBK")
便出现了。
如果系统误以为是其它编码格式,就有可能再也转换不回来了,因为编码转换并不是负负得正那么简单的
原址连接:http://blog.csdn.net/soleghost/archive/2006/07/22/959832.aspx
;
分享到:
相关推荐
Java中文成Unicode码及从Unicode码转成中文
该文档有常用的java汉字unicode编码
此文档为Java中编码方式和Unicode知识总结,对了解学习Java编码的讲解很全面清楚!
Unicode编码Unicode编码Unicode编码Unicode编码Unicode编码Unicode编码Unicode编码Unicode编码Unicode编码Unicode编码Unicode编码Unicode编码Unicode编码Unicode编码Unicode编码Unicode编码Unicode编码
所有中文字Unicode编码区间及常用中文字Unicode编码,在生成随机验证码时可能使用到
Unicode编码所有汉字,解压后打开cmd程序,电脑必须安装java
Unicode 编码范围 各国文字 Unicode 编码范围 各国文字 Unicode 编码范围 各国文字 Unicode 编码范围 各国文字 Unicode 编码范围 各国文字 Unicode 编码范围 各国文字
中文unicode编码表
用Java做的Unicode编码转换器,可以把各国文字转换为Unicode编码,同时也可以反向转换,包含源码。
一、实验目的: 1、掌握数组的定义、初始化与... 1、要求输出UNICODE编码在0-255之间的编码值与相应的字符。 2、使用已知给定的数值初始化一个5X5的二维数组。 3、输出转置前后的数组。 3、实验报告给出完整代码。
TXT电子书批量转换中文Unicode编码,这是一个批量转换的好工具。 有一些人喜欢下电子书。而很多手机不支持直接看电脑上的txt文档,所以.....
最全 Unicode 编码表,带索引。The Unicode Standard, Version 5.0
世界各国文字Unicode编码范围,Unicode 编码范围 各国文字
该程序是Unicode 编码的Java程序。可以直接应用于国际化的编码中,类如:您可以输入“错误管理”,则程序将翻译为\u9519\u8bef\u7ba1\u7406。希望对您有用,谢谢。
Unicode汉字编码表,包含几乎完整的汉字编码,PDF格式。资源分想给0分的,可是没这个选项,只好选择最低的2分。
包括java反编译工具jad.exe和使用手册.txt,与此同时还有反编译后的汉字unicode显示格式转换为字符格式的代码(绝对通过本人测试通过)
java对汉字理得unicode 编码与解码处理
Unicode编码表00
Unicode字符编码表涵盖了所有字符码的范围和Unicode起始位。包含中文字符。
Java显示Unicode特殊字符, protected char base; // 指定我们显示的初始值7 protected Font font = new Font("serif", Font.PLAIN, 18); // 指定缺省的显示字体 protected Font headingfont = new Font(...