`
cowboy_bebop
  • 浏览: 111692 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

Java对编码问题的总结

    博客分类:
  • J2SE
阅读更多

总结下这两天对编码的认识一些认识,本文显得比较啰嗦,应为这是我探讨的整个流程结果,了解的有不对的地方多多指点出来! 

      不了解的相信你会有个不错的认解,这是我学习编程的一个开始,大家就多多帮村。 

      在查看网上一些资料时候,首先第一个奇怪的现象出了,据说是移动打不过联通的根本原因。 
      如果你的电脑操作系统是win2000或winxp的话,那么: 
      1、在桌面上点右键,选择新建 - 文本文档; 
      2、打开“新建 文本文档“,录入“移动“两字后存盘退出; 
      3、重新打开“新建 文本文档“,看到什么了? 
      4、是不是刚刚录入的“移动“两字? 
      咱们换过来 
      1、在桌面上点右键,选择新建 - 文本文档; 
      2、打开“新建 文本文档“,录入“联通“两字后存盘退出; 
      3、重新打开“新建 文本文档“,看到什么了? 
      4、是不是刚刚录入的“联通“两字不见了,取而代之是个烧焦的手机电池的摸样? 
      呵呵,是不是很有趣,自己试一下,如果重新建个,除了键入“联通”还多敲几个字,“联通”又能正常显示啦。 
      (以下说的是中文的系统)这个道理还是挺明显的,简单的说文本他本身默认存入编码为GBK,但是“联通”二字的二进制格式跟utf-8编码的格式相同,所以再次打开的时候就是系统用了utf-8的格式去解读了gbk的文本,所以出现乱码。 


      首先了解下上网了解下so8859-1,GB2312/GBK,unicode,utf-8,utf-16等编码的背景资料以及各自关系。 
      接下来自己又对了java编程做了些实验,我以“连通”二字做了实验,应为不想对不住联通,“连通”二字解成GBK二进制码后也是符合utf-8编码的二进制码格式。 这个问题晚上查一下一大堆,在这里就不多说了。 
      接下来是探讨java运行时的编码转换,好,开始建立一个文本,输入“连通”二字,默认保存。 


      测试程序

Java代码 
  1. import java.io.BufferedReader;  
  2. import java.io.FileInputStream;  
  3. import java.io.FileNotFoundException;  
  4. import java.io.IOException;  
  5. import java.io.InputStreamReader;  
  6. import java.io.UnsupportedEncodingException;  
  7.   
  8. public class Charset {  
  9.     public static void main(String[] str) {  
  10.         System.out.println(System.getProperty("file.encoding"));  
  11.         FileInputStream fis01;  
  12.         FileInputStream fis02;  
  13.         FileInputStream fis03;  
  14.         InputStreamReader isrUTF8;  
  15.         InputStreamReader isrGBK;  
  16.         BufferedReader brUTF8;  
  17.         BufferedReader brGBK;  
  18.         try {  
  19.             fis01 = new FileInputStream("E:\\试一下.txt");  
  20.             fis02 = new FileInputStream("E:\\试一下.txt");  
  21.             fis03 = new FileInputStream("E:\\试一下.txt");  
  22.   
  23.             isrGBK = new InputStreamReader(fis02, "GBK");  
  24.             isrUTF8 = new InputStreamReader(fis01, "UTF-8");  
  25.   
  26.             brGBK = new BufferedReader(isrGBK);  
  27.             brUTF8 = new BufferedReader(isrUTF8);  
  28.   
  29.             int t = 0;  
  30.             String strGBK = brGBK.readLine();  
  31.             String strUTF8 = brUTF8.readLine();  
  32.   
  33.             System.out.println("GBK的字节-----");  
  34.             byte[] b = strGBK.getBytes();  
  35.             for (int i = 0; i < b.length; i++) {  
  36.                 System.out.println(b[i]);  
  37.             }  
  38.             System.out.println("-----");  
  39.   
  40.             System.out.println("utf-8的字节-----");  
  41.             byte[] c = strUTF8.getBytes();  
  42.             for (int i = 0; i < c.length; i++) {  
  43.                 System.out.println(c[i]);  
  44.             }  
  45.             System.out.println("-----");  
  46.   
  47.             System.out.println("直接读取的字节-----");  
  48.             byte[] y = new byte[b.length];  
  49.             int f = fis03.read(y);  
  50.             for (int d = 0; d < y.length; d++) {  
  51.                 System.out.println(y[d]);  
  52.             }  
  53.             System.out.println("-----");  
  54.   
  55.             System.out.println("GBK:" + strGBK);  
  56.             System.out.println("UTF-8:" + strUTF8);  
  57.         } catch (FileNotFoundException e) {  
  58.             e.printStackTrace();  
  59.         } catch (UnsupportedEncodingException e) {  
  60.             e.printStackTrace();  
  61.         } catch (IOException e) {  
  62.             e.printStackTrace();  
  63.   
  64.         }  
  65.   
  66.     }  
  67. }  

 

很简单的一个程序,结果为

GBK

GBK的字节----- -63 -84 -51 -88 
----- 
utf-8的字节----- 63 63 63 
----- 
直接读取的字节----- -63 -84 -51 -88 
----- 
GBK:连通 
UTF-8:??? 


如图运行过程如图: 





     源代码为本机默认编码(即GBK),在读取二进制后通过,因为在Java 语言默认的编码方式是UNICODE,单我们读取一个文本时,首先读取二进制,通过isrGBK = new InputStreamReader(fis02, &quot;GBK&quot;)用GBK编码将二进制码解析成UNICODE编码存在JVM虚拟内存里;当要打印输出,或是获取二进制码时,用byte[] b = strGBK.getBytes()(默认就是byte[] b = strGBK.getBytes(“gbk”)),UNICODE作为内存的与其他外来流的中间者沟通个个编码转换。 

      如果不指定,就是默认编码就是GBK,一般情况下就是我们存的是“GBK”,读出来的也是“GBK”,所以一般情况下不会出现乱码问题,接下来把上面的文本在保存时指定存为UTF-8时,得到结果为 

GBK 
GBK的字节----- 
-17 -69 -65 -24 -65 -98 -23 -128 63 
----- 
utf-8的字节----- 63 -63 -84 -51 -88 
----- 
直接读取的字节----- -17 -69 -65 -24 -65 -98 -23 -128 -102 
----- 

GBK:锘胯繛閫? 
UTF-8:?连通 



运行过程: 




     可以看到,二进制 -17-69-65  这三个是编码标识符,说明这是一个UTF-8编码的文本,用UTF-8解析-24-65-98等于“连”,-23-128-102=“通。 


总结就引用一下网上看到的一句话: 

       事实上,世界上任何东西要与其他东西通信会话,都存在一个既定的协议,既定的编码。人与人之间通过文字联络,汉字“妈”代表生你的那个人,这就是一种既定的编码。但注意到这样一种情况,汉字“妈”在日本文字里有可能是你生下的那个人,所以当一个中国人A与日本B之间用“妈”这个字进行交流,出现误解就很正常的。用记事本打开二进制文件与上面的情况类似。记事本无论打开什么文件都按既定的字符编码工作(如ASCII码),所以当他打开二进制文件时,出现乱码也是很必然的一件事情了,解码和译码不对应嘛。 

杂谈: 

      由于自己写的还有些地方说得比较模糊,看了别人的文章,写得太好了 http://www.iteye.com/topic/311583内部很清晰,语言精炼标准。 

      自己代码试出,原来utf-16就是unicode编码,应该是unicode字集开始时候只有unicode编码,但后来出现了utf-8编码,为了名字统一好看,给unicode编码多加了个名字叫utf-16编码。。 

       接下网上查到:UTF-16直接就是unicode编码, 没有变换, 但它包含了0x00在编码内, 头256字节码的第一个byte都是0x00, 在操作系统(C语言)中有特殊意义, 会引起问题。 

      自己之前也混淆字符集跟编码两个概念,特地链接过来http://www.iteye.com/topic/317895

分享到:
评论

相关推荐

    Java开发乱码问题解决方法汇总

    在本文中,我们将总结一些常见的Java开发乱码问题解决方法,希望能够为读者提供帮助。 1. 统一项目编码方式 乱码问题的根源之一是项目中的编码方式不统一。因此,在项目中统一使用一种编码方式是非常重要的。例如...

    java中文乱码问题解决

    "Java中文乱码问题解决" ...解决Java中文乱码问题需要了解编码的基本原理和各种编码格式的区别,并了解Java中常见的编码格式和应用场景。只有这样,才能更好地避免乱码问题,提高Java开发的效率和质量。

    Java 中文乱码问题

    总结一下,Java中文乱码问题的解决主要依赖于以下几个关键点:正确设置源代码的编码、指定JVM的字符编码、理解并正确处理文件和网络通信的字符编码。通过细心的检查和配置,大部分乱码问题都能得到解决。同时,了解...

    java编码总结1

    【标题】:“Java编码总结1”主要涉及到Java编程语言中的编码问题,这在软件开发中是至关重要的。编码问题往往会导致程序出现难以预料的错误,尤其是处理多国语言或者特殊字符时。Java作为广泛使用的跨平台语言,其...

    java压缩zip文件解决中文乱码问题

    在Java中,`java.util.zip`包提供了对ZIP文件的基本操作,但默认使用的是平台默认的字符集,这可能在跨平台操作时引发乱码问题。 为了解决这个中文乱码问题,我们需要在创建ZipEntry时指定合适的字符集,通常是UTF-...

    JAVA字符编码问题总结

     上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。  ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(二进制00100000),...

    java编程中乱码问题解决

    ### Java编程中乱码问题解决 在Java编程中,乱码问题是开发者经常遇到的一个难题,尤其是在处理中文或者其他非英文字符时。本文将详细介绍如何解决Java编程中常见的乱码问题,并提供具体的实例帮助读者理解。 ####...

    java读写csv文件,中文乱码问题

    - 解决Java处理CSV文件时的中文乱码问题,关键在于正确指定字符编码。 - 要注意文件的读取、写入以及处理过程中的编码一致性。 - 使用专门的CSV处理库能简化操作,并提供更好的兼容性。 - 对于复杂情况,了解并...

    Java乱码问题解决

    在Java开发过程中,尤其是在处理中文字符时,经常遇到字符编码不一致导致的乱码问题。由于Java默认使用Unicode编码,而在中国大陆地区,常见的字符集为GB2312(GB18030)或GBK,在台湾地区则多使用Big5编码。这些...

    Java开发Client客户端,连接Windows的Telnet服务器,解决了中文乱码问题

    总结一下,解决Java Telnet客户端中文乱码问题的关键在于: 1. 使用`Charset`类进行编码转换,确保与服务器的编码保持一致。 2. 在发送和接收数据时,正确地设置输入流和输出流的字符编码。 通过以上步骤,我们...

    jsp,java中文乱码问题另类解决方案,jni加密、解密编码

    总结来说,处理JSP和Java中的中文乱码问题需要理解字符编码的原理,并结合实际环境调整配置。当常规方法无效时,可以借助JNI实现加密和解密,以二进制数据形式绕过编码问题。这种解决方案虽然不常见,但在特定情况下...

    Java生成pdf文件,解决中文乱码问题.pdf

    Java 生成 PDF 文件,解决中文乱码问题 Java 生成 PDF 文件,解决中文乱码问题是 Java 编程中常见的问题。解决这个问题的关键是正确地设置中文字体,以避免乱码问题。本文将通过一个完整的示例代码,详细讲解如何...

    解决Linux操作系统下Java的中文乱码问题

    总结来说,解决Linux下Java中文乱码问题,关键在于确保编码一致性,包括JVM、源代码、文件读写、网络数据以及图形界面的字体设置。同时,使用统一且支持中文的编码,如UTF-8,可以有效避免乱码现象。

    Java乱码问题

    3. **对于已存在的Java文件**,如果之前保存时使用的是GBK编码格式,并且在编译时出现了乱码问题,可以通过转换文件的编码格式来解决。 - 将文件另存为ANSI格式。尽管这种方法看起来简单粗暴,但它实际上是一种有效...

    JAVA反编译文件解决中文乱码

    总结,解决JAVA反编译文件时的中文乱码问题,关键在于确定源代码的原始编码,并确保反编译工具支持该编码。同时,良好的编码规范和项目配置也是避免此类问题的重要措施。通过上述方法,开发者可以更顺利地进行Java反...

    关于java乱码学习的一点总结

    总的来说,解决 Java 乱码问题需要对整个流程有深入理解,从源文件编码、编译参数、JSP 处理到网络传输都要保持一致性。在开发中,推荐使用统一的编码格式(如 UTF-8),并在关键环节检查和设置正确的编码,以避免...

    解决中文乱码问题-java

    以下是对如何在Java中解决中文乱码问题的详细解析。 ### 解决中文乱码问题的核心思路 解决中文乱码的关键在于确保字符编码的一致性。当从不同的源(如网络请求、文件读取等)获取字符串时,必须明确知道其原始编码...

    Java乱码学习 Java乱码学习

    Java 乱码问题一直是开发...总结来说,Java乱码问题需要从源头(文件编码)、编译过程、网络传输以及服务器处理等多个层面进行排查和设置。了解并掌握这些知识点,将有助于我们更好地预防和解决Java环境下的乱码问题。

    java 解析csv文件例子,csv文件 中文乱码问题

    当处理包含中文字符的CSV文件时,可能会遇到乱码问题,这通常与文件编码设置有关。本篇文章将详细探讨如何在Java中解析CSV文件,并解决中文乱码的问题。 首先,我们需要了解如何使用Java的标准库`java.io`和`java....

Global site tag (gtag.js) - Google Analytics