国产精品久久久亚洲一区,亚洲欧美日韩国产一区二区,男女男99热,日韩伦乱无码

iso認(rèn)證咨詢公司,全國認(rèn)證咨詢服務(wù)!
iso認(rèn)證咨詢公司客服

java接入易寶支付時,商品名稱為UTF-8編碼的中文,如何轉(zhuǎn)換成GBK編碼的中文

[已注銷]

[已注銷]

可以用類似這種的轉(zhuǎn)下

String pordName = "xxx";

prodName = new String(prodName.getBytes("UTF-8"),"GBK")

Hey 豬 

Hey 豬 


1.編碼基礎(chǔ)知識

最早的編碼是iso8859-1,和ascii編碼相似。但為了方便表示各種各樣的語言,逐漸出現(xiàn)了很多標(biāo)準(zhǔn)編碼,重要的有如下幾個。


1.
1. ISO-8859-1 通常叫做Latin-1

屬于單字節(jié)編碼,最多能表示的字符范圍是0-255,應(yīng)用于英文系列。比如,字母a的編碼為0x61=97。

很明顯,iso8859-1編碼表示的字符范圍很窄,無法表示中iso14001環(huán)境管理體系認(rèn)證符。但是,由于是單字節(jié)編碼,和計算機最基礎(chǔ)的表示單位一致,所以很多時候,仍舊使用iso8859-1編碼來表示。

而且在很多協(xié)議上,默認(rèn)使用該編碼。比如,雖然"中文"兩個字不存在iso8859-1編碼,

以gb2312編碼為例,應(yīng)該是"d6d0 cec4"兩個字符(java字符占2個字節(jié)),

使用iso8859-1編碼的時候則將它拆開為4個字節(jié)來表示:"d6 d0 ce c4"(事實上,在進行存儲的時候,也是以字節(jié)為單位處理的)。

而如果是UTF編碼,則是6個字節(jié)"e4 b8 ad e6 96 87"。

很明顯,這種表示方法還需要以另一種編碼為基礎(chǔ)。


1.
2. GB2312/GBK

這就是漢字的國標(biāo)碼,專門用來表示漢字,是雙字節(jié)編碼,而英iso14001環(huán)境管理體系認(rèn)證母和iso8859-1一致(兼容iso8859-1編碼)。

其中g(shù)bk編碼能夠用來同時表示繁體字和簡體字,

而gb2312只能表示簡體字,gbk是兼容gb2312編碼的。


1.3 unicode

這是最統(tǒng)一的編碼,可以用來表示所有語言的字符,而且是定長雙字節(jié)(也有四字節(jié)的)編碼,包括英iso14001環(huán)境管理體系認(rèn)證母在內(nèi)。所以可以說它是不兼容iso8859-1編碼的,也不兼容任何編碼。不過,相對于iso8859-1編碼來說,uniocode編碼只是在前面增加了一個0字節(jié),比如字母a為"00 61"。

需要說明的是,定長編碼便于計算機處理(注意GB2312/GBK不是定長編碼),而unicode又可以用來表示所有字符,所以在很多軟件內(nèi)部是使用unicode編碼來處理的,比如java。


1.4 UTF

考慮到unicode編碼不兼容iso8859-1編碼,而且容易占用更多的空間:因為對于英iso14001環(huán)境管理體系認(rèn)證母,unicode也需要兩個字節(jié)來表示。所以unicode不便于傳輸和存儲。因此而產(chǎn)生了utf編碼,utf編碼兼容iso8859-1編碼,同時也可以用來表示所有語言的字符,不過,utf編碼是不定長編碼,每一個字符的長度從1-6個字節(jié)不等。另外,utf編碼自帶簡單的校驗功能。一般來講,英iso14001環(huán)境管理體系認(rèn)證母都是用一個字節(jié)表示,而漢字使用三個字節(jié)。

注意,雖然說utf是為了使用更少的空間而使用的,但那只是相對于unicode編碼來說,如果已經(jīng)知道是漢字,則使用GB2312/GBK無疑是最節(jié)省的。不過另一方面,值得說明的是,雖然utf編碼對漢字使用3個字節(jié),但即使對于漢字網(wǎng)頁,utf編碼也會比unicode編碼節(jié)省,因為網(wǎng)頁中包含了很多的英iso14001環(huán)境管理體系認(rèn)證符。


2.Unicode、UTF-8 和 ISO8859-1區(qū)別與聯(lián)系

將以"中文"兩個字為例,經(jīng)查表可以知道其

GB2312編碼是"d6d0 cec4",

Unicode編碼為"4e2d 6587",

UTF編碼就是"e4b8ad e69687"。

注意,這兩個字沒有iso8859-1編碼,但可以用iso8859-1編碼來表示。


2.1 Unicode與各編碼之間的直接轉(zhuǎn)換

下面以對中iso14001環(huán)境管理體系認(rèn)證符串"a中文"的編碼轉(zhuǎn)換為例,來了解各種編碼之間的轉(zhuǎn)換

1)Unicode和GBK

測試結(jié)果如下,每個漢字轉(zhuǎn)換為兩個字節(jié),且是可逆的,即通過字節(jié)可以轉(zhuǎn)換回字符串

String-GBK〉ByteArray:/u0061/u4E2D/u6587(a中文)-〉0x61 0xD6 0xD0 0xCE 0xC4 ByteArray-GBK〉String:0x61 0xD6 0xD0 0xCE 0xC4-〉/u0061/u4E2D/u6587(a中文)

2)Unicode和UTF-8

測試結(jié)果如下,每個漢字轉(zhuǎn)換為三個字節(jié),且是可逆的,即通過字節(jié)可以轉(zhuǎn)換回字符串

String-UTF-8〉ByteArray:/u0061/u4E2D/u6587(a中文)-〉0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87 ByteArray-UTF-8〉String:0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87-〉/u0061/u4E2D/u6587(a中文)

3)Unicode和ISO-8859-1

測試結(jié)果如下,當(dāng)存在漢字時轉(zhuǎn)換失敗,非可逆,即通過字節(jié)不能再轉(zhuǎn)換回字符串

String-ISO-8859-1〉ByteArray:/u0061/u4E2D/u6587(a中文)-〉0x61 0x3F 0x3F ByteArray-ISO-8859-1〉String:0x61 0x3F 0x3F-〉/u0061/u003F/u003F(a??)


2.2 Unicode與各編碼之間的交叉轉(zhuǎn)換

在上面直接轉(zhuǎn)換中,由字符串(Unicode)生成的字節(jié)數(shù)組,在構(gòu)造回字符串時,使用的是正確的編碼集合,如果使用的不是正確的編碼集合會怎樣呢?會正確構(gòu)造嗎?如果不能正確構(gòu)造能有辦法恢復(fù)嗎?會信息丟失嗎?

下面我們就來看看這種情況,這部分可以說明在某些情況下雖然我們最終正確顯示了結(jié)果,但其間仍然進行了不正確的轉(zhuǎn)換。

1)能夠正確顯示的中間不正確轉(zhuǎn)換

我們知道String-GBK〉ByteArray-GBK〉String是正確的,但如果我們采用String-GBK〉

ByteArray-ISO-8859-1〉String呢?通過測試結(jié)果如下:

String-GBK〉ByteArray-ISO-8859-1〉String:/u0061/u4E2D/u6587(a中文)-〉0x61 0xD6 0xD0 0xCE 0xC4-〉/u0061/u00D6/u00D0/u00CE/u00C4(a????

這時我們得到的字符串為?亂碼“a????”,但是通過繼續(xù)轉(zhuǎn)換我們?nèi)匀豢梢詮?fù)原回正確的字符串“a中文”,過程如下:

String-GBK〉ByteArray-ISO-8859-1〉String-ISO-8859-1〉ByteArray-GBK〉String

對應(yīng):/u0061/u4E2D/u6587(a中文)-〉0x61 0xD6 0xD0 0xCE 0xC4-〉/u0061/u00D6/u00D0/u00CE/u00C4(a????)-〉0x61 0xD6 0xD0 0xCE 0xC4-〉/u0061/u4E2D/u6587(a中文)

也就是我們在首次構(gòu)造字符串時,我們用了錯誤的編碼集合得到了錯誤的亂碼,但是我們通過錯上加錯,再用錯誤的編碼集合獲取字節(jié)數(shù)組,然后再用正確的編碼集合構(gòu)造,就又恢復(fù)了正確的字符串。這時就屬于是“能夠正確顯示的中間不正確轉(zhuǎn)換”。在Jsp頁面提交數(shù)據(jù)處理時常常發(fā)生這種情況。

此外能夠正確顯示的中間不正確轉(zhuǎn)換還有:

String-UTF-8〉ByteArray-ISO-8859-1〉String-ISO-8859-1〉ByteArray-UTF-8〉String

String-UTF-8〉ByteArray-GBK〉String-GBK〉ByteArray-UTF-8〉String

對應(yīng):/u0061/u4E2D/u6587(a中文)-〉0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87-〉/u0061/u6D93/uE15F/u6783(a涓枃)-〉0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87-〉/u0061/u4E2D/u6587(a中文)


2.3 編碼過程中錯誤診斷參考

1)一個漢字對應(yīng)一個問號

在通過ISO-8859-1從字符串獲取字節(jié)數(shù)組時,由于一個Unicode轉(zhuǎn)換成一個byte,當(dāng)遇到不認(rèn)識的Unicode時,轉(zhuǎn)換為0x3F,這樣無論用哪種編碼構(gòu)造時都會產(chǎn)生一個?亂碼。

2)一個漢字對應(yīng)兩個問號

在通過GBK從字符串獲取字節(jié)數(shù)組時,由于一個Unicode轉(zhuǎn)換成兩個byte,如果此時用ISO-8859-1或用UTF-8構(gòu)造字符串就會出現(xiàn)兩個問號。

若是通過ISO-8859-1構(gòu)造可以再通過上面所說的錯上加錯恢復(fù)(即再通過從ISO-8859-1解析,用GBK構(gòu)造);

若是通過UTF-8構(gòu)造則會產(chǎn)生Unicode字符"/uFFFD",不能恢復(fù),若再通過String-UTF-8〉ByteArray-GBK〉String,則會出現(xiàn)雜碼,如a錕斤拷錕斤拷

3)一個漢字對應(yīng)三個問號

在通過UTF-8從字符串獲取字節(jié)數(shù)組時,由于一個

這是java字符串處理的一個標(biāo)準(zhǔn)函數(shù),其作用是將字符串所表示的字符按照charset編碼,并以字節(jié)方式表示。注意字符串在java內(nèi)存中總是按unicode編碼存儲的。比如"中文",正常情況下(即沒有錯誤的時候)存儲為"4e2d 6587",如果charset為"gbk",則被編碼為"d6d0 cec4",然后返回字節(jié)"d6 d0 ce c4".如果charset為"utf8"則最后是"e4 b8 ad e6 96 87".如果是"iso8859-1",則由于無法編碼,最后返回 "3f 3f"(兩個問號)。


3. java對字符的處理

在java應(yīng)用軟件中,會有多處涉及到字符集編碼,有些地方需要進行正確的設(shè)置,有些地方需要進行一定程度的處理。


3.1 getBytes(charset)

這是java字符串處理的一個標(biāo)準(zhǔn)函數(shù),其作用是將字符串所表示的字符按照charset編碼,并以字節(jié)方式表示。

注意字符串在java內(nèi)存中總是按unicode編碼存儲的。

比如"中文",正常情況下(即沒有錯誤的時候)存儲為"4e2d 6587",

如果charset為"gbk",則被編碼為"d6d0 cec4",然后返回字節(jié)"d6 d0 ce c4"。

如果charset為"utf8"則最后是"e4 b8 ad e6 96 87"。

如果是"iso8859-1",則由于無法編碼,最后返回 "3f 3f"(兩個問號)。


3.2 new String(charset)

這是java字符串處理的另一個標(biāo)準(zhǔn)函數(shù),和上一個函數(shù)的作用相反,將字節(jié)數(shù)組按照charset編碼進行組合識別,最后轉(zhuǎn)換為unicode存儲。

參考上述getBytes的例子,"gbk" 和"utf8"都可以得出正確的結(jié)果"4e2d 6587",但iso8859-1最后變成了"003f 003f"(兩個問號)。

因為utf8可以用來表示/編碼所有字符,所以new String( str.getBytes( "utf8" ), "utf8" ) === str,即完全可逆。


3.3 setCharacterEncoding()

該函數(shù)用來設(shè)置http請求或者相應(yīng)的編碼。

對于request,是指提交內(nèi)容的編碼,指定后可以通過getParameter()則直接獲得正確的字符串,如果不指定,則默認(rèn)使用iso8859-1編碼,需要進一步處理。

參見下述"表單輸入"。值得注意的是在執(zhí)行setCharacterEncoding()之前,不能執(zhí)行任何getParameter()。

java doc上說明:This method must be called prior to reading request parameters or reading input using getReader()。

該指定只對POST方法有效,對GET方法無效。分析原因:

POST方法在執(zhí)行第一個getParameter()的時候,java將會按照編碼分析所有的提交內(nèi)容,而后續(xù)的getParameter()不再進行分析,所以setCharacterEncoding()無效。

GET方法提交表單是,提交的內(nèi)容在URL中,一開始就已經(jīng)按照編碼分析所有的提交內(nèi)容,setCharacterEncoding()自然就無效。

注意:iso-8859-1是JAVA網(wǎng)絡(luò)傳輸使用的標(biāo)準(zhǔn)字符集,而gb2312是標(biāo)準(zhǔn)中iso14001環(huán)境管理體系認(rèn)證符集,當(dāng)你作出提交表單等需要網(wǎng)絡(luò)傳輸?shù)牟僮鞯臅r候,就需要把 iso-8859-1轉(zhuǎn)換為gb2312字符集顯示,否則如果按瀏覽器的gb2312格式來解釋iso-8859-1字符集的話,由于2者不兼容,所以會 是亂碼.

熱門產(chǎn)品
最新知識

中國環(huán)保產(chǎn)品認(rèn)證目錄,環(huán)保產(chǎn)品認(rèn)證目錄

小編為您整理中國環(huán)保產(chǎn)品認(rèn)證范圍、中國環(huán)保產(chǎn)品認(rèn)證的認(rèn)證標(biāo)志、中國環(huán)保產(chǎn)品認(rèn)證的介紹、什么是中國環(huán)保產(chǎn)品認(rèn)證、中國環(huán)保產(chǎn)品認(rèn)證的特點相關(guān)iso認(rèn)證公司知識,詳情可查看下方正文!

企業(yè)外部信用評級?企業(yè)外部信用評級aa

小編為您整理新疆外部信用評級aa+企業(yè)都有哪些、云南企業(yè)外部信用評級aaa級企業(yè)有哪家、哪些企業(yè)需要信用評級、企業(yè)主體信用評級條件、企業(yè)為什么要做信用評級相關(guān)iso認(rèn)證公司知識,詳情可查看下方正文!

宿遷體系認(rèn)證公司,宿遷體系認(rèn)證咨詢公司

小編為您整理宿遷哪家公司做認(rèn)證體系、宿遷連云港為何全面排查大頭娃娃涉事iso三體系認(rèn)證、宿遷fsc森林認(rèn)證在哪里、宿遷哪里可以提供辦理ISO9001認(rèn)證、在宿遷辦理質(zhì)量管理體系認(rèn)證證書在哪辦理相關(guān)iso認(rèn)證公司知識,詳情可查看下方正文!

iso20000管理體系認(rèn)證報價,iso20000報價

小編為您整理ISO20000業(yè)務(wù)人員應(yīng)該如何報價人數(shù)120人、ISO20000,ISO20000標(biāo)準(zhǔn),IT服務(wù)管理體系認(rèn)證,什么是ISO20000標(biāo)準(zhǔn)、iso9000質(zhì)量管理體系審核報價國家有沒有標(biāo)準(zhǔn)、管理體系認(rèn)證iso20000什么意思、管理體系認(rèn)證iso20000什么意思相關(guān)iso認(rèn)證公司知識,詳情可查看下方正文!

提供iso14000體系認(rèn)證,椒江提供iso14000認(rèn)證體系

小編為您整理請?zhí)峁┮恍㊣SO14000認(rèn)證的資料、ISO14000審核需要提供哪些資料、ISO14000審核需要提供哪些資料、哪里有提供ISO14000的服務(wù)呢、為什么要做ISO14000體系認(rèn)證相關(guān)iso認(rèn)證公司知識,詳情可查看下方正文!

最新問答
熱門專題