getByte(。。)的问题

zealVampire 2004-09-01 05:37:38
String str="123我是谁";//win2000下
str.getBytes().length;//=9
str.getBytes("8859_1").length;//=6 也就是说这个byte[]不能恢复为"123我是谁"

但是在一些jsp中解决乱码的方法是以下这样...怎么可以恢复的呢,
new String(str.getBytes("8859_1"),"gbk");//这里假设str=request.getParameter("str");

各位老大能给我详细讲解一下 new String(str.getBytes("encode"),"decode");这个用法吗?
一直困扰的 多谢
...全文
383 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
charlie0895 2004-09-02
  • 打赏
  • 举报
回复
楼上的众多兄弟把问题说得比较清楚了,其实,你还可以在tomcat(如果你用的是这的话)可以在web.xml中改一下字符,就能解决这个问题
zealVampire 2004-09-02
  • 打赏
  • 举报
回复 1
//以下是ntzls给我发的短消息,:)多谢各位,明白些了
str.getBytes("8859_1")返回字节数组,将原str的UNICODE码(16位,JAVA存储方式)通过8859-1进行编码,8859-1不支持中文(8位)所以此时print的是乱码。
new String(byte[],"decode")是将字节数组通过decode进行解码,但需保证byte[]是按decode编码的,否则矛盾了,得不到正确的字符。
new String(str.getBytes("8859_1"),"gbk");//如果str中含中文能正确输出吗?
如是从流中读取的是按其他中文方式编码则
new String(b[],"其他中文编译方式");
一般中文操作系统默认编码为GBK。

8859-1 (Latin-1)
Latin-1 覆盖大多数的西欧语言,比如阿尔巴尼亚, 加泰罗尼亚语, 丹麦, 荷兰,英语,法罗群岛,芬兰,法语,德语,加利西亚,爱尔兰,冰岛, 意大利,挪威,葡萄牙,西班牙和瑞典。缺少荷兰的 ij连字(i与j合字) ,法国的 oe(o与e合字)和旧风格的',,' 而德语中``(这样的)引号是可以的。
几乎所有的WEB容器在其内部默认的字符编码格式都是以ISO-8859-1为默认值的,同时,几乎所有的浏览器在传递参数时都是默认以UTF-8的方式来传递参数的。所以,虽然我们的Java源文件在出入口的地方指定了正确的编码方式,但其在容器内部运行时还是以ISO-8859-1来处理的。
ipc2004 2004-09-02
  • 打赏
  • 举报
回复
up
alpha15 2004-09-02
  • 打赏
  • 举报
回复
你就把他想成取得的字节需要编码,然后再解码就可以了
wanglin824 2004-09-02
  • 打赏
  • 举报
回复
关注。。。
gyang 2004-09-01
  • 打赏
  • 举报
回复
up
yg1982 2004-09-01
  • 打赏
  • 举报
回复
关注:
schee 2004-09-01
  • 打赏
  • 举报
回复
java内核是unicode的,就连class文件也是,但是很多媒体,包括文件/流的保存方式
  是使用字节流的。 因此java要对这些字节流经行转化。char是unicode的,而byte是字节.
  java中byte/char互转的函数在sun.io的包中间有。其中bytetocharconverter类是中调度,
  可以用来告诉你,你用的convertor。其中两个很常用的静态函数是
   public static bytetocharconverter getdefault() ;
   public static bytetocharconverter getconverter(string encoding);
  如果你不指定converter,则系统会自动使用当前的encoding,gb平台上用gbk,en平台上用
  8859_1
  
  我们来就一个简单的例子:
     "你"的gb码是:0xc4e3 ,unicode是0x4f60
     你用:
     --encoding="gb2312";
     --byte b[]={(byte)'\u00c4',(byte)'\u00e3'};
     --convertor=bytetocharconverter.getconverter(encoding);
     --char [] c=converter.convertall(b);
     --for(int i=0;i     --{
     -- system.out.println(integer.tohexstring(c[i]));
     --}
     --打印出来是0x4f60
     --但是如果使用8859_1的编码,打印出来是
     --0x00c4,0x00e3
     ----例1
     反过来:
     --encoding="gb2312";
        char c[]={'\u4f60'};
        convertor=bytetocharconverter.getconverter(encoding);
     --byte [] b=converter.convertall(c);
     --for(int i=0;i     --{
     -- system.out.println(integer.tohexstring(b[i]));
     --}
      --打印出来是:0xc4,0xe3
      ----例2
      --如果用8859_1就是0x3f,?号,表示无法转化      --
      很多中文问题就是从这两个最简单的类派生出来的。而却有很多类  
  不直接支持把encoding输入,这给我们带来诸多不便。很多程序难得用encoding
  了,直接用default的encoding,这就给我们移植带来了很多困难
registered 2004-09-01
  • 打赏
  • 举报
回复
推荐下次楼主发贴前先仔细搜一下知识库
http://dev.csdn.net/user/whodsow
这里有很详尽的解释

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧