`
apprentice_ll26
  • 浏览: 26967 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

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

阅读更多
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)。
分享到:
评论

相关推荐

    GBK、UTF-8编码转换工具

    GBK、UTF-8批量文件3秒快速转码工具(支持GBK,UTF-8免费转换),UTF-8/GBK编码在线转换工具,压缩包可以有多目录与文件,如目录中有图片不会转码,但是会随转码好的文件一起打包下载。 使用帮助 . 上传压缩包(仅支持zip...

    c gbk和 utf-8 转换

    本文将深入探讨C语言中如何实现GBK与UTF-8的互相转换,同时不依赖任何外部库。 GBK是中国大陆广泛采用的一种汉字编码标准,它是GB2312的扩展,包含了更多的汉字和符号,能够覆盖大部分中文字符。UTF-8则是一种多...

    GBK与UTF-8转码(C++)

    本文将详细介绍如何在Microsoft Foundation Classes (MFC)环境下实现GBK与UTF-8之间的编码转换。该技术适用于那些需要处理不同字符集数据的应用程序开发场景,特别是在早期Windows系统中广泛使用的MFC框架下进行编码...

    eclipse中class乱码GBK-UTF-8转换工具

    这篇博客文章“eclipse中class乱码GBK-UTF-8转换工具”正是为了解决这个问题。 GBK是GB2312的扩展,包含了更多的汉字和其他字符,主要在中国大陆使用。UTF-8则是一种广泛使用的Unicode编码,支持世界上几乎所有的...

    C#写的 GBK GB2312 UTF-8转换

    在这个例子中,`Encoding.GetEncoding("GBK")`获取了GBK编码器,`GetBytes()`方法将GBK编码的字符串转换为字节数组,然后`Encoding.UTF8.GetString()`将这个字节数组还原为UTF-8编码的字符串。 对于文件的编码转换...

    UTF-8toGBK_labview编码gbk_LabVIEWUTF-8_utf-8toGbk_

    当UTF-8字符串中包含GBK不支持的字符时,转换可能会失败或者产生乱码。因此,在进行编码转换时,需要确保清楚源字符串的编码类型,并且在转换前后进行适当的错误检查和处理。 总的来说,理解和掌握UTF-8和GBK这两种...

    GBK 与 UTF-8 间编码转换

    对于GBK到UTF-8的转换,首先需要将GBK编码的每个双字节视为一个独立的字符,然后查找对应的Unicode码点,最后按照UTF-8的规则将其转换成1至3个字节的序列。相反,从UTF-8到GBK的转换则需要识别出UTF-8编码的字节序列...

    eclispe GBK转UTF-8乱码解决

    总的来说,解决Eclipse中GBK转UTF-8乱码问题的关键在于正确设置工作空间、项目、源代码和资源文件的编码,并且适时使用辅助工具进行批量转换。通过这些方法,可以避免编码不一致导致的乱码问题,提高开发效率。在...

    GBK与UTF-8之间的转换

    但是,这种方法存在一些问题,例如,使用new String(tmp.getBytes("GBK"), "UTF-8")这种方法将GBK编码的字符串转换成UTF-8编码的字符串时,可能会出现乱码的问题。 出现这种问题的原因是,因为客户端使用GBK编码,...

    批量文件转码工具(支持GBK,UTF-8转换)

    在提供的压缩包文件“批量文件转码工具”中,我们可以期待找到一个能够帮助我们方便快捷地处理GBK和UTF-8编码转换问题的实用工具。这个工具可能包括了选择文件、设置目标编码、开始转换等一系列功能,并且已经有人...

    批量文件转码工具(支持 GBK,UTF-8 转换)

    在这个场景中,我们讨论的是一个专门用于批量转换的工具,它支持GBK和UTF-8这两种常见的字符编码格式。 GBK编码是GB2312编码的扩展,主要在中国大陆广泛使用,涵盖了大部分简体中文字符。UTF-8则是一种国际通用的...

    gbk和 utf-8 转换

    本文将深入探讨GBK与UTF-8的差异,以及如何在C语言中实现它们之间的无库转换。 GBK是中国大陆广泛采用的一种多字节字符编码,它是GB2312的扩展,兼容GB2312的同时增加了许多汉字和其他符号。GBK编码使用双字节表示...

    GBK<-->UTF-8格式转换

    GBK与UTF-8之间的转换通常涉及到文件的读取、解析和写入过程。在编程中,我们需要选择合适的库或函数来完成这个任务。例如,在Python中,我们可以使用`codecs`库进行编码转换: ```python import codecs # 从GBK...

    c语言gbk、utf8转换编码表及函数

    在C语言中,字符编码是非常重要...通过`utf8gbk.h`和`utf8gbk.c`这两个文件,你可以直接在C程序中实现GBK与UTF-8的转换,从而满足项目的需求。不过,要注意,这些函数可能需要根据具体环境和需求进行适当的修改和优化。

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

    老项目采用GBK编码格式,而新项目采用的UTF-8编码格式,如果直接把Java源代码复制到Eclipse中所有的中文信息会出现乱码。所以写了个小的方法类,将java文件的编码格式从GBK转UTF-8

    C语言字符编码转换UNICODE、GBK、UTF-8互相转换

    例如,从GBK转到UTF-8,只需将GBK的宽字符转换为对应的UTF-8字节序列。 4. **编码**:将Unicode字符数组编码为目标编码。对于GBK,同样需要借助外部库或API;对于UTF-8,你可以手动构建字节序列,遵循UTF-8的规则。...

    文件编码转换,GBK和UTF-8双向互换,批处理文化方法

    文件包含:gbk2utf-8.bat、utf-82gbk.bat、iconv.exe及使用说明.txt四个文件 使用说明:1把要转换的所有.h和.c文件拷入该目录下,双击相应的bat文件即可。 2转换结果会保存在utf-8Res或gbkRes目录下。 3如果转换除...

    Eclipse项目的GBK编码转为UTF-8插件

    当开发者将一个原本使用GBK编码的Eclipse项目导入到Android Studio时,由于Android Studio默认使用的是UTF-8编码,可能会遇到编码不匹配的问题,导致代码显示乱码或编译错误。解决这个问题通常需要手动逐个文件转换...

    gbk转换utf-8工具!绝对给力!

    这些标签强调了工具的核心功能,即在GBK与UTF-8编码之间进行转换,这对于处理中文字符在不同系统或平台间兼容性问题非常重要。 在压缩包中的“GBK-UTF8.exe”文件名表明这可能是一个可执行文件,用户在Windows环境...

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

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

Global site tag (gtag.js) - Google Analytics