知识大全 关于JAVA的中文问题

Posted 中文

篇首语:使人疲惫的不是远方的高山,而是鞋里的一粒沙子。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 关于JAVA的中文问题相关的知识,希望对你有一定的参考价值。

关于JAVA的中文问题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

   一 主题 关于JAVA的中文问题   JAVA的中文问题比较突出 主要表现在控制面板输出 JSP页面输出和数据库访问上 本文尽量避开字体问题 而只谈编码 通过本文 你可以了解JAVA中文问题的由来 问题的解决方法 其中提了一下用JDBC访问数据库的方法      二 问题描述    )在中文W 中文窗口编译和运行 用的是国际版的JDK 连接的是中文W 下的Cp 编码的SQL SERVER数据库     J:\\exercise\\demo\\encode\\HelloWorld>make   Created by XCompiler PhiloSoft All Rights Reserved   Wed May : : CST     J:\\exercise\\demo\\encode\\HelloWorld>run   Created by XRunner PhiloSoft All Rights Reserved   Wed May : : CST   中文   [B@ bc b   [B@ b b   [B@ b   中文   中文   ????   中文   中文   ????   ??   ??   ??      )如果在中文W 的西文窗口(编码为 )下编译 用JAVA运行则由于无字体而无法正常显示 如果象上面一样在中文W 的中文窗口运行 输出为     J:\\exercise\\demo\\encode\\HelloWorld>run   Created by XRunner PhiloSoft All Rights Reserved   Wed May : : CST   ????   [B@ bc b a   [B@ b b a   [B@ b a   ????   ????   ????   ????   ????   ????   中文   中文   ????     三)分析    )出现有乱码(也就是?) 由于只出现?而没出现小方框 说明只是编码有问题 而不是字体问题 在编码中 如果从一种字符集转换到别一种字符集 比较典型的是从GB 转换到ISO _ (即ASCII) 那么很多汉字(半个汉字)是无法映射到西文字符中去的 在这种情形下 系统就把这些字符用?代替 同样 也存在小字符集无法到大字符集的情况 具体原因这里就不详谈了      )出现了中文环境编译 中文环境运行时汉字显示有正确也有不正确的地方 同样 在西文环境下编译 在中文环境下运行时也出现类似情况 这是由于自动(默认)或手工(也就new String(bytes[ encode])和bytes getBytes([encode]))转码的结果      )在JAVA源文件 >JAVAC >Class >Java >getBytes() >new String() >显示的过程中 每一步都有编码的转换过程 这个过程总是存在的 只是有的时候用默认的参数进行 下面我们一步一步分析为什么出现上面的情形      )这里是源代码     HelloWorld java:      public class HelloWorld      public static void main(String[] argv)   try   System out println( 中文 );//   System out println( 中文 getBytes());//   System out println( 中文 getBytes( GB ));//   System out println( 中文 getBytes( ISO _ ));//     System out println(new String( 中文 getBytes()));//   System out println(new String( 中文 getBytes() GB ));//   System out println(new String( 中文 getBytes() ISO _ ));//     System out println(new String( 中文 getBytes( GB )));//   System out println(new String( 中文 getBytes( GB ) GB ));//   System out println(new     String( 中文 getBytes( GB ) ISO _ ));//     System out println(new String( 中文 getBytes( ISO _ )));//   System out println(new     String( 中文 getBytes( ISO _ ) GB ));//   System out println(new     String( 中文 getBytes( ISO _ ) ISO _ ));//      catch(Exception e)   e printStackTrace();              为了方便起见 在每个转换的后面加了操作序号 分别为      )需要说明的是 JAVAC是以系统默认编码读入源文件 然后按UNICODE进行编码的 在JAVA运行的时候 JAVA也是采用UNICODE编码的 并且默认输入和输出的都是操作系统的默认编码 也就是说在new String(bytes[ encode])中 系统认为输入的是编码为encode的字节流 换句话说 如果按encode来翻译bytes才能得到正确的结果 这个结果最后要在JAVA中保存 它还是要从这个encode转换成Unicode 也就是说有bytes >encode字符 >Unicode字符的转换 而在String getBytes([encode])中 系统要做一个Unicode字符 >encode字符 >bytes的转换     在这个例子中 除那个英文窗口编码的时候除外 其实情形下默认编码都是GBK(在本例中 我们暂且把GBK和GB 等同看待)      )由于在未指明在上面的两个用代码实现的转换中 如果未指定encode 系统将采用默认的编码(这里为GBK) 我们认为上面的 和 是一样的 和 和 也是一样的 所以我们在讨论中将只讨论 其中的 只是用于测试 不在我们的讨论范围之内      )下面我们来跟踪程序中的 中 字的转换历程 我们先说在中文窗口下作的编译和运行过程 注意在下面的字母下标中 我有意识地使用了一些数字 以表示相同 相异还是相关 )我们先以上面的 个代码段中的的代码 为例     步骤 内容 地点 说明    C HelloWorld java C 泛指一个GBK字符    U JAVAC读取 U 泛指一个Unicode字符    C getBytes()第一步 JAVA先和操作系统交流    B B getBytes()第二步 然后返回字节数组    C new String()第一步 JAVA先和操作系统交流    U new String()第二步 然后返回字符    C println(String) 能显示 中 字 内容和原来的相同      )然后再以代码段 为例 我们注意到只是     步骤 内容 地点 说明    C HelloWorld java C 泛指一个GBK字符    U JAVAC读取 U 泛指一个Unicode字符    C getBytes()第一步 JAVA先和操作系统交流    B B getBytes()第二步 然后返回字节数组    C C new String()第一步 JAVA先和操作系统交流 这时解析错误    U U new String()第二步 然后返回字符    C C println(String) 由于中字给分成了两半 在ISO _ 中刚好也没有字符     能映射上 所以显示为 ?? 在上面的示例中    中文 两个字就显示为 ????    )在完全中文模式下的其它情形类似 我就不多说了      )我们接着看为什么在西文DOS窗口下编译出来的类在中文窗口下也出现类似情形 特别是为什么居然有的情形下还能正确显示汉字      )我们还是先以代码段 为例     步骤 内容 地点 说明    C C HelloWorld java C C 分别泛指一个ISO _ 字符 中 字被拆开    U U JAVAC读取 U U 泛指一个Unicode字符    C C getBytes()第一步 JAVA先和操作系统交流 这时解析错误    B B B B getBytes()第二步 然后返回字节数组    C C new String()第一步 JAVA先和操作系统交流    U U new String()第二步 然后返回字符    C C println(String) 虽然同是两个字符 但已不是最初的 两个ISO _ 字     符 而是 两个BGK字符 中 显示成了 ??   而 中文 就显示成了 ????      )下面我们以代码段 为例 因为它能正确显示汉字     步骤 内容 地点 说明      C C HelloWorld java C C 分别泛指一个ISO _ 字符 中 字被拆开    U U JAVAC读取 U U 泛指一个Unicode字符   C C getBytes()第一步 JAVA先和操作系统交流(注意还是正确的哦!)    B B getBytes()第二步 然后返回字节数组(这是很关键的一步!)    C new String()第一步 JAVA先和操作系统交流(这是更关键的一步 JAVA已经知道B B 要解析成一个汉字!)    U new String()第二步 然后返回字符(真是一个项两!U 包含了U U 的信息)    C println(String) 这就原来的 中 字 很委屈被JAVAC冤枉了一回 不过被程序员拨乱反正了一下!当然 中文 两个字都能正确显示了!      )那为什么有的时候用JDBC的   new String(Recordset getBytes(int)[ encode])   Recordset getSting(int)   Recordset setBytes(String getBytes([encode]))   和   Recordset setString(String)   的时候会出现乱码了呢?     其实问题就出现在编写JDBC的的也考虑了编码问题 它从数据库读取数据后 可能自作主张做了一个从GB (默认编码)到Unicode的转换 我的这个WebLogic For SQL Server的JDBC Driver就是这样的 当我读字串的时候 发出读到的不是正确的汉字 可恨的是我却可以直接写汉字字串 这让人多少有点难以接受!   也就是说 我们不得不在读或写的时候进行转码 尽管这个转码有的时候不是那么明显 这是因为我们使用了默认的编码进行转码 JDBC Driver cha138/Article/program/Java/Javascript/201311/25432

相关参考

知识大全 关于JAVA单例的问题

关于JAVA单例的问题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  这个问题由最开始使用JAC

知识大全 关于使用JAVA单例的问题分析

关于使用JAVA单例的问题分析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  这个问题由最开始使

知识大全 Java中的中文编码问题

Java中的中文编码问题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ()为什么要编码&nbs

知识大全 跟你一起分析JAVA中文比较问题的解决

跟你一起分析JAVA中文比较问题的解决  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java的

知识大全 关于设置Java虚拟机(JVM)的内存问题

关于设置Java虚拟机(JVM)的内存问题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  最近做

知识大全 java关于split分割字符串 空字符串不能得到的问题

  classT  publicstaticvoidmain(Stringargs[])  Stringnum[]=newString[];  StringsLine=||//|周润英||||||||

知识大全 关于线程的停止问题

  多线程是java的一个优势java使得程序员可以很方便的进行多线程程序开发获得更好的性能  关于多线程的概念以及一般的多线程编程比如如何以及为何实现runnable接口为何stop()会被Depr

知识大全 为系统添加新字体和中文显示

    为Redhat的两个字体子系统添加字体  让Enlightenment显示中文  Java的中文问题:    JBuilder的中文问题    JSDK的中文问题    JRE的中文问题   

知识大全 几个常见的关于日期的问题解决方法

  怎样计算两个时间之间的间隔?  间隔=DategetTime()DategetTime();得出来的是毫秒数  除是秒再除是分再除是小时    记住java标准库中所有时间类都以此为基础转化的只是

知识大全 struts中文问题和国际化问题的终极解决方案

  Java本身就支持多国语言编码不需要写任何程序可以很简单的实现秘诀就是两点    所有HTML/JSP页面全部采用UTF编码    客户端浏览器完全支持UTF编码    步骤  首先把所有的HTM