在 Linux, Windows 什么地方显示?说实在的,我根本没看懂。特别是那三段代码,简直就不知道在写什么,谁跟你说可以这样写的啊?

解决方案 »

  1.   

    首先,工作环境是linux,linux默认是UTF-8编码,然后要接受网页内容,网页内容存储在str中,用GBK编码,现在的目的是将此GBK编码的str转变为UTF-8编码,在linux下面正确显示第一个红色部分,我看懂了
    第二个红色部分,我想问一下,存储在 str 中怎么会是 GBK 编码呢?Java 中的 str 内部采用的是 unicode 存储的
    第三个红色部分,在 Linux 下面。问一下,什么叫 Linux 下面?
      

  2.   

    先支持一下楼上的说法。楼主根本没弄清楚字符编码方式是个什么东西,在Java种怎么运作的。这样的话即使你自己写什么转换函数估计也是一团浆糊。下面我来小说一下。谈到字符集编码,我们首先要面对的是一串二进制数组,在楼主的案例中是通过浏览器提交上来的。并且在浏览器组织HTTP Request数据流的时候采用的是GBK编码方式对Request Body中的中文进行编码生成一串二进制代码。应用服务器收到后一般实在第一次使用request.getParameter方法时将这串二进制数组转化为String对象。这里需要指定字符的编码方式否则会出现乱码。假设应用服务器是Tomcat,如果不指定编码方式Tomcat会缺省采用ISO8859-1的方式进行解码。所以一般我们会建立一个Mapping到\*上的ServletFilter,在其中写上request.setChatsetEncodeing(“GBK”)(方法名可能有错,我记不太清楚)的方式来指定浏览器提交上来的中文采用的是哪种字符集编码。这是处理中文的第一环节。
    接下来需要把中文存储到String中去。那么在String中是如何存储的呢?其实仍然是二进制数组(用Character表示)。这里也存在一个字符集编码的问题。Java统一采用Unicode编码方式,无论所运行的操作系统是Linux还是Windows。这是第二个环节。
    下面该到输出环节了。到这里我就不是很清楚楼主说的在Linux下显示是什么意思。假设我们往文件系统输出,那么需要通过FileOutputStream.write(String.getBytes("UTF-8"));就可以写成一个UTF-8是个的文本文件了。加入需要往System.out.print输出那么如果会直接使用Unicode作为编码方式,如果你的out重定向了那么需要看响应的查看器是如何对二进制数组解码的。如果你确定查看器采用UTF-8方式解码,那么使用Unicode输出也可以看到中文,但有些宽字符是会出错的。最好采用System.out.write(String.getBytes("UTF8"),0,length)的方式。
      

  3.   

    更正一下,System.out.print输出的时候应该是采用系统缺省字符集进行转换的,而不是缺省采用Unicode。可以通过虚拟机的启动参数来指定。
      

  4.   

    楼主对字符的编码,理解的可能不太到位。
    编码其实,就是二进制数,与字符的映射关系。
    那么,它只和二进制数和字符有关。
    Java内存中的字符(字符串),都是Unicode编码的。
    所以,当你的二进制数是GBK编码的时候,首先要用解码器将GBK转换成Unicode编码,然后再保持到字符当中。
    也就是说,你应该先得到二进制数据:byte [] data = ...;
    然后,生成字符串:String str = new String(data,"GBK");
    这样,这个字符串就可以正常显示了。
    如果,输出的数据,要UTF-8编码的,那么,应该是这样:byte [] outData = str.getBytes("UTF-*");
    然后,out.write(outData);将数据写入的IO当中。不应该出现楼主那种变态的写法:new String(str.getBytes("gbk"), "utf-8");
    这种写法,很变态,一般都是对字符数据编码理解得不透彻,才这么写的。
    编码编的是二进制数据,编码后,二进制数据(字节流或字节数组)会转换成Java语言的字符(串)型的数据,供编程人员使用。
      

  5.   

    楼主找到解决方法了吗  我遇到跟楼主一样的情况 不过我的项目要部署到AIX上
      

  6.   

    InputStreamReader和InputStreamWrite类的第二个参数可以指定字符编码方式.
    来源于:http://blog.csdn.net/qq675927952/article/details/6359196
    http://blog.csdn.net/smartcat86/article/details/4085739/
    希望对你有用。
    我的疑问是:unicode编码的String也能装多字节编码的gbk?
      

  7.   

    咳咳,unicode是16位的,gbk也是16位的哟
      

  8.   

    楼上的还上google一下吧,谁说gbk是16位的?全是汉字的话我相信,字母的汉字混排的话就难说了。
      

  9.   

    比如:你先用GBK先把中文在程序中读出来,用String保存,再调用getBytes()方法指定为utf-8不就行了吗,程序里将字符都还原出来,就可以重新编码,没问题的
      

  10.   

    要先转成 iso-8859-1 格式, 然后再转 UTF-8return new String(str.getBytes("iso-8859-1"), "utf-8");没有API,只能自己写
      

  11.   

    不要无视 java.nio.charset包提供的类
      

  12.   

    我只想大声的说一句,编码问题,很头痛……………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………
    request.set
    response.set
    没多大用,不知道传的数据在哪被改了
    还有他吗的MYSQL明明装的时候选了gbk,他吗的,存进去还是乱码,数据库连接给定了?useUnicode=true&characterEncoding = gbk存进去的数据还是乱码,我现在都不想用gbk了,尤其是,浏览器居然还默认用UTF8来作解析,啥都不能说了,用utf8吧,省事
      

  13.   

    不要无视 java.nio.charset包提供的类你倒是说个解决方法啊