`
mj914
  • 浏览: 34393 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java utf-8转码解码问题

阅读更多

总结:servlet 当路径中有%%的时候 会自动进行url解码。具体请看我的工作日志

utf8, gbk, iso8859-1编码

1. sData.getBytes();和sData.getBytes("gbk")作用是一样(如果你是中文系统的话) 因为中文系统内码(即默认编码)一般是GBK。而getBytes()的意思是把串生成某个编码的字节流,并转换成byte数组。
2.sData = new String(sData.getBytes("iso8859-1"), "gbk");
这句的意思是告诉 java,请把它生成ISO-8859-1编码的字节流数组,在new String的时候传入GBK这个参数,告诉编译器这个byte数组其实是以gbk编码的,这样new String的时候编译器就可以正确的把它转换成Unicode了,因为java中string是unicode编码的
3.sData = new String(sData.getBytes("gbk"), "UTF8");
为什么这样写不对呢?先说new String(sData.getBytes("iso8859-1"), "gbk");。先看你把文件内容读到String中的时候,你需要告诉Java把你文件内容看作是ISO-8859-1编码的(其实是GBK或Unicode或其他),而因为ISO-8859-1是一个字节的,所以读文件内容并转换为sData的时候,java只是把每个字节前加 0x00组成unicode,所以后来当用这句sData.getBytes("iso8859-1")都可以解析出原来的字节,就是说信息不会丢失,因为只是把0x00去掉而已。(这个过程就好象加密解密)但是注意这串字节流实际上不是ISO-8859-1的(但java并不知道)。
而GBK是1-2字节的,如果你文件是UTF-8(1-6字节),那么你告诉java这个文件内容是GBK的,java就以GBK编码去读入这串字节流,但是这里会发生信息丢失或错乱,因为这个字节流并不是GBK的,而是UTF-8的,然后再用new String(sData.getBytes("gbk"), "UTF8");显然就恢复不了了。
你可以做个试验保存个GBK的文件,用UTF-8去读,然后new String(sData.getBytes("UTF-8"), "GBK");也肯定是不行的。所以只有ISO-8859-1才可以这么做

 

GBK和Unicode都兼容ISO-8859-1,但这并不是 new String(sData.getBytes("iso8859-1"), "gbk");可以运行的原因。因为在从文件读入的时候,其实就已经按ISO-8859-1编码读入那些中文了,ISO-8859-1并不兼容GBK,所以按兼容来解释的话,那么这里就应该已经出错了。但是事实上并没有出错,但是因为ISO-8859-1是单个字节的,它把每个字节认作一个字符读入,这样不会丢失信息。
也就是说比如:你的文件内容是“hello你好"那么java以ISO-8859-1读入的时候,会认为这里有9个字符,然后转换为Unicode(String是unicode的),还是9个字符但是就变成18个字节了。
然后用sData.getBytes("ISO-8859-1"),还是可以恢复成原来的摸样,仍然是9个字节。
这样字节信息没有丢失,于是就可以顺利的以GBK解析并把它转换成java中的String。

分享到:
评论

相关推荐

    Java 程序转码(UTF-8)

    本文将围绕Java程序中的UTF-8转码进行深入探讨,包括理论背景、具体实现方法以及示例代码分析。 #### 二、基础知识 ##### 1. 字符编码概述 字符编码是计算机用来表示字符集的一种方式。常见的字符编码有ASCII、GB...

    快速转码(UTF-8转ASCII)

    本文将详细介绍“快速转码(UTF-8转ASCII)”这一主题,以及如何在Java Web开发中实现这个过程。 首先,我们要理解UTF-8和ASCII编码的区别。ASCII(American Standard Code for Information Interchange,美国信息...

    GB13000 UCS-2格式转UTF-8

    身份证读卡器生成的基本信息TEXT文件,由于是采用 GB 13000 的 UCS-2 编码格式,java读取出来是乱码,这个段代码就是解决转码问题的,亲测可用

    java转码工具类CharCode.java(解码URL中的中文,默认使用UTF-8进行解码,编码)

    解码 说明:本方法保证 不论参数s是否经过escape()编码,均能得到正确的“解码”结果。另外如果出现了Erro—Parameters: Character decoding failed. 请使用escape(escape(s)...解码URL中的中文,默认使用UTF-8进行解码

    Android UTF-8转码实例详解

    这篇“Android UTF-8转码实例详解”将深入探讨如何在Android环境中进行UTF-8编码和解码。 首先,了解UTF-8编码的基本原理。UTF-8是一种变长编码,它根据字符的Unicode码点长度使用1到4个字节。ASCII字符(如英文...

    批量将Java源代码文件的编码从GBK转为UTF-8

    标题提到的“批量将Java源代码文件的编码从GBK转为UTF-8”是一个常见的需求,因为GBK编码是中国大陆广泛使用的编码方式,但它并不兼容Unicode,而UTF-8编码则是一种更通用的Unicode实现,能兼容多种语言字符。...

    java 解决异常 2 字节的 UTF-8 序列的字节2 无效的问题

    3. **转码**:可以尝试将文件内容从其他编码转换为UTF-8,例如使用Java的`java.nio.charset.Charset`类的`newDecoder()`和`newEncoder()`方法。 4. **修正XML内容**:检查XML文件中的特殊字符,确保它们符合UTF-8...

    java中文乱码之解决URL中文乱码问题的方法

    - **一次转码**:使用`encodeURI()` 对URL进行编码,然后在服务器端使用适当的解码方法,如Java中的`new String(name.getBytes("ISO-8859-1"), "UTF-8")`,确保从ISO-8859-1转回UTF-8。 - **二次转码**:先使用`...

    JS实现对中文字符串进行utf-8的Base64编码的方法(使其与Java编码相同)

    这是因为中文字符在不同的环境和编程语言中可能会有不同的表示方式,比如JavaScript默认处理的是UTF-16编码,而Java则通常使用UTF-8编码。 在Java中,对中文字符串进行Base64编码时,我们需要先将字符串转换为字节...

    文件编码转换器(支持utf-8、gb2321等多种编码互转)

    本工具名为“文件编码转换器”,专为解决不同编码之间的互转问题,尤其支持UTF-8和GB2321这两种常见的编码格式。 UTF-8是一种广泛使用的Unicode编码,它的特点是可变长度,能够表示Unicode字符集中所有的140多万个...

    java转码

    1. `Charset` 类:Java的`java.nio.charset`包提供了一个`Charset`类,它代表一种字符集,如UTF-8或GBK。这个类提供了对字符编码和解码的支持。 2. `InputStreamReader` 和 `OutputStreamWriter`:这两个类是Java ...

    java转码工具

    Java转码工具是一种基于Java语言开发的实用程序,主要用于处理字符编码问题,特别是将文本文件在GB2312和UTF-8编码格式之间进行转换。在计算机领域,字符编码是决定如何用二进制数据表示字符的标准,不同的编码方式...

    自己写的用于Servlet中doGet方法转码

    例如,如果请求参数是用GBK编码的,但我们的应用期望的是UTF-8编码,我们就需要进行转码以避免乱码问题。这里提到的`charset`包下的`charset`类,可能是作者自定义的一个工具类,用于帮助完成这个任务。 `charset`...

    GBK转UTF_8

    这里的主题是"GBK转UTF-8",这是一个关于字符编码格式转换的问题。GBK是中国大陆广泛使用的汉字编码标准,而UTF-8是Unicode的一种变长编码方式,支持全球多种语言,包括汉字,且在互联网上被普遍采用。 GBK全称为...

    jsp中页面间传汉字参数转码的方法.docx

    这里的`URLEncoder.encode(str_test, "UTF-8")`将`str_test`字符串按照UTF-8编码格式转码,并将结果插入到表单的action属性中。 二、解码 接收端的页面(如`b.jsp`)需要解码接收到的参数。在JSP中,这可以通过`...

    J2ee应用中文乱码问题解决方案.doc

    - **转码**:在数据交换的各个阶段进行编码转换,例如,将请求参数从ISO-8859-1转为UTF-8,再存入数据库。 - **统一编码**:尽可能在整个应用程序中统一使用UTF-8,包括JSP、HTML、Servlet、数据库及文件系统。 4...

    中文乱码解决方案参考.pdf

    如Java代码所示,使用`URLEncoder.encode()`和`URLDecoder.decode()`,先将UTF-8编码的字符串转换为ISO-8859-1编码的字节数组,然后再解码回字符串。但是,这种转换可能不完全准确,特别是对于GBK和其他编码方式,...

    汉字转码实例

    在处理不同编码格式的数据时,如从GBK编码的文本文件读取数据并将其保存为UTF-8编码的文件,或者在网页显示时解决编码不兼容问题,都需要进行转码操作。 总结来说,汉字转码是中文信息处理的重要环节,理解并掌握...

    java项目jsp中乱码问题解决

    charset=utf-8"%>`指令,指示JSP使用UTF-8编码进行内容显示。同时,为了确保浏览器正确解析页面,可以在HTML的`<head>`部分添加`<meta http-equiv="Content-Type" content="text/html; charset=utf-8">`标签。此外...

Global site tag (gtag.js) - Google Analytics