我们经常会遇到编码问题。
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
;
分享到:
相关推荐
它是目前最广泛使用的Unicode编码形式,因为它具有许多优点。UTF8的一个关键特性是它使用不同数量的字节来表示不同的字符。例如,ASCII字符(包含英文、数字和一些基本标点符号)只需要1个字节,而大多数其他Unicode...
该类提供了两个方法来读取 COLB 数据:getCharacterStream() 方法返回按 Unicode 编码的输入流(java.io.Reader 对象),getAsciiStream() 方法返回按 ASCII 编码的输入流(java.io.InputStream 对象)。 在实际...
接下来,我们谈谈Unicode在编程语言中的实现。在Java、Python、C#等现代编程语言中,都默认使用Unicode作为字符串的内部表示。这使得开发者能够轻松处理多语言文本,无需关心具体编码问题。例如,在Python中,字符串...
3. 字符编码:如ASCII、Unicode(UTF-8)等在Java IO中的应用。 4. 对象序列化:如何保存和恢复对象的状态。 5. 缓冲技术:提高数据读写效率的方法。 6. 套接字编程:实现客户端-服务器通信的基础。 7. 多线程I/O:...
2. 对数据源进行编码转换:确保你的数据源(如CSV或数据库)正确编码为UTF-8,避免在读取时产生乱码。 3. 在生成图表的文本元素时,使用对应的编码设置,如: ```java TextAttribute.FONT, new Font("SimSun", Font....
3. 字符型:char(2字节,Unicode编码,可以表示所有字符,如字母、数字、标点符号等)。 4. 布尔型:boolean(非数值型,仅包含两个值,true和false)。 声明变量时,我们需要指定其数据类型和变量名,例如: ```...
- `char` 类型用来存储 Unicode 编码的字符,Unicode 包含了所有常见文字的编码,因此可以存储一个汉字。 8. **用最效率的办法算出2乘以8等于几?** - 使用位移运算符 `来实现乘法操作,如 `2 。这是因为位移...
这时,我们需要使用Unicode编码,它是一个包含所有现代字符的全球性标准。在Unicode中,每个字符都有一个唯一的码点,通常用十六进制表示。比如,中文字符“中”的Unicode码点是U+4E2D,转换为十进制就是20013。 接...
- `char` 类型可以存储中文字符,因为Java中`char`类型采用Unicode编码,一个`char`可以表示一个中文字符。 **9. 用最有效率的方法算出2乘以8等于几?** - 使用位移操作`2 可以快速计算2乘以8的结果。 **10. 请设计...
在与Emoji相关的开发中,理解Unicode和字符编码也至关重要,因为这直接影响到Emoji在不同环境下的表现。这个压缩包可能包含了一个Web应用程序,让用户可以轻松地探索和使用表情包,提升在线沟通的趣味性和效率。
**题目描述**:我们知道Java采用的是Unicode,那么我们在编制中文软件时应注意什么? **注意事项**: 1. **编码格式**:确保项目中的所有文件都使用UTF-8编码格式。 2. **国际化资源文件**:使用属性文件来存储不同...
在Java中,`char`类型使用Unicode编码,一个`char`可以存储一个中文字符。 10. **逻辑操作符(&,|,^)与条件操作符(&&,||)的区别**: - `&`、`|`、`^`是位运算符,分别对应按位与、按位或、按位异或。 - `&&`、`||`...
而字符流则基于Unicode编码,主要用于处理文本数据。字节流包括输入流(InputStream)和输出流(OutputStream),字符流包括Reader和Writer。例如,FileInputStream和FileOutputStream是处理文件的字节流,而 ...
在Java中,当我们从客户端接收数据时,有时数据可能是按照ISO-8859-1编码的。如果我们要正确处理这些数据,需要将其转换为Java默认或者更通用的UTF-8编码。转换的代码如下所示: ```java public static String ...
例如,ASCII编码只支持128个基本字符,而Unicode则包含了全世界几乎所有的字符,因此在处理国际化的软件时,通常选择Unicode编码。 接下来,我们要讨论的是图形输出。图形输出涉及图像和视觉元素的呈现,包括位图和...
在Java中,有`java.net.URLEncoder`类;在PHP中,可以使用`htmlspecialchars`函数等。这些函数和方法能帮助开发者在代码中自动处理HTML转码,确保输出的内容是安全的。 除了基本的转码,还有更高级的概念,比如HTML...
GBK编码在中文字符支持上较全面,但不如Unicode广泛,可能会遇到编码转换的问题。同时,4.4.2版本相对较低,因此在编写代码时要确保对更低版本API的兼容。 通过分析这个例子源码,我们可以学习到如何在Android应用...
在Java中,字符使用Unicode编码,这比ASCII包含更多的字符集,但在这个特定的函数中,只处理ASCII的小写字母部分。 再者,异常处理是一个重要的Java特性。在上述代码中,如果传入的`letter`不在小写字母范围内,...
- `array.sort()`:默认按照字符串的 Unicode 码点顺序对数组元素进行排序。 - 如果需要自定义排序逻辑,可以向 `sort()` 方法传递一个比较函数作为参数。 - **参数使用:** - **比较函数:** 可以接受一个比较...