欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Java中文&編碼問(wèn)題小結 - 笨笨的思想片斷 - BlogJava

Java中文&編碼問(wèn)題小結

Posted on 2005-10-09 16:52 笨笨 閱讀(3447) 評論(9)  編輯 收藏 收藏至365Key 所屬分類(lèi): Java

Java中文&編碼問(wèn)題小結

 

笨笨

 

Java字符編碼轉換過(guò)程說(shuō)明

 

 

常見(jiàn)問(wèn)題

 

 

JVM

JVM啟動(dòng)后,JVM會(huì )設置一些系統屬性以表明JVM的缺省區域。

user.language,user.region,file.encoding等。 可以使用System.getProperties()詳細查看所有的系統屬性。

 

如在英文操作系統(UNIX)下,可以使用如下屬性定義強制指定JVM為中文環(huán)境 -Dclient.encoding.override=GBK -Dfile.encoding=GBK -Duser.language=zh -Duser.region=CN

 

.java-->.class編譯

說(shuō)明:一般javac根據當前os區域設置,自動(dòng)決定源文件的編碼.可以通過(guò)-encoding強制指定.

 

錯誤可能:

1 gbk編碼源文件在英文環(huán)境下編譯,javac不能正確轉換.曾見(jiàn)于java/jsp在英文unix. 檢測方法:寫(xiě)\u4e00格式的漢字,繞開(kāi)javac編碼,再在jvm,將漢字作為int打印,看值是否相等;或直接以UTF-8編碼打開(kāi).class文件,看看常量字符串是否正確保存漢字。

 

文件讀寫(xiě)

外部數據如文件經(jīng)過(guò)讀寫(xiě)和轉換兩個(gè)步驟,轉為jvm所使用字符。InputStream/OutputStream用于讀寫(xiě)原始外部數據,Reader/Writer執行讀寫(xiě)和轉換兩個(gè)步驟。

 

1 文件讀寫(xiě)轉換由java.io.Reader/Writer執行;輸入輸出流 InputStream/OutputStream  處理漢字不合適,應該首選使用Reader/Writer,如 FileReader/FileWriter。

 

2 FileReader/FileWriter使用JVM當前編碼讀寫(xiě)文件.如果有其它編碼格式,使用InputStreamReader/OutputStreamWriter

 

3 PrintStream有點(diǎn)特殊,它自動(dòng)使用jvm缺省編碼進(jìn)行轉換。

 

 

讀取.properties文件

.propeties文件由Properties類(lèi)以iso8859-1編碼讀取,因此不能在其中直接寫(xiě)漢字,需要使用JDK native2ascii工具轉換漢字為\uXXXX格式。命令行:native2ascii –encoding GBK inputfile outputfile

 

讀取XML文件

1 XML文件讀寫(xiě)同于文件讀寫(xiě),但應注意確保XML頭中聲明如<? xml version=”1.0” encoding=”gb2312” ?>與文件編碼保持一致。

 

2 javax.xml.SAXParser類(lèi)接受InputStream作為輸入參數,對于Reader,需要用org.xml.sax.InputSource包裝一下,再給SAXParser。

 

3 對于UTF-8編碼 XML,注意防止編輯器自動(dòng)加上\uFFFE BOM, xml parser會(huì )報告content is not allowed in prolog。

 

 

字節數組

1 使用 new String(byteArray,encoding)   String.getBytes(encoding)  在字節數組和字符串之間進(jìn)行轉換

 

也可以用ByteArrayInputStream/ByteArrayOutputStream轉為流后再用InputStreamReader/OutputStreamWriter轉換。

 

錯誤編碼的字符串(iso8859-1轉碼gbk)

如果我們得到的字符串是由錯誤的轉碼方式產(chǎn)生的,例如:對于gbk中文,由iso8859-1方式轉換,此時(shí)如果用調試器看到的字符串一般是 的樣子,長(cháng)度一般為文本的字節長(cháng)度,而非漢字個(gè)數。

 

可以采用如下方式轉為正確的中文:

text = new String( text.getBytes(“iso8859-1”),”gbk”);

 

JDBC

轉換過(guò)程由JDBC Driver執行,取決于各JDBC數據庫實(shí)現。對此經(jīng)驗尚積累不夠。

 

1 對于ORACLE數據庫,需要數據庫創(chuàng )建時(shí)指定編碼方式為gbk,否則會(huì )出現漢字轉碼錯誤

2 對于 SQL Server 2000 ,最好以nvarchar/nchar類(lèi)型存放文本,即不存在中文/編碼轉換問(wèn)題。

3 連接 Mysql,將 connectionString 設置成 encoding gb2312

 String connectionString  = "jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=gb2312";

 

WEB/Servlet/JSP

1 對于JSP,確定頭部加上 <%@ page contentType="text/html;charset=gb2312"%>這樣的標簽。

2 對于Servlet,確定 設置setContentType (“text/html; charset=gb2312”),以上兩條用于使得輸出漢字沒(méi)有問(wèn)題。

3 為輸出HTML head中加一個(gè) <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> ,讓瀏覽器正確確定HTML編碼。

 

4 Web應用加一個(gè)Filter,確保每個(gè)Request明確調用setCharacterEncoding方法,讓輸入漢字能夠正確解析。

 

 

import java.io.IOException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.UnavailableException;

import javax.servlet.http.HttpServletRequest;

 

/**

 * Example filter that sets the character encoding to be used in parsing the

 * incoming request

 */

public class SetCharacterEncodingFilter

    implements Filter {

  public SetCharacterEncodingFilter()

  {}

  protected boolean debug = false;

  protected String encoding = null;

  protected FilterConfig filterConfig = null;

  public void destroy() {

    this.encoding = null;

    this.filterConfig = null;

  }

 

  public void doFilter(ServletRequest request, ServletResponse response,

                       FilterChain chain) throws IOException, ServletException {

//    if (request.getCharacterEncoding() == null)

//    {

//      String encoding = getEncoding();

//      if (encoding != null)

//        request.setCharacterEncoding(encoding);

//

//    }

      request.setCharacterEncoding(encoding);

      if ( debug ){

        System.out.println( ((HttpServletRequest)request).getRequestURI()+"setted to "+encoding );

      }

    chain.doFilter(request, response);

  }

 

  public void init(FilterConfig filterConfig) throws ServletException {

    this.filterConfig = filterConfig;

    this.encoding = filterConfig.getInitParameter("encoding");

    this.debug = "true".equalsIgnoreCase( filterConfig.getInitParameter("debug") );

  }

 

  protected String getEncoding() {

    return (this.encoding);

  }

}

 

 

web.xml中加入:

 

  <filter>

    <filter-name>LocalEncodingFilter</filter-name>

    <display-name>LocalEncodingFilter</display-name>

    <filter-class>com.ccb.ectipmanager.request.SetCharacterEncodingFilter</filter-class>

    <init-param>

      <param-name>encoding</param-name>

      <param-value>gb2312</param-value>

    </init-param>

    <init-param>

      <param-name>debug</param-name>

      <param-value>false</param-value>

    </init-param>

  </filter>

 

   <filter-mapping>

    <filter-name>LocalEncodingFilter</filter-name>

    <url-pattern>/*</url-pattern>

  </filter-mapping>

 

5 用于Weblogicvedor-specific):

其一:web.xml里加上如下腳本:

<context-param>

  <param-name>weblogic.httpd.inputCharset./*</param-name>

  <param-value>GBK</param-value>

</context-param>

其二(可選)在weblogic.xml里加上如下腳本:

<charset-params>

  <input-charset>

      <resource-path>/*</resource-path>

      <java-charset-name>GBK</java-charset-name>

  </input-charset>

</charset-params>

 

SWING/AWT/SWT

對于SWING/AWT,Java會(huì )有些缺省字體如Dialog/San Serif,這些字體到系統真實(shí)字體的映射在$JRE_HOME/lib/font.properties.XXX文件中指定。排除字體顯示問(wèn)題時(shí),首先需要確定JVM的區域為zh_CN,這樣font.properties.zh_CN文件才會(huì )發(fā)生作用。對于 font.properties.zh_CN , 需要檢查是否映射缺省字體到中文字體如宋體。

 

Swing中,Java自行解釋TTF字體,渲染顯示;對于AWT,SWT顯示部分交由操作系統。首先需要確定系統裝有中文字體。

 

1 漢字顯示為,一般為顯示字體沒(méi)有使用中文字體,因為Java對于當前字體顯示不了的字符,不會(huì )像Windows一樣再采用缺省字體顯示。

2 部分不常見(jiàn)漢字不能顯示,一般為顯示字庫中漢字不全,可以換另外的中文字體試試。

3 對于AWT/SWT,首先確定JVM運行環(huán)境的區域設置為中文,因為此處設計JVM與操作系統api調用的轉換問(wèn)題,再檢查其它問(wèn)題。

 

JNI

JNIjstringUTF-8編碼給我們,需要我們自行轉為本地編碼。對于Windows,可以采用WideCharToMultiByte/MultiByteToWideChar函數進(jìn)行轉換,對于Unix,可以采用iconv庫。

 

這里從SUN jdk 1.4 源代碼中找到一段使用jvm String 對象的getBytes的轉換方式,相對簡(jiǎn)單和跨平臺,不需要第三方庫,但速度稍慢。函數原型如下:

 

/* Convert between Java strings and i18n C strings */

JNIEXPORT jstring

NewStringPlatform(JNIEnv *env, const char *str);

 

JNIEXPORT const char *

GetStringPlatformChars(JNIEnv *env, jstring jstr, jboolean *isCopy);

 

JNIEXPORT jstring JNICALL

JNU_NewStringPlatform(JNIEnv *env, const char *str);

 

JNIEXPORT const char * JNICALL

JNU_GetStringPlatformChars(JNIEnv *env, jstring jstr, jboolean *isCopy);

 

JNIEXPORT void JNICALL

JNU_ReleaseStringPlatformChars(JNIEnv *env, jstring jstr, const char *str);

 

 

附件jni_util.h,jni_util.c

 

 

TUXEDO/JOLT

JOLT對于傳遞的字符串需要用如下進(jìn)行轉碼

new String(ls_tt.getBytes("GBK"),"iso8859-1")

 

對于返回的字符串

new String(error_message.getBytes("iso8859-1"),"GBK");

jolt 的系統屬性 bea.jolt.encoding不應該設置,如果設置,JSH會(huì )報告說(shuō)錯誤的協(xié)議.

 

 

JDK1.4/1.5新增部分

字符集相關(guān)類(lèi)(Charset/CharsetEncoder/CharsetDecoder)

jdk1.4開(kāi)始,對字符集的支持在java.nio.charset包中實(shí)現。

 

常用功能:

1 列出jvm所支持字符集:Charset.availableCharsets()

2 能否對看某個(gè)Unicode字符編碼,CharsetEncoder.canEncode()

 

Unicode Surrogate/CJK EXT B

Unicode 范圍一般所用為\U0000-\UFFFF范圍,jvm使用1個(gè)char就可以表示,對于CJK EXT B區漢字,范圍大于\U20000,則需要采用2個(gè)char方能表示,此即Unicode Surrogate。這2個(gè)char的值范圍 落在Character.SURROGATE 區域內,用Character.getType()來(lái)判斷。

 

jdk 1.4尚不能在Swing中正確處理surrogate區的Unicode字符,jdk1.5可以。對于CJK EXT B區漢字,目前可以使用的字庫為宋體-方正超大字符集”,Office安裝。

 

常見(jiàn)問(wèn)題

JVM下,用System.out.println不能正確打印中文,顯示為???

System.out.printlnPrintStream,它采用jvm缺省字符集進(jìn)行轉碼工作,如果jvm的缺省字符集為iso8859-1,則中文顯示會(huì )有問(wèn)題。此問(wèn)題常見(jiàn)于Unix下,jvm的區域沒(méi)有明確指定的情況。

 

在英文UNIX環(huán)境下,System.out.println能夠正確打印漢字,但是內部處理錯誤

可能是漢字在輸入轉換時(shí),就沒(méi)有正確轉碼:

gbk文本à(iso8859-1轉碼)àjvm char(iso8859-1編碼漢字)à (iso8859-1轉碼)à輸出。

gbk漢字經(jīng)過(guò)兩次錯誤轉碼,原封不動(dòng)的被傳遞到輸出,但是在jvm中,并未以正確的unicode編碼表示,而是以一個(gè)漢字字節一個(gè)char的方式表示,從而導致此類(lèi)錯誤。

 

 

GB2312-80,GBK,GB18030-2000 漢字字符集

 

GB2312-80 是在國內計算機漢字信息技術(shù)發(fā)展初始階段制定的,其中包含了大部分常用的一、二級漢字,和 9 區的符號。該字符集是幾乎所有的中文系統和國際化的軟件都支持的中文字符集,這也是最基本的中文字符集。其編碼范圍是高位0xa10xfe,低位也是 0xa1-0xfe;漢字從 0xb0a1 開(kāi)始,結束于 0xf7fe;

 

GBK GB2312-80 的擴展,是向上兼容的。它包含了 20902 個(gè)漢字,其編碼范圍是 0x8140-0xfefe,剔除高位 0x80 的字位。其所有字符都可以一對一映射到 Unicode 2.0,也就是說(shuō) JAVA 實(shí)際上提供了 GBK 字符集的支持。這是現階段 Windows 和其它一些中文操作系統的缺省字符集,但并不是所有的國際化軟件都支持該字符集,感覺(jué)是他們并不完全知道 GBK 是怎么回事。值得注意的是它不是國家標準,而只是規范。隨著(zhù) GB18030-2000國標的發(fā)布,它將在不久的將來(lái)完成它的歷史使命。

 

GB18030-2000(GBK2K) GBK 的基礎上進(jìn)一步擴展了漢字,增加了藏、蒙等少數民族的字形。GBK2K 從根本上解決了字位不夠,字形不足的問(wèn)題。它有幾個(gè)特點(diǎn),

 

它并沒(méi)有確定所有的字形,只是規定了編碼范圍,留待以后擴充。

編碼是變長(cháng)的,其二字節部分與 GBK 兼容;四字節部分是擴充的字形、字位,其編碼范圍是首字節 0x81-0xfe、二字節0x30-0x39、三字節 0x81-0xfe、四字節0x30-0x39。

 

UTF-8/UTF-16/UTF-32

 

UTF,即Unicode Transformer Format,是Unicode代碼點(diǎn)(code point)的實(shí)際表示方式,按其基本長(cháng)度所用位數分為UTF-8/16/32。它也可以認為是一種特殊的外部數據編碼,但能夠與Unicode代碼點(diǎn)做一一對應。

 

UTF-8是變長(cháng)編碼,每個(gè)Unicode代碼點(diǎn)按照不同范圍,可以有1-3字節的不同長(cháng)度。

UTF-16長(cháng)度相對固定,只要不處理大于\U200000范圍的字符,每個(gè)Unicode代碼點(diǎn)使用16位即2字節表示,超出部分使用兩個(gè)UTF-164字節表示。按照高低位字節順序,又分為UTF-16BE/UTF-16LE。

UTF-32長(cháng)度始終固定,每個(gè)Unicode代碼點(diǎn)使用32位即4字節表示。按照高低位字節順序,又分為UTF-32BE/UTF-32LE。

 

UTF編碼有個(gè)優(yōu)點(diǎn),即盡管編碼字節數不等,但是不像gb2312/gbk編碼一樣,需要從文本開(kāi)始尋找,才能正確對漢字進(jìn)行定位。在UTF編碼下,根據相對固定的算法,從當前位置就能夠知道當前字節是否是一個(gè)代碼點(diǎn)的開(kāi)始還是結束,從而相對簡(jiǎn)單的進(jìn)行字符定位。不過(guò)定位問(wèn)題最簡(jiǎn)單的還是UTF-32,它根本不需要進(jìn)行字符定位,但是相對的大小也增加不少。

 

 

關(guān)于GCJ JVM

GCJ并未完全依照sun jdk的做法,對于區域和編碼問(wèn)題考慮尚不夠周全。GCJ啟動(dòng)時(shí),區域始終設為en_US,編碼也缺省為iso8859-1。但是可以用Reader/Writer做正確編碼轉換。

 

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Java中的字符集編碼入門(mén)(三)GB2312,GBK與中文網(wǎng)頁(yè)
字符串的編碼解碼
struts原理與實(shí)踐(4)
python-utf-8格式的文件轉換gbk格式
一文簡(jiǎn)簡(jiǎn)單單徹徹底底弄清文本編碼
java字節編碼總結
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久