這幾個月作手機簡訊的專案,碰到了很多字元編碼的問題,真頭痛。經過多番資料的搜尋、親手嘗試和高人的指點,現在好像沒那麼迷惘了。現作了一些總結跟大家分享(有誤之處請指點)
首先應該把位元組陣列看成是string的載體。
dot net使用的字串string是unicode編碼的;它也是以unicode編碼的形式顯示字串。
以下是用自己語言對幾個常用函式的說明:
(自己總結的,反正看不明msdn)
bytes=system.text.encoding.unicode.getbytes(str)
作用:把str的載體作unicode->unicode的編碼轉換--也就是沒有對載體作任何的轉換。因些使用此函式可以得代表該string載體的位元組陣列。
str=system.text.encoding.unicode.getstring(bytes)
作用:對位元組陣列作unicode->unicode的編碼轉換--即沒有轉換,把經過轉換後的位元組陣列作為str的載體。
bytes=system.text.encoding.utf8.getbytes(str)
作用:把str的載體作utf8->unicode的編碼轉換。返回的是經過轉換後的字元陣列
str=system.text.encoding.utf8.getstring(bytes)
作用:對位元組陣列作gb2312->unicode的編碼轉換,把經過轉換後的位元組陣列作為str的載體。
bytes=system.text.encoding.getencoding("gb2312").getbytes(str)
作用:把str的載體作gb2312->unicode的編碼轉換。返回的是經過轉換後的字元陣列
str=system.text.encoding.getencoding("gb2312").getstring(bytes)
作用:對位元組陣列作gb2312->unicode的編碼轉換,把經過轉換後的位元組陣列作為str的載體。
如此類推
bytes=system.text.encoding.getencoding("***").getbytes(str)
作用:把str的載體作***->unicode的編碼轉換。返回的是經過轉換後的字元陣列
str=system.text.encoding.getencoding("***").getstring(bytes)
作用:對位元組陣列作***->unicode的編碼轉換,把經過轉換後的位元組陣列作為str的載體。
這裡是我收集的一些有關字元編碼的資料:
還有:unicode與gbk對照表
例子1:得到各種編碼的位元組陣列
對於「測試」,查表得
unicode: 75 109 | 213 139
(16進製制:) 4b 6d d5 8b
utf8: 230 181 139 | 232 175 149
(16進製制:) e6 b5 8b e8 af 95
gbk: 178 226 | 202 212
(16進製制:) b2 e2 ca d4
gb2312: 50 98 | 74 84
imports system.text
dim str as string = "測試"
dim bytes as byte()
bytes = encoding.unicode.getbytes(str)
'bytes: 75 109 213 139
bytes = encoding.utf8.getbytes(str)
'bytes: 230 181 139 232 175 149
bytes = encoding.getencoding("gb2312").getbytes(str)
'bytes: 178 226 202 212 <-為什麼不是50 98 74 84呢?搞不清~~
bytes = encoding.default.getbytes(str)
'bytes: 178 226 202 212
例子2:把utf8編碼的字串轉為unicode編碼的字串
dim bytes as byte() =
dim str as string = encoding.unicode.getstring(bytes)
'str的載體為「測試」的utf8編碼。以unicode的形式顯示為「뗦閯」
'查編碼表,230 181 139 232 175 149剛好就是「뗦閯」的unicode碼
bytes = encoding.unicode.getbytes(str)
'bytes: 230 181 139 232 175 149,跟原來一樣,沒有變化
str = encoding.utf8.getstring(bytes)
'str:「測試」
例子3:
(參考對於「個」,查表得:
unicode: 42 78
utf8: 228 184 170
gbk: 184 246
dim s as string = "個"
dim b as byte()
b = encoding.utf8.getbytes(s)
'把42 78作unicode->utf8的轉換b:228 184 170
s = encoding.default.getstring(b)
'把228 184 170作gb->unicode的轉換。s:"涓" ("涓"的unicode編碼為:147 109)
b = encoding.unicode.getbytes(s)
'此時s的載體為147 109 0 0 <--問題已經出現了
b = encoding.default.getbytes(s)
'把s的載體147 109 0 0作unicode->gb的編碼轉換b:228 184 0
s = encoding.utf8.getstring(b)
'把228 184 0作utf8->unicode的編碼轉換。s=""
b = encoding.unicode.getbytes(s) 'b(0)=0 b(1)=0
'此時s的載體為0 0
例子說明:字串經過unicodetoutf8->gbtounicode->unicodetogb->utf8tounicode這樣的轉換過程,理所當然地認為最後得到的應該是原來的字串。然而有些情況卻不是(例如這例子)。
原因:gb字串是可以轉換成unicode編碼的(對gb中不存在的uicode字元會以「?」代替),但前提是要進行這種轉換的字串必須是gb編碼。對於上面的
「把228 184 170作gb->unicode的轉換」,而這228 184 170卻是「個」的utf8編碼,所以轉換時有資料丟失了。
字串與編碼
首先應該把位元組陣列看成是string的載體。dot net使用的字串string是unicode編碼的 它也是以unicode編碼的形式顯示字串。以下是用自己語言對幾個常用函式的說明 自己總結的,反正看不明msdn bytes system.text.encoding.unicode.getbyt...
字串與編碼
這幾個月作手機簡訊的專案,碰到了很多字元編碼的問題,真頭痛。經過多番資料的搜尋 親手嘗試和高人的指點,現在好像沒那麼迷惘了。現作了一些總結跟大家分享 有誤之處請指點 首先應該把位元組陣列看成是string的載體。dot 使用的字串string是unicode編碼的 它也是以unicode編碼的形式顯...
字串與編碼
一句話建議 涉及相容性考量時,不要用記事本,用專業的文字編輯器儲存為不帶 bom 的 utf 8。如果是為了跨平台相容性,只需要知道,在 windows 記事本的語境中 gbk 等遺留編碼最麻煩,所以除非你知道自己在幹什麼否則不要再用了。utf 16 理論上其實很好,位元組序也標明了,但 utf 1...