字串與byte 之間的轉換

2021-09-07 20:33:38 字數 4355 閱讀 5116

同乙個字元在不同的編碼下會被編成不同長度的編碼,比如:

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 進製字串轉換...