日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java对字符串编码转换_(转) Java字符编码转换

發布時間:2024/8/1 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java对字符串编码转换_(转) Java字符编码转换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

JVM

JVM啟動后,JVM會設置一些系統屬性以表明JVM的缺省區域。

user.language,user.region,file.encoding等。

可以使用System.getProperties()詳細查看所有的系統屬性。

如在英文操作系統(如UNIX)下,可以使用如下屬性定義強制指定JVM為中文環境

-Dclient.encoding.override=GBK -

Dfile.encoding=GBK -Duser.language=zh -Duser.region=CN

.java-->.class編譯

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

錯誤可能:

1 gbk編碼源文件在英文環境下編譯,javac不能正確轉換.曾見于java/jsp在英文unix下.

檢測方法:寫\u4e00格式的漢字,繞

開javac編碼,再在jvm中,將漢字作為int打印,看值是否相等;或直接以UTF-8編碼打開.class

文件,看看常量字符串是否正

確保存漢字。

文件讀寫

外部數據如文件經過讀寫和轉換兩個步驟,轉為jvm所使用字符。InputStream/OutputStream用于讀寫原始外部數據,

Reader/Writer執行讀寫和轉換兩個步驟。

1 文件讀寫轉換由java.io.Reader/Writer執行;輸入輸出流 InputStream/OutputStream

處理漢字不合適,應該首選使用

Reader/Writer,如 FileReader/FileWriter。

2

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

3 PrintStream有點特殊,它自動使用jvm缺省編碼進行轉換。

讀取.properties文件

.propeties 文件由Properties類以iso8859-1編碼讀取,因此不能在其中直接寫漢字,需要使用JDK

的native2ascii工具轉換

漢字為\uXXXX格式。命令行:native2ascii ?encoding GBK inputfile

outputfile

讀取XML文件

1 XML文件讀寫同于文件讀寫,但應注意確保XML頭中聲明如 xml version=”1.0”

encoding=”gb2312” ?>與文件編碼保

持一致。

2

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

SAXParser。

3 對于UTF-8編碼 XML,注意防止編輯器自動加上\uFFFE BOM頭, xml parser會報告content is not

allowed in prolog。

字節數組

1 使用 new String(byteArray,encoding) 和 String.getBytes(encoding)

在字節數組和字符串之間進行轉換

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

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

如果我們得到的字符串是由錯誤的轉碼方式產生的,例如:對于gbk中文,由iso8859-1方式轉換,此時如果用調試器看到的字

符串一般是 的樣子,長度一般為文本的字節長度,而非漢字個數。

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

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

WEB/Servlet/JSP

1 對于JSP,確定頭部加上

contentType="text/html;charset=gb2312"%>這樣的標簽。

2 對于Servlet,確定 設置setContentType (“text/html;

charset=gb2312”),以上兩條用于使得輸出漢字沒有問題。

3 為輸出HTML head中加一個

content="text/html; charset=gb2312"> ,讓瀏覽器正確

確定HTML編碼。

4

為Web應用加一個Filter,確保每個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;

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中加入:

LocalEncodingFilter

LocalEncodingFilter

com.ccb.ectipmanager.request.SetCharacterEncodingFilter

encoding

gb2312

debug

false

LocalEncodingFilter

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

JDK1.4/1.5新增部分

字符集相關類(Charset/CharsetEncoder/CharsetDecoder)

jdk1.4開始,對字符集的支持在java.nio.charset包中實現。

常用功能:

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

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

常見問題

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

System.out.println是PrintStream,它采用jvm缺省字符集進行轉碼工作,如果jvm的缺省字符集為iso8859-1,則中文顯示會

有問題。此問題常見于Unix下,jvm的區域沒有明確指定的情況。

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

可能是漢字在輸入轉換時,就沒有正確轉碼:

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

(iso8859-1轉碼)à輸出。

gbk漢字經過兩次錯誤轉碼,原封不動的被傳遞到輸出,但是在jvm中,并未以正確的unicode編碼表示,而是以一個漢字字節

一個char的方式表示,從而導致此類錯誤。

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

GB2312-80 是在國內計算機漢字信息技術發展初始階段制定的,其中包含了大部分常用的一、二級漢字,和 9 區的符號。該

字符集是幾乎所有的中文系統和國際化的軟件都支持的中文字符集,這也是最基本的中文字符集。其編碼范圍是高位0xa1-

0xfe,低位也是 0xa1-0xfe;漢字從 0xb0a1 開始,結束于 0xf7fe;

GBK 是 GB2312-80 的擴展,是向上兼容的。它包含了 20902 個漢字,其編碼范圍是 0x8140-0xfefe,剔除高位

0x80 的字位

。其所有字符都可以一對一映射到 Unicode 2.0,也就是說 JAVA 實際上提供了 GBK 字符集的支持。這是現階段

Windows 和

其它一些中文操作系統的缺省字符集,但并不是所有的國際化軟件都支持該字符集,感覺是他們并不完全知道 GBK 是怎么回

事。值得注意的是它不是國家標準,而只是規范。隨著

GB18030-2000國標的發布,它將在不久的將來完成它的歷史使命。

GB18030-2000(GBK2K) 在 GBK 的基礎上進一步擴展了漢字,增加了藏、蒙等少數民族的字形。GBK2K

從根本上解決了字位不

夠,字形不足的問題。它有幾個特點,

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

編碼是變長的,其二字節部分與 GBK 兼容;四字節部分是擴充的字形、字位,其編碼范圍是首字節

0x81-0xfe、二字節0x30

-0x39、三字節 0x81-0xfe、四字節0x30-0x39。

UTF-8/UTF-16/UTF-32

UTF,即Unicode Transformer Format,是Unicode代碼點(code

point)的實際表示方式,按其基本長度所用位數分為UTF-

8/16/32。它也可以認為是一種特殊的外部數據編碼,但能夠與Unicode代碼點做一一對應。

UTF-8是變長編碼,每個Unicode代碼點按照不同范圍,可以有1-3字節的不同長度。

UTF-16長度相對固定,只要不處理大于\U200000范圍的字符,每個Unicode代碼點使用16位即2字節表示,超出部分使用兩個

UTF-16即4字節表示。按照高低位字節順序,又分為UTF-16BE/UTF-16LE。

UTF-32長度始終固定,每個Unicode代碼點使用32位即4字節表示。按照高低位字節順序,又分為UTF-32BE/UTF-32LE。

UTF 編碼有個優點,即盡管編碼字節數不等,但是不像gb2312/gbk編碼一樣,需要從文本開始尋找,才能正確對漢字進行定位

。在UTF編碼下,根據相對固 定的算法,從當前位置就能夠知道當前字節是否是一個代碼點的開始還是結束,從而相對簡單的

進行字符定位。不過定位問題最簡單的還是UTF-32,它根本不 需要進行字符定位,但是相對的大小也增加不少。

關于GCJ JVM

GCJ并未完全依照sun jdk的做法,對于區域和編碼問題考慮尚不夠周全。GCJ啟動時,區域始終設為en_US,編碼也缺省為

iso8859-1。但是可以用Reader/Writer做正確編碼轉換

總結

以上是生活随笔為你收集整理的java对字符串编码转换_(转) Java字符编码转换的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。