首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 编码转换问题 [已结贴,结贴人:zhaoyh82]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-31 11:36:20 楼主
    String str = "中华人民共和国";
    String str1 = new String(str.getBytes("utf-8"),"gbk");
    System.out.println("str=="+str);
    System.out.println("str1=="+str1);
    String str2 = new String(str1.getBytes("gbk"),"utf-8");
    System.out.println("str2=="+str2);

    ----------------------------------------------
    str==中华人民共和国
    str1==涓崕浜烘皯鍏卞拰鍥?
    str2==中华人民共和??

    如果str是单数的汉字的话,最后转回来不能转全,如果str是双数的汉字的话就可以转全,有什么解决的办法吗?
    30  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-31 11:52:541楼 得分:1
    建议不要把编码转来转去,这样最后肯定是混乱。
    简单就是美。

    String str = "中华人民共和国";
    这是双字节unicode编码。
    str.getBytes("utf-8")
    unicode转为utf-8
    new String(str.getBytes("utf-8"),"gbk");
    utf-8转为gbk
    好像没什么意义。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-31 12:04:032楼 得分:1
    引用 1 楼 Gump09 的回复:
    建议不要把编码转来转去,这样最后肯定是混乱。
    简单就是美。

    String str = "中华人民共和国"; 
    这是双字节unicode编码。
    str.getBytes("utf-8")
    unicode转为utf-8
    new String(str.getBytes("utf-8"),"gbk"); 
    utf-8转为gbk
    好像没什么意义。


    楼上正解
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-31 13:15:093楼 得分:1
    utf-8和gbk这两种编码格式都支持汉字,不知道LZ这么转有什么意义。
    转码因为编码方式的不同,并不是说像LZ这样转过去然后在转回来就能得到正确的结果的.
    由于编码方式的不同,在转码过程中可能有一些信息已经丢失.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • caiming250
    • 等级:
    发表于:2008-03-31 13:24:244楼 得分:1
    Java code
    String str = "中华人民共和国"; String str1 = new String((str+"@").getBytes("utf-8"),"gbk"); System.out.println("str=="+str); System.out.println("str1=="+str1); String str2 = new String((str1).getBytes("gbk"),"utf-8"); System.out.println("str2=="+str2.substring(0,str2.length()-1));
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-31 15:00:565楼 得分:0
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-31 15:38:066楼 得分:1
    用ISO-8859-1 取转成需要的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-31 15:55:367楼 得分:20
    不是所有的编码都可以随便转换的
    String都可以用UTF-8变成byte
    byte都可以用ISO-8859-1变成String


    new String("STR".getBytes("UTF-8"),"UTF-8")
    (new String(byte[],"ISO-8859-1")).getBytes("ISO-8859-1")
    是没问题的

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-31 15:59:428楼 得分:0
    如果str是单数的汉字的话,最后转回来不能转全,如果str是双数的汉字的话就可以转全,有什么解决的办法吗?
    不一定的
    byte[] 到 string 用GBK的转换方式是
    0-128 的byte 转换成一个unicode字符
    128-256的byte加上后面的一个字节 转换成一个unicode字符
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-31 16:22:299楼 得分:0
    引用 7 楼 hendy 的回复:
    不是所有的编码都可以随便转换的
    String都可以用UTF-8变成byte
    byte都可以用ISO-8859-1变成String


    new String("STR".getBytes("UTF-8"),"UTF-8")
    (new String(byte[],"ISO-8859-1")).getBytes("ISO-8859-1")
    是没问题的


    byte[] a = str.getBytes("gbk");
    然后我把a进行传递,传到后,
    用String strnew= new String(str,"gbk");
    现在就没乱码了。
    我的问题是传递一个String的参数,接收后变成乱码了,乱码和这个转换一样new String(str.getBytes("utf-8"),"gbk");
    所以前面我才想到再给转回来,不想转回来有问题,不知道大家看懂没,
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-31 16:32:0510楼 得分:0
    引用 8 楼 hendy 的回复:
    如果str是单数的汉字的话,最后转回来不能转全,如果str是双数的汉字的话就可以转全,有什么解决的办法吗?
    不一定的
    byte[] 到 string 用GBK的转换方式是
    0-128 的byte 转换成一个unicode字符
    128-256的byte加上后面的一个字节 转换成一个unicode字符


    照你这么说new String("STR".getBytes("UTF-8"),"UTF-8") 
    (new String(byte[],"ISO-8859-1")).getBytes("ISO-8859-1") 
    没问题,
    new String("STR".getBytes("gbk"),"gbk") 有问题了?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-31 16:44:0311楼 得分:0
    引用 8 楼 hendy 的回复:
    如果str是单数的汉字的话,最后转回来不能转全,如果str是双数的汉字的话就可以转全,有什么解决的办法吗? 
    不一定的 
    byte[] 到 string 用GBK的转换方式是 
    0-128 的byte 转换成一个unicode字符 
    128-256的byte加上后面的一个字节 转换成一个unicode字符 


    照你这么说new String("STR".getBytes("UTF-8"),"UTF-8") 
    (new String(byte[],"ISO-8859-1")).getBytes("ISO-8859-1") 
    没问题,
    new String("STR".getBytes("gbk"),"gbk") 有问题了?


    如果 "STR"不是GBK编码,是其它的字符集,就可能有问题,因为GBK并没有覆盖整个UNICODE 16字符集
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-31 16:44:1512楼 得分:5
    UTF-8 以三个字节来表示汉字,GBK 以两个字节来表示汉字。

    中华人民共和国的 UTF-8 编码如下:

    E4B8AD E58D8E E4BABA E6B091 E585B1 E5928C E59BBD

    将这些再组成两个字节的 GBK 编码:

    E4B8 ADE5 8D8E E4BA BAE6 B091 E585 B1E5 928C E59B BD

    前面10组组成的字为:涓崕浜烘皯鍏卞拰鍥

    最后剩下一个:BD,在 GBK 编码中 BD 没有被编码,则以 ?(3F)来代替了,
    这时原序列已经被损坏,是没有办法再还原的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-31 16:46:5613楼 得分:0
    从上面可以看出,奇数个 UTF-8 编码的字符,字节数肯定是个奇数,不能被 GBK 完全编码,最后一个字节被损坏掉了。

    而偶数个字符,字节数肯定是个偶数,能被占用两个字节的 GBK 完全编码。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-31 16:52:3214楼 得分:0
    这仅仅是汉字的,如果夹杂着占用两个字节或者一个字节的 UTF-8 字符,情况也是同样的。

    所以不能使用 UTF-8 → GBK → UTF-8,这样是行不通的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-31 18:16:0515楼 得分:0
    楼上头像挺搞笑的。
    问题解决了,结贴
    修改 删除 举报 引用 回复