当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:15:00  来源:本站整理

JNI中文处理问题小结[Java编程]

赞助商链接



  本文“JNI中文处理问题小结[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

由于工作关系,需求操纵JNI在C++与Java程序之间举行办法调用和数据传送,但从前老是在英文环境下工作,对中文(其他语言编码同理)问题反倒没有太关注,近来抽了点时间研究了一下,将自己的领会整理以下,供大家谈论或参考.

在进一步谈论之前,有几点底子知识需求阐明:

在Java内部,全部的字符串编码采取的是Unicode即UCS-2.Unicode是用两个字节表示每个字符的字符编码筹划.Unicode有一个特点:它包含了世界上全部的字符字形.所以,各个区域的语言都可以成立与Unicode的映射关系,而Java恰是操纵了这一点以到达异种语言之间的转换;

UTF-8是另一种差别于UCS-2/UCS-4的编码筹划,此中UTF代表UCS Transformation Format,它采取变长的方法举行编码,编码长度可以是1~3(据说理论上最长可以到6,不懂).

由于UCS-2/UCS-4编码定长的缘由,编码产生的字符串会包含一些特别的字符,如(即0x0,全部0~256的字符Unicode编码的第一个字节),这在有些情形下(如传输或解析时)会给我们带来一些麻烦,并且关于普通的英文字母浪费了太多的空间,此外,据说UTF-8还有Unicode所没有的纠错本领(不懂!),因此,Unicode常常只是被用作一种中间码,用于逻辑表示.关于Unicode/UTF-8的更多信息,见参考1;

Java中文乱码问题在很多情形下都大概发生:差别利用间,差别平台间等等,但以上问题已有大量优异的文章谈论过,这里不作深化探究,详见参考2、3、4、5.下面扼要总结一下:

当我们利用默许编码方法保存源文件时,文件内容实际上是按照我们的系统设定举行编码保存的,这个设定值即file.encoding可以通过下面的程序得到:

public class Encoding {
  public static void main(String[] args) {
    System.out.println(System.getProperty("file.encoding"));
  }
}
javac在不指定encoding参数时,假如区域设定不精确,则大概造成编/解码错误,这个问题在编译一个从别的环境传过来的文件时大概发生;

2、固然在Java内部(即运行期间,Runtime)字符串是以Unicode情势存在的,但在class文件中信息是以UTF-8情势存储的(Unicode仅被用作逻辑表示中间码) ;

关于Web利用,以Tomcat为例,JSP/Servlet引擎供应的JSP转换工具(jspc)搜索JSP文件顶用<%@ page contentType ="text/html; charset=<Jsp-charset>"%>指定的charset.假如在JSP文件中未指定<Jsp-charset>,则取系统默许的file.encoding(这个值在中文平台上是GBK),可通过掌握面板的Regional Options举行改正;jspc用相当于“javac –encoding <Jsp-charset>”的号令注释JSP文件中呈现的全部字符,包含中文字符和ASCII字符,然后把这些字符转换成Unicode字符,再转化成UTF-8格局,存为JAVA文件.

我曾经无意将jsp文件存成UTF-8,而在文件内部利用的charset倒是GB2312,后果运行时老是无法正常显示中文,后来转存为默许编码方法才正常.只要文件存储格局与JSP开首的charset设置一致,就都可以正常显示(不过将文件保存成UTF-16的情形下我还没有试验成功);

在XML文件中,encoding表示的是文件本身的编码方法,假如这个参数设定与文件本身实际的编码方法不一致的话,则大概解码失利,所以应当老是将encoding设置成与文件编码方法一致的值;而JSP/HTML的charset则表示按照何种字符集来解码从文件中读取出来的字符串(在理解中文问题时应当把字符串理解成一个二进制或16进制的串,按照差别的charset大概映射成差别的字符).

我曾经在网上就encoding的具体含义跟别人谈论过:假如encoding指的是文件本身的编码方法,那么读取该文件的利用程序在不知道encoding设置的情形下若何精确解读该文件呢?

按照谈论及个人理解,处理程序(如jspc)老是按ISO8859-1来读取输入文件,然后查抄文件开始的几个字节(即Byte Order Mark,BOM,具体若何判断,可以参考Tomcat源码$SOURCE_DIRjasperjasper2srcshareorgapachejasperxmlparserXMLEncodingDetector.java的getEncodingName办法,在JSP Specification的Page Character Encoding一节也有具体阐述)以探测文件是以何种格局保存的,当解析到encoding选项时,若encoding设置与文件实际保存格局不一致,会尝试举行转换,但这种转换大概在文件实际以ISO8859-1/UTF-8等单字节编码而encoding被设置成Unicode、UTF-16等双字节编码时发生错误.


  以上是“JNI中文处理问题小结[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • JNI中文处理问题小结
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .