- 浏览: 239250 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
thepastsee:
304572183股票交流 欢迎加入
实时股票 -
345161974:
很不错,我第一个接触的CSS卡片布局效果,多谢
css卡片效果
转
http://www.iteye.com/topic/1097560
最近在做一个反馈功能,把数据反馈到对方公司网站,我公司是GBK编码,对方公司是UTF-8编码。因此,我需要将GBK编码数据转换成UTF-8编码数据,这样对方网站才不会乱码。最简单的方法是将HttpClient的ContentCharset设置为utf-8;如果ContentCharset是gbk并且又不想设置为utf-8,那么就需要将数据转换成UTF-8编码再发到对方网站。
问题出现:GBK转UTF-8时,奇数个中文会乱码,偶数个中文不会乱码。
三个中文
- String gbk = "我来了";
- String utf8 = new String(gbk.getBytes("UTF-8"));
- //模拟UTF-8编码的网站显示
- System.out.println(new String(utf8.getBytes(),"UTF-8"));
- }
- /*
- 我来??
- */
public static void encodeError() throws UnsupportedEncodingException { String gbk = "我来了"; String utf8 = new String(gbk.getBytes("UTF-8")); //模拟UTF-8编码的网站显示 System.out.println(new String(utf8.getBytes(),"UTF-8")); } /* 我来?? */
前面三个中文,后面一个中文,都是奇数
- public static void encodeError2() throws UnsupportedEncodingException {
- String gbk = "今年是2011年";
- String utf8 = new String(gbk.getBytes("UTF-8"));
- //模拟UTF-8编码的网站显示
- System.out.println(new String(utf8.getBytes(),"UTF-8"));
- }
- /*
- 今年??011??
- */
public static void encodeError2() throws UnsupportedEncodingException { String gbk = "今年是2011年"; String utf8 = new String(gbk.getBytes("UTF-8")); //模拟UTF-8编码的网站显示 System.out.println(new String(utf8.getBytes(),"UTF-8")); } /* 今年??011?? */
原因:为什么只有奇数个中文才乱码,偶数个却不乱码?下面来分析原因
- public static void analyze() throws UnsupportedEncodingException {
- String gbk = "我来了";
- String utf8 = new String(gbk.getBytes("UTF-8"));
- for (byte b : gbk.getBytes("UTF-8")) {
- System.out.print(b + " ");
- }
- System.out.println();
- for (byte b : utf8.getBytes()) {
- System.out.print(b + " ");
- }
- }
- /*
- -26 -120 -111 -26 -99 -91 -28 -70 -122
- -26 -120 -111 -26 -99 -91 -28 -70 63
- */
public static void analyze() throws UnsupportedEncodingException { String gbk = "我来了"; String utf8 = new String(gbk.getBytes("UTF-8")); for (byte b : gbk.getBytes("UTF-8")) { System.out.print(b + " "); } System.out.println(); for (byte b : utf8.getBytes()) { System.out.print(b + " "); } } /* -26 -120 -111 -26 -99 -91 -28 -70 -122 -26 -120 -111 -26 -99 -91 -28 -70 63 */
注意最后一个字节不同,上面一行才是正确的UTF-8编码。那么为什么下面一行最后一个字节是63,而不是-122呢?这就是导致乱码的原因所在。
GBK编码是一个中文2个字节,而UTF-8编码是一个中文3个字节,当我们调用getBytes("UTF-8")方法时,会通过计算来增加字节,使得从GBK的2个字节变成UTF-8对应的3个字节。因此,上例3个中文输出了9个字节。
这里讲一下怎么通过计算增加字节,不深究的读者可以跳过此段。为了醒目,直接用代码讲解
- public static void gbk2Utf() throws UnsupportedEncodingException {
- String gbk = "我来了";
- char[] c = gbk.toCharArray();
- byte[] fullByte = new byte[3*c.length];
- for (int i=0; i<c.length; i++) {
- String binary = Integer.toBinaryString(c[i]);
- StringBuffer sb = new StringBuffer();
- int len = 16 - binary.length();
- //前面补零
- for(int j=0; j<len; j++){
- sb.append("0");
- }
- sb.append(binary);
- //增加位,达到到24位3个字节
- sb.insert(0, "1110");
- sb.insert(8, "10");
- sb.insert(16, "10");
- fullByte[i*3] = Integer.valueOf(sb.substring(0, 8), 2).byteValue();//二进制字符串创建整型
- fullByte[i*3+1] = Integer.valueOf(sb.substring(8, 16), 2).byteValue();
- fullByte[i*3+2] = Integer.valueOf(sb.substring(16, 24), 2).byteValue();
- }
- //模拟UTF-8编码的网站显示
- System.out.println(new String(fullByte,"UTF-8"));
- }
public static void gbk2Utf() throws UnsupportedEncodingException { String gbk = "我来了"; char[] c = gbk.toCharArray(); byte[] fullByte = new byte[3*c.length]; for (int i=0; i<c.length; i++) { String binary = Integer.toBinaryString(c[i]); StringBuffer sb = new StringBuffer(); int len = 16 - binary.length(); //前面补零 for(int j=0; j<len; j++){ sb.append("0"); } sb.append(binary); //增加位,达到到24位3个字节 sb.insert(0, "1110"); sb.insert(8, "10"); sb.insert(16, "10"); fullByte[i*3] = Integer.valueOf(sb.substring(0, 8), 2).byteValue();//二进制字符串创建整型 fullByte[i*3+1] = Integer.valueOf(sb.substring(8, 16), 2).byteValue(); fullByte[i*3+2] = Integer.valueOf(sb.substring(16, 24), 2).byteValue(); } //模拟UTF-8编码的网站显示 System.out.println(new String(fullByte,"UTF-8")); }
现在我们来找出最后一个字节是63,而不是-122的原因。
- public static void analyze2() throws UnsupportedEncodingException {
- String gbk = "我来了";
- byte[] utfBytes = gbk.getBytes("UTF-8");//得到9个字节
- String utf8 = new String(utfBytes);//问题就出在这
- System.out.print(utf8);
- }
- /*
- 鎴戞潵浜?
- */
public static void analyze2() throws UnsupportedEncodingException { String gbk = "我来了"; byte[] utfBytes = gbk.getBytes("UTF-8");//得到9个字节 String utf8 = new String(utfBytes);//问题就出在这 System.out.print(utf8); } /* 鎴戞潵浜? */
因为文件是GBK编码,new String(utfBytes)默认就是new String(utfBytes,"GBK")。它会2个字节2个字节地转换成字符,当字节是奇数时最后1个字节转字符就会计算错误,然后直接赋予最后这个字符为?,对应ASCII代码就是63。
解决问题
保证字节正确才是硬道理。当调用getBytes("UTF-8")转换成字节数组后,创建ISO-8859-1编码的字符串,ISO-8859-1编码是一个字节对应一个字符,因此不会使最后一个字节错误。
- public static void correctEncode() throws UnsupportedEncodingException {
- String gbk = "我来了";
- String iso = new String(gbk.getBytes("UTF-8"),"ISO-8859-1");
- for (byte b : iso.getBytes("ISO-8859-1")) {
- System.out.print(b + " ");
- }
- System.out.println();
- //模拟UTF-8编码的网站显示
- System.out.println(new String(iso.getBytes("ISO-8859-1"),"UTF-8"));
- }
- /*
- -26 -120 -111 -26 -99 -91 -28 -70 -122
- 我来了
- */
public static void correctEncode() throws UnsupportedEncodingException { String gbk = "我来了"; String iso = new String(gbk.getBytes("UTF-8"),"ISO-8859-1"); for (byte b : iso.getBytes("ISO-8859-1")) { System.out.print(b + " "); } System.out.println(); //模拟UTF-8编码的网站显示 System.out.println(new String(iso.getBytes("ISO-8859-1"),"UTF-8")); } /* -26 -120 -111 -26 -99 -91 -28 -70 -122 我来了 */
发表评论
-
jdbc_连接池_转
2012-02-19 22:49 0http://z466459262.iteye.com/bl ... -
java_贪吃蛇——
2012-01-17 11:14 848ADADS -
java并发重构ppt_转温 少
2011-06-23 16:04 687ooooo -
单例模式七种写法_转
2011-05-26 23:19 789kjljkl -
设计模式_code_转转转
2011-05-25 17:14 690kljlj -
java_字符串操作——插入、替换、删除_转
2011-03-18 18:38 1247字符串操作——插入、替换、删除 ... -
mysq 存储过程技术手册
2011-02-17 22:49 454jklkj -
mysql专家_分析pdf
2011-02-17 20:43 850dfasdfasdf -
成均科技_面试
2011-02-16 17:38 848成均科技: XmlHttpRequest 浏览器对 ... -
java 学习方向
2011-01-26 16:56 663http://newleague.iteye.com/ ... -
多线程背课__售票_转转转
2011-01-25 10:19 771票真难买呀,咋回个家就怎么难呢? 这几天学习了下线程, ... -
web 项目_ log4j__转转java3Z
2011-01-18 22:16 1014在web应用中使用日志工具log4J ... -
汉字排序_java_转转
2011-01-15 17:09 893java中漢字按拼音排序 ... -
ecilpse_apanta_
2011-01-15 00:11 1044<!-- [if gte mso 9]><x ... -
linux_virutalBox_固定ip_转转
2011-01-12 21:35 951Windows XP通过Sun VirtualBox ... -
存储过程_转转转 _ibatis
2011-01-04 21:14 1301作者:袁光东 我们在进行pl/sql编程时打交道最多的 ... -
J2EE项目异常处理_转
2011-01-04 21:08 697J2EE 项目异常处理 ... -
防盗链_图片
2010-12-30 08:57 878做个图片的防盗链 ... -
java 缩略图__转
2010-12-24 00:29 735//----------------------------- ... -
url_中文_竹林仙_转转转
2010-12-22 18:23 684//----------------------------- ...
相关推荐
在LabVIEW编程环境中,"UTF-8toGBK.vi"这个程序可能是一个用户自定义的VI(Virtual Instrument),用于将UTF-8编码的字符串转换为GBK编码。LabVIEW作为一个图形化编程语言,提供了丰富的字符串处理函数,其中包括了...
然而,如果你从其他编码格式(如ASCII或GBK)转换到UTF-8,就需要使用编码转换函数。例如,可以使用iconv库进行这样的转换。 在处理UTF-8字符串时,常见的操作包括: 1. **字符遍历**:由于UTF-8的多字节特性,...
这个压缩包文件"UTF-8toGBK_labview编码gbk_LabVIEWUTF-8_utf-8toGbk_源码.zip"主要涉及到两个常见的字符编码格式:UTF-8和GBK,以及如何在LabVIEW环境下进行编码转换。LabVIEW是美国国家仪器(NI)开发的一种图形化...
GBK、UTF-8批量文件3秒快速转码工具(支持GBK,UTF-8免费转换),UTF-8/GBK编码在线转换工具,压缩包可以有多目录与文件,如目录中有图片不会转码,但是会随转码好的文件一起打包下载。 使用帮助 . 上传压缩包(仅支持zip...
GBK和UTF-8是两种广泛使用的字符编码标准,它们各自有不同的特性和应用场景。本文将深入探讨C语言中如何实现GBK与UTF-8的互相转换,同时不依赖任何外部库。 GBK是中国大陆广泛采用的一种汉字编码标准,它是GB2312的...
### GBK与UTF-8转码(C++) #### 知识点概述 本文将详细介绍如何在Microsoft Foundation Classes (MFC)环境下实现GBK与UTF-8之间的编码转换。该技术适用于那些需要处理不同字符集数据的应用程序开发场景,特别是在...
标题中的“GBK_pinyin_table.rar”表明这是一个关于GBK编码的拼音资源文件,而“GBK_gbk_utf-8_gbk_to_pinyin_pinyi”则暗示了这个资源涉及到GBK编码、UTF-8编码以及汉字到拼音的转换。描述中提到这是“GBK拼音字表...
标签中的"_utf-8togb2312 utf-8_gb2312 gb2312 mmi_chset utf__gbk"进一步强调了这个类库的核心功能,即UTF-8到GB2312的转换,以及可能存在的GBK编码支持。GBK是GB2312的扩展,包含更多的汉字和其他字符,因此这个类...
Console.WriteLine("GBK转UTF-8后的字符串:" + utf8Str); } } ``` 在这个例子中,`Encoding.GetEncoding("GBK")`获取了GBK编码器,`GetBytes()`方法将GBK编码的字符串转换为字节数组,然后`Encoding.UTF8....
在本文中,我们将深入探讨GBK和UTF-8的区别,以及如何使用Python进行编码转换,特别关注如何将GBK编码的文件转换为UTF-8编码。 首先,GBK是GB2312编码的升级版,它是针对简体中文的一种字库编码,主要在中国大陆...
|————create_direct_pay_by_user-CSHARP-UTF-8 |————create_direct_pay_by_user-JAVA-GBK |————create_direct_pay_by_user-JAVA-UTF-8 |————create_direct_pay_by_user-PHP-GBK |————...
在标题和描述中提到的“批量转 GBK 转 UTF-8”、“gb2312 转 UTF-8”以及“Iso-8859-1 转 UTF-8”是指将使用这些编码格式的文件转换成UTF-8编码。这是因为UTF-8具有广泛的兼容性和通用性,许多系统和软件默认使用UTF...
对于GBK到UTF-8的转换,首先需要将GBK编码的每个双字节视为一个独立的字符,然后查找对应的Unicode码点,最后按照UTF-8的规则将其转换成1至3个字节的序列。相反,从UTF-8到GBK的转换则需要识别出UTF-8编码的字节序列...
描述部分提到“utf-8-tool 转换器,可将txt文档里面的unnicode中文乱码转成utf-8格式”,这表明该工具设计用于解决由于编码不匹配导致的文本乱码问题。Unicode是一种通用的字符集,包含世界上几乎所有的文字系统,而...
在将EWebEditor从GBK转为UTF-8的过程中,可能涉及以下步骤: 1. **文件编码检查**:首先确定编辑器源代码文件的原始GBK编码。 2. **转换工具**:使用文本编辑器(如Notepad++,Sublime Text等)或专门的编码转换工具...
请使用这款软件,直接将代码转换为UTF-8 注意: 1、xml不需要转换,因为xml默认是utf-8,在你新建的时候已经是正确的格式了 2、图片更不需要转换 3、bin目录,gen目录的直接忽略 4.只需要src目录的代码转换,请确保...
文件包含:gbk2utf-8.bat、utf-82gbk.bat、iconv.exe及使用说明.txt四个文件 使用说明:1把要转换的所有.h和.c文件拷入该目录下,双击相应的bat文件即可。 2转换结果会保存在utf-8Res或gbkRes目录下。 3如果转换除...
本文将深入探讨"GBK"和"UTF-8"这两种字符编码格式,并介绍如何进行两者之间的转换,以及涉及到的相关知识点。 首先,GBK是中文环境下广泛使用的字符编码标准,全称为“汉字内码扩展规范”(GB 2312 Extension),它...
- 通常,从GBK转UTF-8需要将每个GBK编码的双字节序列转换为对应的Unicode码点,然后根据UTF-8的规则编码。 - 反之,从UTF-8转GBK则需要解析UTF-8编码的字节序列,找到对应的Unicode码点,再转换成GBK编码。 5. **...
老项目采用GBK编码格式,而新项目采用的UTF-8编码格式,如果直接把Java源代码复制到Eclipse中所有的中文信息会出现乱码。所以写了个小的方法类,将java文件的编码格式从GBK转UTF-8