字串與編碼

2021-04-01 02:12:21 字數 3694 閱讀 3525

這幾個月作手機簡訊的專案,碰到了很多字元編碼的問題,真頭痛。經過多番資料的搜尋、親手嘗試和高人的指點,現在好像沒那麼迷惘了。現作了一些總結跟大家分享(有誤之處請指點)

首先應該把位元組陣列看成是string的載體。

dot ***使用的字串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的載體。

這裡是我收集的一些有關字元編碼的資料:http://61.145.116.154/bm/

還有:http://.unicode./charts/unihan.html

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:

(參考http://expert.csdn.***/expert/topic/1861/1861857.xml?temp=.558407)

對於「個」,查表得:

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編碼,所以轉換時有資料丟失了。

注:本文**http://search.csdn.***/expert/topic/1880/1880675.xml?temp=.6692926

字串與編碼

首先應該把位元組陣列看成是string的載體。dot net使用的字串string是unicode編碼的 它也是以unicode編碼的形式顯示字串。以下是用自己語言對幾個常用函式的說明 自己總結的,反正看不明msdn bytes system.text.encoding.unicode.getbyt...

字串與編碼

一句話建議 涉及相容性考量時,不要用記事本,用專業的文字編輯器儲存為不帶 bom 的 utf 8。如果是為了跨平台相容性,只需要知道,在 windows 記事本的語境中 gbk 等遺留編碼最麻煩,所以除非你知道自己在幹什麼否則不要再用了。utf 16 理論上其實很好,位元組序也標明了,但 utf 1...

字串與編碼

為什麼需要編碼呢?因為計算機只能處理數字,而不能處理字元和字串,所以要將字元用十進位制數字來表示,然後轉換成二進位製供計算機計算。此處介紹位元組 byte 和位 bit 的概念 計算機的最小儲存單位為位,儲存一位二進位制數0或者1。而我們不用位來作為計算機中資訊含義的最小單位是因為位常常不能表示乙個...