`

encoding编码问题之一Java文件

    博客分类:
  • J2SE
阅读更多
1.编辑*.java文件时发生了什么事情呢?
答:当我们用记事本编辑时,
   打开紫光输入法,紫光输入法软件控制了键盘,从键盘敲击的字母变成了拼音,拼音下方显示的是GBK中的简体还是繁体取决于指定的"简体""GBK",此时上方的"yanlei"就有了下方的汉字"眼泪"而不是"眼淚".
  
   在空格录入"眼泪"以后,表征这两个字的键盘输入文件设备缓冲区内被存入了D1BBC0E1,这是由于紫光指定了"简体GBK"进而cpu告知系统IO设备管理器得知输入的字符是简体GBK,因此I操作接收了紫光送来的D1BBC0E1进入缓冲区.键盘文件录入设备有编码集"简体GBK"
  
   由于并行处理的机制,完成这个输入动作后,cpu得到输入IO管理器的I输入完成中断指令,cpu利马把缓冲区的内容往内存处理区中送,这个送的过程伴随着一个码转换函数的调用,就是GBK码D1BBC0E1往Unicode内存处理码FFFE3C77EA6C的转换,当cpu把缓冲区D1BBC0E1送至处理区FFFE3C77EA6C完毕,发现O操作线程提出了需要显示的处理,紧接着又调用码转换函数Unicode内存处理码FFFE3C77EA6C往屏显缓冲区GBK码D1BBC0E1的转换动作,当转换完毕,开始调度IO设备让它进行O显示操作(这里的内存处理码的转换对用户来说是透明的,用户完全可以理解"入缓冲-处理区-出缓冲"是同一个码副本)
  
   IO设备得到cpu通知说可以取出屏显缓冲区内容进行显示了,IO取出D1BBC0E1对照字体映射字符点阵符号表进行展示"眼泪",取出D1BBC0E1这些01代码时到底按照哪个编码进行展示呢?这时屏显文件输出设备利用了系统Locale代码页也就是ANSI936 GBK代码页就行展示,根据不同的字体显示同一个中文字符的不同字符点阵符号。所以这里屏显设备也参考了编码集才能进行正确显示
   键盘入缓冲GBK->内存处理unicode->屏显出缓冲GBK的一个转换(文件保存缓冲采用GBK码的一个副本), 是透明的


2.编辑好的*.java文件保存时发生了哪些事情呢?
答:编辑好的java源文件可以采用默认的GBK即ANSI936来保存文件,至于各种保存方案为什么存在以及各自的优缺点在上方的【源文件文件保存:】这里有介绍。所以在此处我们也就理解了eclipse工作空间workspace设定编码方案类似于另存为弹出窗口编码下拉框的指定
  
   键盘入缓冲GBK->内存处理unicode->文件保存缓冲GBK的一个转换,是透明的
       文件保存缓冲UTF-8的一个转换,是透明的
       文件保存缓冲unicode的一个转换,是透明的

3.编译java源文件的时候发生了什么呢?
答:javac命令 javac -file.encoding xxx.java通过这个指令我们知道-file.encoding这个属性是有作用的
     -file.encoding告诉JVM虚拟机是用什么编码方式保存文件的,
     pageEncoding
     setContentType()
     setCharacterEncoding()
  
   3.1 当我们保存java源程序文件为GBK即ANSI代码页时,取出编译时javac默认-file.encoding取的当前系统的默认文件编码方案,所以取出文件缓冲池内的"眼泪"D1BBC0E1会被正确的转换到内存处理区FFFE3C77EA6C,处理完了之后待生成*.class文件保存的时候又把内存处理区FFFE3C77EA6C转换成了UTF-8格式EFBBBFE79CBCE6B3AA保存在了*.class文件之中,因为*.class文件默认使用UTF-8保存。
  
   动作:[GBK录入->unicode->GBK码文件缓冲(编辑时入)]====源文件怎么保存来的
                           |||||||||||||||||||||||
                           GBK码文件缓冲(编译时出)->unicode->UTF-8码class文件保存
    
     可以看出取出文件时,文件编码被对待成保存成的编码是正确的
   3.2 当我们保存java源程序文件为UTF-8时(动作:GBK码D1BBC0E1->处理区FFFE3C77EA6C->UTF-8码EFBBBFE79CBCE6B3AA),取出编译时javac默认-file.encoding取的当前系统的默认文件编码GBK方案系统Locale语言指定,所以此处我们就需要进行源文件编码的指定.
   3.2.1 如果我们没有重新指定的话:UTF-8格式EFBBBFE79CBCE6B3AA文件读出流的"眼泪"就会被当作是GBK编码E79C,BCE6,B3AA,造成错误,进行了GBK文件读出流->unicode处理->UTF-8码class文件保存的过程,在这个过程中GBK文件读出流发生了错误,导致以后的整个过程的错误.
  
   动作:[GBK录入->unicode->utf-8码文件缓冲(编辑时入)]====源文件怎么保存来的
                                   |||||||||||||||||||||||
                                   GBK码文件缓冲(编译时出)->unicode->UTF-8码class文件保存
    
     可以看出取出文件时,文件编码被对待成GBK编码是错误的
   3.2.2 如果我们指定了-file.encoding=utf-8,这时编译器就会知道源码是utf-8编码.
  
   动作:[GBK录入->unicode->utf-8码文件缓冲(编辑时入)]====源文件怎么保存来的
                               |||||||||||||||||||||||
                               utf-8码文件缓冲(编译时出)->unicode->UTF-8码class文件保存
    
     可以看出取出文件时,文件编码被对待成保存时的utf-8编码是正确的
4.执行.class文件的时候发生了什么呢?
当JVM执行.class文件时,jvm直接将保存的utf-8格式的class文件拿出来执行,进行
utf-8码class文件->内存处理unicode->处理后屏显GBK码,追加以前的从编辑开始的动作,如下:
[GBK录入->unicode->utf-8码文件缓冲(编辑时入)]====java源文件怎么保存的
             |||||||||||||||||||||||
             utf-8码文件缓冲(编译时出)->unicode->UTF-8码class类文件怎么编译保存的
               ||||||||||||||||
               UTF-8码class文件->unicode->GBK码屏显 class类文件怎么执行
  
   好:通过以上三个环节之后,我们就知道jvm虚拟机处理编码工作的原理,
       在这里需要强调一下,
     unicode->UTF-8码class类文件怎么编译保存的
       ||||||||||||||||
       UTF-8码class文件读出->unicode
       这个类文件的细节编码是我们不需要关心的,因为类文件的编码解码都是由JVM自动实现的,不需要本地操作系统file.encoding属性的参与的,对用户来说是透明的,所以我们可以不必考虑这层码的转换.
       那么:上诉动作可以简化为:
       GBK录入->unicode->utf-8码文件缓冲(编辑时入)]====java源文件怎么保存的
           |||||||||||||||||||||||
                         utf-8码文件缓冲(编译时出)->unicode->->GBK屏显 class类文件怎么执行
       其中GBK录入和GBK屏显都是根据系统Locale ANSI936来决定的
       简化了之后我们可以看出文件的保存时编码和取出时编码是至关重要的,这里如果发生了错误,尤其是取出时编码的误认为-file.encoding=系统Locale是致命的。
      
   针对普通Java类:
   一句话总结:针对静态字符串文件以什么码保存就必需以什么码取出编译javac -file.encoding="文件保存码"
             针对动态字符串,如从数据库数据文件存取内容时,数据文件什么码,rs.getString().getBytes("数据文件编码")   取出时new String(rs.getString().getBytes("数据文件编码"),"java文件保存码")
     存入时new String(str.getBytes("java文件保存码"),"数据文件编码");
      
这里所设计都是普通的java类,那么jsp和servlet又是怎样的呢
分享到:
评论

相关推荐

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

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

    用java修改文件的编码

    在Java编程语言中,修改文件编码是一项常见的任务,特别是在处理不同源代码或数据文件时。本文将深入探讨如何使用Java来实现这一功能,主要关注以下几个关键知识点: 1. **字符编码的理解**:字符编码是将字符与二...

    java乱码问题解决方法

    Java 乱码问题是 Java 开发中常见的问题之一,解决这个问题需要了解 Java 的编码方式、JSP 中文乱码问题、Tomcat 5.5 中文乱码问题、JDBC ODBC Bridge 的 Bug 及其解决方法、Solaris 下 Servlet 编程的中文问题及...

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

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

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

    Java开发中乱码问题是非常常见的问题之一,而解决这些问题需要具备一定的技术知识和经验。在本文中,我们将总结一些常见的Java开发乱码问题解决方法,希望能够为读者提供帮助。 1. 统一项目编码方式 乱码问题的...

    Java文件编码转换源码

    在Java编程语言中,文件编码转换是一个常见的任务,特别是在处理多国语言或者处理不同系统间的文件传输时。本文将深入探讨如何使用Java实现文件编码的转换,主要关注GB2312、UTF-8这两种常见编码格式之间的转换。 ...

    java中文乱码问题

    Java 中文乱码问题是一个老生常谈的问题,特别是在 Web 应用中。今天,我们将从编码角度分析 Java 编译后在控制台和 Web 等终端显示乱码问题。 一、 Java 处理字符的原理 Java 使用 UNICODE 来存储字符数据,处理...

    Java 文件编码转换,将项目下的java文件编码由gbk与utf-8互转

    * changeFileCode 方法,4个属性:(需要转换的文件目录,转换后的文件目录,当前文件编码格式,转换成需要的文件编码); * 需要转换的文件目录,转换后的文件目录--可以为同一路径 * * @param srcDirPath 需要...

    java文件编码转换

    本篇文章将深入探讨“Java文件编码转换”这一主题,以及如何利用Java进行文件编码的转换,解决在处理文本文件时可能出现的乱码问题。 首先,我们要理解什么是字符编码。字符编码是用来表示文本的一种规则,常见的有...

    用java对文件进行压缩并且解决乱码问题

    总的来说,使用Java的`ZipOutputStream`进行文件压缩时,必须注意文件名和路径的正确编码,以避免乱码问题。通过使用合适的编码方式(如UTF-8)并在`ZipOutputStream`构造函数中明确指定,可以确保在跨平台操作时...

    java读取文件中文乱码

    在Java编程中,读取包含中文字符的文件时可能会遇到乱码问题,这通常是由于编码格式不匹配导致的。要解决这个问题,我们需要理解文件的原始编码格式,并在Java代码中正确地设置字符集。以下是一些相关的知识点: 1....

    java中文乱码解决问题

    JAVA 中文乱码问题是开发过程中常见的问题之一,解决这个问题需要了解乱码产生的原因,然后对症下药。下面我们对容易产生乱码问题的场景进行分析,并提出解决方案。 1. 以 POST 方法提交的表单数据中有中文字符 在...

    Java关于中文乱码问题的多种解决方法

    在Java编程中,中文乱码问题是一个常见的困扰,尤其是在处理文件读写、网络传输或数据库操作时。本文将深入探讨几种解决Java中中文乱码问题的方法,并以MyEclipse为开发环境,结合实际示例进行讲解。 1. 文件读写中...

    idea中.properties文件中文显示乱码问题的解决 文件中文乱码1

    总结,解决IntelliJ IDEA中`.properties`文件中文显示乱码的问题,关键在于确保文件编码与IDE设置相匹配,并且可能需要调整IDE的默认编码设置。通过以上步骤,大多数情况下的乱码问题都能得到解决。如果问题依然存在...

    JAVA常见中文乱码问题解决方法

    Java编程语言在处理中文字符时可能会遇到乱码问题,这主要源于Java的源代码编码、JVM处理class文件以及不同操作系统、数据库系统之间的编码不一致。本文深入剖析了Java中文问题的根源,并提供了相应的解决方案。 一...

    java获取乱码问题

    在Java应用开发过程中,字符编码问题一直是困扰开发者的一大难题,尤其是在处理HTTP请求中的中文或特殊字符时,经常会出现乱码现象。本文将详细介绍如何通过修改`server.xml`配置文件来解决Java应用中出现的乱码问题...

    EncodingDetector:通过java检测系统编码或文件编码

    编码检测器 通过java检测系统编码或文件编码 java -jar EncodingDetector.jar system java -jar EncodingDetector.jar file java -jar EncodingDetector.jar both

    Java 中文乱码问题

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

    java中文乱码大全

    2. Java文件的编码保存:Java源文件在保存时通常会根据操作系统的file.encoding属性保存为相应的编码格式,这可能与Java内部的UNICODE编码不一致。 3. 网络传输编码:浏览器在发送请求时,默认采用UTF-8编码格式,...

    myeclipse/eclipse 批量转换java文件编码( com.lifesting.tool.encoding_1.0.0.jar)

    插件会自动读取选中的Java文件,将它们的编码转换为指定格式,从而解决了文件编码不匹配的问题,避免了因编码问题导致的乱码或编译错误。 在实际开发中,保持编码一致性是非常必要的,它不仅影响代码的正常运行,还...

Global site tag (gtag.js) - Google Analytics