String str = "中";
String str1 = new String(str.getBytes("gbk"), "ISO8859-1");
String str2 = new String(str1.getBytes("ISO8859-1"), "gbk");
System.out.println(str2); //输出"中"
String s1 = new String(str.getBytes("gbk"), "utf-8");
String s2 = new String(s1.getBytes("utf-8"), "gbk");
System.out.println(s2); //输出"锟斤拷"使用iso8859-1进行解释后,可以恢复回去,
可使用utf-8解释了中文字符后,为何恢复不回去了? 请将详细写吧。
String str1 = new String(str.getBytes("gbk"), "ISO8859-1");
String str2 = new String(str1.getBytes("ISO8859-1"), "gbk");
System.out.println(str2); //输出"中"
String s1 = new String(str.getBytes("gbk"), "utf-8");
String s2 = new String(s1.getBytes("utf-8"), "gbk");
System.out.println(s2); //输出"锟斤拷"使用iso8859-1进行解释后,可以恢复回去,
可使用utf-8解释了中文字符后,为何恢复不回去了? 请将详细写吧。
解决方案 »
- 请各位帮下忙!
- 请问如何将从数据库查询到的结果集,中的数据存放到读到GUI中~~
- 把字符转化成字节?在线急等.........................................
- JTable问题?
- 散分!终于赶在年前找到新工作!
- java中实现定时器的实现!在线等回复
- "Exception in thread "main" java.lang.NoClassDefFoundError: helloworld "?????
- 请帮看一下关于RMI的错误,谢拉!!!!
- shell调用java,如何根据java的输出结果,再决定shell的逻辑
- 如何将泛型当作参数传递?
- 简单问题,答对给100分!打开JNLP文件,总是显示调用Java VM(execv)错误,高手进!
- 数组名引用的问题
看一下下面这段说明 你就会明白为什么UTF-8 就不是输出中文了
GBK的文字编码是双字节来表示的,即不论中、英文字符均使用双字节来表示,只不过为区分中文,将其最高位都定成1。至于UTF-8编码则是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24位(三个字节)来编码。对于英文字符较多的网站则用UTF-8节省空间。GBK包含全部中文字符;UTF-8则包含全世界所有国家需要用到的字符。GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准,UTF-8编码的文字可以在各国各种支持UTF8字符集的浏览器上显示。
比如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,而无需他们下载IE的中文语言支持包。 所以,对于英文比较多的论坛 ,使用GBK则每个字符占用2个字节,而使用UTF-8英文却只占一个字节。
gbk的英文是单字节吧,中文才双字节。
unicode中英文都是双字节。
老师给我们举得例子是“我们”内存里面现在是这样的。s = 00ce 00d2 00c3 00c7,把这个字符串对象再编码成gbk是错误的。因为,在unicode中,00ce所代表的是iso8859-1那个字符,在gbk编码表里面并没有收录进来,所以没法编码成gbk,而且如果找不到匹配的字符,jvm不会报错,而是返回错误的结果。3f 3f 3f 3f
应该是utf-8里没有收录吧
楼上那个帖子 11 楼的内容,将在那些基础上进行说明。因为“中”的 GBK 编码为 D6D0,使用 getBytes("gbk") 后会转成 D6 D0 的字节数组。通过那个帖子关于 UTF-8 的编码规则表,先看第一个字节 D6,二进制为 11010110,因此可用的 UTF-8
采用第二行的规则,即:110xxxxx 10xxxxxx,根据这一行规则,要求第二个字节二进制是以 10 开头的,
但是我们第二个字节 D0 的二进制为 11010000,因此不符合 UTF-8 的编码规则,因此将采用 UTF-8 的
缺失字符 EF BF BD 将其进行编码,因为 D6 D0 这两个字节 UTF-8 都不认识,因此被 UTF-8 编码成为
EF BF BD EF BF BD 共 6 个字节的两个缺失字符。这 6 个字符再根据 GBK 的编码规则,每两个组成一个字符,因此被 GBK 编码为 EFBF BDEF BFBD,而编
码为这三个的 GBK 字符正好为“锟斤拷”。
gbk和图中的unicode utf-8有什么关系啊?Unicode Code UTF-8 Code
0000~007F 0xxxxxxx
0080~07FF 110xxxxx 10xxxxxx
0800~FFFF 1110xxxx 10xxxxxx 10xxxxxx
10000~10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
0000~007F 0xxxxxxx
0080~07FF 110xxxxx 10xxxxxx
0800~FFFF 1110xxxx 10xxxxxx 10xxxxxx
10000~10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx这个图怎么看?左边一列是 Unicode 编码,右边一列是 UTF-8 编码。我们只要看右边的,右边的是 UTF-8 的编码规则,
即:第一行 0xxxxxxx 表示 U+0000~U+007F 的字符,UTF-8 使用一个字节表示
第二行表示 U+0080~U+07FF 的字符,UTF-8 编码使用两个字节表示,首字节必须是 110 开头,第二个字节必须是以 10 开头的,也就是说如果第一个字节是以 110 开头的,但是第二个字节是以 11 开头的,那么这样的字节是不能组成 UTF-8 编码的,会采用缺失字符代替。
好了,该说的都已经说完了,对于这个帖子不会再回复了。
byte[] bytes = s.getBytes("GBK");
for(byte b : bytes) System.out.println(b);
String s2 = new String(bytes, "ISO8859-1");
System.out.println(s2);
byte[] bytes2 = s2.getBytes("ISO8859-1");
for(byte b : bytes2) System.out.println(b);