字串與編碼 彙總 概述

2021-06-08 15:37:06 字數 3472 閱讀 9662

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

首先應該把位元組陣列看成是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...