`
hz_chenwenbiao
  • 浏览: 1006426 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

GBK与UTF-8 转换乱码详解(转)

阅读更多
getBytes 的功能是将字符转换成字节数组, 
gbk.getBytes("GB2312") 用GB2312翻译成字节数组, 
new String(gbk.getBytes("GB2312"),"UTF-8"); 
把用GB2312翻译成字节数组,再用UTF-8翻译成字符串。 
兄弟你想下,这里有没有问题? 
这就是乱码的原因。 

下面再分析下你具体的问题: 
GB23121 -》ISO-8859 两个字节到一个字节 
反过来,再一个字节到两个字节,不会有问题, 
因为翻译时,个数不会多也不会少。 

再看GBK -》UTF-8 两个字节翻译的字节数组现在要用三个字节翻译 
就是说你 4个字节给人家 人家是一次要三个,出现什么情况? 
拿了三个 剩下一个不够,人家就自己去添加。 
你再翻译回来的时候就是 6个字节了,也说明为什么变成了三个字

提供一个转换方法:
public byte[] gbk2utf8(String chenese){
    char c[] = chenese.toCharArray();
            byte [] fullByte =new byte[3*c.length];
            for(int i=0; i<c.length; i++){
             int m = (int)c[i];
             String word = Integer.toBinaryString(m);
            // System.out.println(word);
             
             StringBuffer sb = new StringBuffer();
             int len = 16 - word.length();
             //补零
             for(int j=0; j<len; j++){
              sb.append("0");
             }
             sb.append(word);
             sb.insert(0, "1110");
             sb.insert(8, "10");
             sb.insert(16, "10");
             
//             System.out.println(sb.toString());
             
             String s1 = sb.substring(0, 8);          
             String s2 = sb.substring(8, 16);          
             String s3 = sb.substring(16);
             
             byte b0 = Integer.valueOf(s1, 2).byteValue();
             byte b1 = Integer.valueOf(s2, 2).byteValue();
             byte b2 = Integer.valueOf(s3, 2).byteValue();
             byte[] bf = new byte[3];
             bf[0] = b0;
             fullByte[i*3] = bf[0];
             bf[1] = b1;
             fullByte[i*3+1] = bf[1];
             bf[2] = b2;
             fullByte[i*3+2] = bf[2];
             
            }
            return fullByte;
    } 

 应该编码转换的时候丢失了字节,你没有发现你输入的是偶数个字的时候正常,奇数个的时候乱码,具体的字码长度我也不是很了解
String str1 = new String(str.getBytes("UTF-8"),"GBK");
System.out.println(str1.length());
String str2 = new String(str1.getBytes("GBK"),"UTF-8");
System.out.println(str2.length());); 打印出来的字符串长度就不一样的
UTF8每个汉字占用3个字节,这样在某些地方文字个数的计算就和GBK编码的不一样,UTF-8使用可变长度字节来储存 Unicode字符,例如ASCII字母继续使用1字节储存,重音文字、希腊字母或西里尔字母等使用2字节来储存,而常用的汉字就要使用3字节。辅助平面字符则使用4字节。 GB 18030标准采用单字节、双字节和四字节三种方式对字符编码。单字节部分使用0×00至0×7F码(对应于ASCII码的相应码)。双字节部分,首字节码从0×81至0×FE,尾字节码位分别是0×40至0×7E和0×80至0×FE。四字节部分采用GB/T 11383未采用的0×30到0×39作为对双字节编码扩充的后缀,这样扩充的四字节编码,其范围为0×81308130到0×FE39FE39。其中第一、三个字节编码码位均为0×81至0×FE,第二、四个字节编码码位均为0×30至0×39。
按照程序员的称呼,GB2312、GBK到GB18030都属于双字节字符集 (DBCS)。

 

载自:http://jlins.iteye.com/blog/574670

分享到:
评论

相关推荐

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

    ### JAVA字符编码详解:Unicode, ISO-8859-1, GBK, UTF-8 及其相互转换 #### 一、引言 在Java编程中,字符编码的管理和转换是一项基本而又重要的任务。不同的编码标准适用于不同的场景,而理解和掌握这些编码之间...

    如何将编码转换为UTF-8

    "UTF-8 编码转换详解" 1. UTF-8 编码的重要性:在 WEB 开发中,UTF-8 编码扮演着非常重要的角色,特别是在传递中文时,必须经过编码的动作,否则可能会出现乱码的情况。 2. 使用 URLEncoder.encode() 方法:在 ...

    豆葵 GB/BIG5/UTF-8 文件编码批量转换工具

    《豆葵 GB/BIG5/UTF-8 文件编码批量转换工具详解》 在信息技术领域,文件编码是一个重要的概念,不同的编码格式适用于不同的场景,如GBK(兼容GB2312)、BIG5(主要应用于繁体中文)和UTF-8(全球通用的多语言编码...

    gbk_utf8_unicode.zip

    这个转换过程通常涉及查找每个UTF-8字符对应的GBK编码值,并用GBK编码的字节序列替换原UTF-8序列。 压缩包中的"gbk_utf8_unicode.c"和"gbk_utf8_unicode.h"文件很可能包含了实现这种转换的函数和相关配置。在实际...

    Android UTF-8转码实例详解

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

    JEECMS 3.04 模版标签字符 GBK UTF8对照

    在"JEECMS 3.04 模版标签字符 GBK UTF8对照"中,提供了将GBK编码的模板标签转换为UTF-8编码的对照表。开发者可以通过这个对照表,将原有的GBK编码模版标签转换成UTF-8,以确保在Unix环境下正常工作。这个过程通常...

    java中文乱码问题详解--- java中文乱码问题详解

    客户端发送的数据和服务器端接收的数据可能存在编码不一致的情况,尤其是在处理HTTP请求时,若没有明确指定字符集,浏览器通常会默认使用UTF-8编码进行传输,这可能导致服务器接收到的数据出现乱码。 4. **数据库...

    asp下UTF-8页面乱码的解决方法

    ### ASP 下 UTF-8 页面乱码的解决方法详解 #### 一、引言 在Web开发过程中,尤其是早期使用ASP进行开发的时候,遇到字符编码问题是很常见的。其中一种典型的问题就是在ASP环境下使用UTF-8编码时出现的乱码现象。...

    PHP实例开发源码——织梦内容管理系统DedeCms UTF-8升级程序.zip

    GBK到UTF-8的转换涉及数据库表结构的更改,包括表的字符集设置、字段的字符集设置,以及数据的重新编码。 5. 数据库升级:升级过程中,需要对数据库中的所有表进行字符集转换,确保数据在新的编码环境下能够正确...

    Java中压缩与解压--中文文件名乱码解决办法

    这里通过`getUTF8Bytes()`方法获取UTF-8编码的字节数组,以确保在无法使用指定编码时可以回退到UTF-8编码。 ### 2. 自定义ZipInputStream类(CnZipInputStream) #### (1) 创建并修改CnZipInputStream类 同样地,从...

    Java乱码问题

    例如,当源代码文件使用一种编码格式存储(如GBK),而编译器或解释器期望使用另一种编码格式(如UTF-8)时,就可能出现乱码问题。 #### 解决方案 针对Java乱码问题,可以通过以下几种方式进行处理: ##### 方法...

    Linux下中文文件名乱码问题的详解 - CSDN博客1

    他们发现,Windows系统默认使用GBK编码,而Linux默认使用UTF-8编码,因此在处理文件名时需要进行编码转换。作者提供了一个自定义的`path_info()`函数来替代原生的`pathinfo`函数,以确保在处理中文文件名时能正确...

    开发wap注意事项---wml中文乱码

    常见的字符编码包括GBK、GB2312、UTF-8等。 ##### 2.2 请求参数乱码 当用户通过表单提交数据时,如果表单数据的编码与服务器端处理数据的编码不一致,也会导致中文乱码。例如,当表单使用POST方法提交数据时,如果...

    iconv.rar - 编码转换工具

    例如,要将一个名为“example.txt”的GBK编码文件转换为UTF-8编码,可以运行`iconv -f GBK -t UTF-8 example.txt &gt; example_utf8.txt`。如果源文件和目标文件在同一目录下,且希望覆盖原文件,可以省略输出文件名。 ...

    帝国cms7.2批量提取关键词包含utf和gbk版本.zip

    简体GBK版适用于使用GBK编码的帝国CMS7.2系统,而简体UTF-8版则用于UTF-8编码的系统。这两个版本的工具可以满足不同编码环境下关键词提取的需求,确保在不同环境下都能正确处理中文字符。 总的来说,"帝国CMS7.2...

    编码、乱码、emoji.docx

    - **GBK与Unicode转换**:如果在一个中文版Windows系统上,使用GBK编码保存文本文件,并尝试在代码中以UTF-8的方式处理这些文件,则会出现乱码问题。这是因为Windows默认将不带BOM标记的文本文件视为GBK编码。 - **...

    linux乱码问题的解决办法

    - **转换文件名编码**:例如,将所有`.mp3`文件名从GBK编码转换为UTF-8编码,可以使用`convmv -f GBK -t UTF-8 *.mp3`命令。默认情况下,Convmv仅显示转换效果而不实际执行转换操作。要实际执行转换,需要加上`--no...

    hadoop中文乱码问题

    如果在上传到HDFS的文件编码与Hadoop默认的UTF-8不符,下载时就会出现乱码。解决方式是确保在上传文件前将其转换为UTF-8编码。 3. **MapReduce处理阶段**: MapReduce作业中的Mapper和Reducer可能会接收到乱码数据...

    asp codepage.txt

    ### 关于UTF-8编码与ASP中的CodePage详解 在探讨UTF-8编码与ASP中的CodePage设置之前,我们先来了解一下几个基本概念。 #### 1. 编码概述 编码是计算机处理文本的一种方式,它涉及到如何将字符转换为数字(即二...

Global site tag (gtag.js) - Google Analytics