同乙個字元在不同的編碼下會被編成不同長度的編碼,比如:
acsii,每個字元對應乙個位元組,實際上只使用了7位,從00h-7fh。只能表達128個字元。
gb2312,中文的一種編碼,每個字元使用兩個位元組表示。
utf-8, 可以表達所有unicode字元,每個字元可以用1-3個位元組表示。
utf-16, 可以表達所有unicode字元,每個字元可以用1-2個16位整數表示。
utf-32, 可以表達所有unicode字元,每個字元可以用1個32位整數表示。
windows內部支援以下編碼:
code page
name
display name
936gb2312
chinese simplified (gb2312)
1149
ibm01149
ibm ebcdic (icelandic-euro)
1200
utf-16
unicode
1201
unicodefffe
unicode (big-endian)
1252
windows-1252
western european (windows)
10003
x-mac-korean
korean (mac)
10008
x-mac-chinesesimp
chinese simplified (mac)
20127
us-ascii
us-ascii
20936
x-cp20936
chinese simplified (gb2312-80)
20949
x-cp20949
korean wansung
28591
iso-8859-1
western european (iso)
28598
iso-8859-8
hebrew (iso-visual)
38598
iso-8859-8-i
hebrew (iso-logical)
50220
iso-2022-jp
japanese (jis)
50221
csiso2022jp
japanese (jis-allow 1 byte kana)
50222
iso-2022-jp
japanese (jis-allow 1 byte kana - so/si)
50225
iso-2022-kr
korean (iso)
50227
x-cp50227
chinese simplified (iso-2022)
51932
euc-jp
japanese (euc)
51936
euc-cn
chinese simplified (euc)
51949
euc-kr
korean (euc)
52936
hz-gb-2312
chinese simplified (hz)
54936
gb18030
chinese simplified (gb18030)
57002
x-iscii-de
iscii devanagari
57003
x-iscii-be
iscii bengali
57004
x-iscii-ta
iscii tamil
57005
x-iscii-te
iscii telugu
57006
x-iscii-as
iscii assamese
57007
x-iscii-or
iscii oriya
57008
x-iscii-ka
iscii kannada
57009
x-iscii-ma
iscii malayalam
57010
x-iscii-gu
iscii gujarati
57011
x-iscii-pa
iscii punjabi
65000
utf-7
unicode (utf-7)
65001
utf-8
unicode (utf-8)
65005
utf-32
unicode (utf-32)
65006
utf-32be
unicode (utf-32 big-endian)
目前windows的核心已經採用unicode編碼,這樣在核心上可以支援全世界所有的語言文字。但是由於現有的大量程式和文件都採用了某種特定語言的編碼,例如gb2312,windows不可能不支援現有的編碼,而全部改用unicode。
windows使用上面**所示的**頁(code page)來適應各個國家和地區。windows使用預設**頁來表示當前作業系統的使用的語言,這可以在控制面板的「區域和語言選項」中選擇。一般中文windows作業系統,選擇「中文(中國)」,這樣設定,windows的預設**頁就是936,即gb2312。
windows按照當前的預設**頁去解釋文字檔案裡的位元組流。預設**頁可以通過控制面板的區域選項設定。記事本的另存為中有一項ansi,其實就是按照預設**頁的編碼方法儲存。
windows的內碼是unicode,它在技術上可以同時支援多個**頁。只要檔案能說明自己使用什麼編碼,使用者又安裝了對應的**頁,windows就能正確顯示,例如在html檔案中就可以指定charset。
位元組序
utf-8是單位元組的編碼,不用考慮位元組順序,但是utf-16和utf-32是16位和32位的編碼,每個編碼內部都有個位元組順序的問題。比如字元」a」 (u+0041),在序列化時是」00」在前還是」41」在前,這就有兩種可能。
utf-16 big-endian byte order: 00 41
utf-16 little-endian byte order: 41 00
規範規定了乙個可選的方案,就是在編碼前導幾個字元放上本身不是utf可能編碼的前導編碼來幫助判斷識別。
utf-8: ef bb bf
utf-16 big-endian byte order: fe ff
utf-16 little-endian byte order: ff fe
utf-32 big-endian byte order: 00 00 fe ff
utf-32 little-endian byte order: ff fe 00 00
任何需要把string序列化處理都需要這種轉換,比如:
需要把string儲存到檔案中,必須把string轉換成乙個有序的位元組流,以便系統在硬碟上做物理儲存。
對string做加密操作時,加密演算法是針對位元組進行處理,這時也需要把string轉換成位元組流以便加密演算法對資料進行處理。
string到位元組流的轉換涉及到使用何種編碼,使用不同的編碼得到的位元組碼不同,再從位元組碼做反操作恢復成string,必須使用編碼時使用的編碼或者相容的編碼,否則結果就是亂碼。
使用encoding類的靜態方法getencoding方法獲得某個型別的encoding物件。
l public static encoding.getencoding(int codepage)
codepage指定這種返回**頁的encoding
l public static encoding getencoding (string name)
name 指定這種返回**名的encoding
其中使用到的**頁和**名在上面表中。
比如要獲得乙個utf-8的encoding物件
encoding myencoding = encoding.getencoding("utf-8");
string sdata = 「字串」;
byte mybyte = myencoding.getbytes(sdata);
使用getbytes方法時,不產生前面所說的識別不同utf格式的前導符。
byte mybyte = new byte{};
string sdata = myencoding.getstring(byte mybyte);
Java 字串與byte之間的相互轉換
你是否跟我一樣,在一些需要加密的 裡看見需要把字串轉換為位元組的場景,例如md5加密。而你每次看到像我以前一樣,自動地略過 反正別人都寫好了,我用就是了 如果是的話,不要再逃避了,下面跟我一起來了解一下字串與byte之間轉換的原理 是的,原理就這麼簡單,接下來用 實現 法1 思路 先把byte 轉換...
編碼和解碼 字串與byte 之間的轉換
資源來自網際網路 非常蛋疼的事情,google 和 baidu 在編碼是分別採用了 utf 8 和 gb2312 基礎知識 unicode 統一字元編碼 unicode其實不是一種編碼,而是定義了乙個表,表中為世界上每種語言中的每個字元設定了統一並且唯一的碼位 codepoint 以滿足跨語言 跨平...
byte 與16進製制字串轉換
把位元組陣列轉換成16進製制字串 param barray return public static string bytestohexstring byte src for int i 0 i src.length i return stringbuilder.tostring 16 進製字串轉換...