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批量文件3秒快速转码工具(支持GBK,UTF-8免费转换),UTF-8/GBK编码在线转换工具,压缩包可以有多目录与文件,如目录中有图片不会转码,但是会随转码好的文件一起打包下载。 使用帮助 . 上传压缩包(仅支持zip...
C#写的 GBK GB2312 UTF-8转换 功能简单,仅供学习
基于MFC CString的GBK与UTF-8编码转换,在网上找到一些代码都有问题,但都存在一些错误。现在改好了,与大家分享一下。 (MFC 非UNICODE)
c 源码, gbk和utf8 互相转换(不含库) 通过查表实现转换 实际转换为 gbk -- unicode --utf8
可以实现编码转换,使用编码utf-8转换成gbk
批量文件转码工具(支持 GBK,UTF-8 转换)。 批量文件转码工具,支持GBK,UTF-8转换,window下面使用,亲测可以使用!!!!!!!!!! 批量 文件转码 工具 GBK UTF-8
但是,这种方法存在一些问题,例如,使用new String(tmp.getBytes("GBK"), "UTF-8")这种方法将GBK编码的字符串转换成UTF-8编码的字符串时,可能会出现乱码的问题。 出现这种问题的原因是,因为客户端使用GBK编码,...
批量文件转码工具,支持GBK,UTF-8转换,window下面使用,亲测可以使用!!!!!!!!!!
老项目采用GBK编码格式,而新项目采用的UTF-8编码格式,如果直接把Java源代码复制到Eclipse中所有的中文信息会出现乱码。所以写了个小的方法类,将java文件的编码格式从GBK转UTF-8
C语言字符编码转换UNICODE、GBK、UTF-8互相转换
NULL 博文链接:https://bingyingao.iteye.com/blog/2169164
请使用这款软件,直接将代码转换为UTF-8 注意: 1、xml不需要转换,因为xml默认是utf-8,在你新建的时候已经是正确的格式了 2、图片更不需要转换 3、bin目录,gen目录的直接忽略 4.只需要src目录的代码转换,请确保...
PB的utf-8转换,包括加码解码等等 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
GBK---UTF-8 格式互相转换转换适用。至于怎么用自己去研究
eclispe GBK转UTF-8乱码解决 插件,统一解决
*文件编码转换,gbk与utf-8互转 * changeFileCode 方法,4个属性:(需要转换的文件目录,转换后的文件目录,当前文件编码格式,转换成需要的文件编码); * 需要转换的文件目录,转换后的文件目录--可以为同一路径...
批量文件转码工具,支持GBK,UTF-8转换,window下面使用,亲测可以使用!
文件包含:gbk2utf-8.bat、utf-82gbk.bat、iconv.exe及使用说明.txt四个文件 使用说明:1把要转换的所有.h和.c文件拷入该目录下,双击相应的bat文件即可。 2转换结果会保存在utf-8Res或gbkRes目录下。 3如果转换除...
Linux 下批量 gbk 转 utf-8 编码脚本