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 {
javac在不指定encoding参数时,假如区域设定不精确,则大概造成编/解码错误,这个问题在编译一个从别的环境传过来的文件时大概发生;
public static void main(String[] args) {
System.out.println(System.getProperty("file.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编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |