下面是孙鑫Java Web 开发详解中一段代码:
代码输出是:
fffd--?
40--@
554a--啊
我不明白为什么输出是三行?究竟String str = new String (buf,"GB2312");是怎么转换的?
(至于其中的fffd输出,解释是0x8140从GB2312向Unicode转换,然而由于0x8140不在GB2312编码范围
,没有对应字符,就转换为0xffd.所以输出第一行我理解.)还有第二行,第三行是怎么来的?-------------------------------------------------
byte [] buf = {(byte)0X81,(byte)0X40,(byte)0xb0,(byte)0xa1};
//将二进制数据按照GB2312向Unicode编码转换
String str = new String (buf,"GB2312");
for(int i=0;i<str.length();i++)
{
//取出字符串中的每个Unicode编码的字符
char ch = str.charAt(i);
//将该字符对应的Unicode编码以十六进制的形式输出
System.out.print(Integer.toHexString((int))ch));
System.out.print("--"):
System.out.pritln(ch);
}
------------------------------------------------
代码输出是:
fffd--?
40--@
554a--啊
我不明白为什么输出是三行?究竟String str = new String (buf,"GB2312");是怎么转换的?
(至于其中的fffd输出,解释是0x8140从GB2312向Unicode转换,然而由于0x8140不在GB2312编码范围
,没有对应字符,就转换为0xffd.所以输出第一行我理解.)还有第二行,第三行是怎么来的?-------------------------------------------------
byte [] buf = {(byte)0X81,(byte)0X40,(byte)0xb0,(byte)0xa1};
//将二进制数据按照GB2312向Unicode编码转换
String str = new String (buf,"GB2312");
for(int i=0;i<str.length();i++)
{
//取出字符串中的每个Unicode编码的字符
char ch = str.charAt(i);
//将该字符对应的Unicode编码以十六进制的形式输出
System.out.print(Integer.toHexString((int))ch));
System.out.print("--"):
System.out.pritln(ch);
}
------------------------------------------------
输出第一行和第二行
,(byte)0xb0,(byte)0xa1
输出第三行至于原因肯定是编码的事,具体的查一下gb2312的编码吧
我手头也没有资料
如:
Byteba[>={(byte)0x81,(byte)0x40,(byte)0xb0,(byte)0xa1};newString(ba,"gb2312");
结果是"?啊",hex值是"\ufffd\u554a".0x8140是GBK字符,按GB2312转换表没有对应的值,取\ufffd.(请注意:在显示该uniCode时,因为没有对应的本地字符,所以也适用上一种情况,显示为一个"?".)实际编程中,JSP/Servlet程序得到错误的汉字信息,往往是这两个过程的叠加,有时甚至是两个过程叠加后反复作用的结果.
如:
Byte ba[> = {(byte)0x81,(byte)0x40,(byte)0xb0,(byte)0xa1}; new String(ba,"gb2312");
结果是"?啊", hex 值是"\ufffd\u554a". 0x8140 是GBK字符,按GB2312转换表没有对应的值,取\ufffd. (请注意:在显示该uniCode时,因为没有对应的本地字符,所以也适用上一种情况,显示为一个"?".)实际编程中,JSP/Servlet 程序得到错误的汉字信息,往往是这两个过程的叠加,有时甚至是两个过程叠加后反复作用的结果.从其他地方复制的,有乱码
你说的我理解,我现在不明白为什么输出三行.