位元組陣列解Unicode字串

2021-07-14 10:18:20 字數 2881 閱讀 6896

這段時間遇到乙個問題是需要遇到乙個binaryreader(裡面可能塞了各種資料),需要從當前位置讀取乙個字串,當然可能可能包括各種符號,可以理解成要讀乙個byte擷取乙個字串,如果我們不加過濾的一律都塞到串,然後解碼,結果很容易出現亂碼。

雖然提供這個位元組流的官方中宣告了「字串以unicode編碼」的,但是由於以前對編碼知識了解並並不多,所以看到這個宣告的時候,我開始是忽略的!o(╯□╰)o在不了解詳細儲存格式的情況下請教同事, 建議我乙個個byte都列印出來!這樣對照我的輸入和byte流的輸出,對比我才發現了,用unicode編碼這個很關鍵的一點!

首先對於unicode編碼而言,是兩個位元組存放乙個字元便於規範的解析,即漢字佔兩個位元組,ascii碼也佔兩個位元組!ascii字元的話高位存0,低位存實際字元,對應到位元組陣列中就是第乙個位元組存0,第二個位元組存字元了。

看位元組流搞清楚了這些,也才能開始從位元組流中讀出當前需要的字串,比如我需要讀的字串滿足ascii字元或中文字元,下面的實現demo就可以解析出滿足條件的字串。

其中,在ischinese()方法中,我同時判定高低位位元組是否同時滿足乙個unicode漢字,想擴充套件的話可以在裡面補充其他語言的,這樣就可以截取出多語言字串了。

其中如下的demo中testbytes作為測試輸入,每個字元成對出現,最後乙個字元刻意放了乙個非unicode字元的,擷取到此處停止,最後附上原始碼:

using unityengine;

using system.text;

using system.collections.generic;

public

class

parsebinarystr

; getchstr(testbytes);

}private string getchstr(byte data, int startindex = 0)

else

}else

else

}else}}

byte res = new

byte[bytelist.count];

for (int

index = 0; index

< bytelist.count; index++)

res[index] = bytelist[index];

string str = new string(encoding.unicode.getchars(res));

debug.log("擷取字串=" + str);

return

str;

}//中文字元的區間"[\u4e00-\u9fbf]"

private bool ischinese(byte item1, byte item2)

}

ps:debug.log()暴露了我的unitylog

最後附上乙個小建議,看到乙個byte分不清unicode高地位的時候,乙個小辦法是先找乙個字串有unicode解碼工具得到unicode編碼串,

點個小工具就不錯!

比如」張」對應unicode編碼串是\u5f20,分別講十六進製制的5f,20轉為十進位制就直到存到byte中的結果應當是什麼了。

public

void

printencodestring()

}

看清楚乙個字的高低位元組分別怎麼存的,就不容易搞混了。^_^

最後補充學習編碼的知識,特別推薦這篇blog,寫的各編碼介紹非常詳細!

字元編碼介紹

其中下面這段很好的解釋了unicode萬用碼,中間碼,unicode是個好孩子!

不同 ansi 編碼之間互不相容,當資訊在國際間交流時,無法將屬於兩種語言的文字,儲存在同一段 ansi 編碼的文字中。乙個很大的缺點是,同乙個編碼值,在不同的編碼體系裡代表著不同的字。這樣就容易造成混亂。導致了unicode碼的誕生。 其中每個語言下的ansi編碼,都有一套一對一的編碼轉換器,unicode變成所有編碼轉換的中間介質。所有的編碼都有乙個轉換器可以轉換到unicode,而unicode也可以轉換到其他所有的編碼。

此外下面專門針對中文編碼gbk的說明中,

gb 18030,全稱:國家標準gb 18030-2005《資訊科技 中文編碼字符集》,是中華人民共和國現時最新的內碼字集,是gb 18030-2000《資訊科技 資訊交換用漢字編碼字符集 基本集的擴充》的修訂版。與gb 2312完全相容,與gbk基本相容,支援gb 13000及unicode的全部統一漢字,共收錄漢字70244個。gb 18030主要有以下特點

與utf-8相同,採用多位元組編碼,每個字可以由1個、2個或4個位元組組成。

編碼空間龐大,最多可定義161萬個字元。

支援中國國內少數民族的文字,不需要動用造字區。

漢字收錄範圍包含繁體漢字以及日韓漢字

中國的程式設計師們看到這一系列漢字編碼的標準是好的,於是通稱他們叫做 「dbcs」(double byte charecter set 雙位元組字符集)。在dbcs系列標準裡,最大的特點是兩位元組長的漢字字元和一位元組長的英文本元並存於同一套編碼方案裡,因此他們寫的程式為了支援中文處 理,必須要注意字串裡的每乙個位元組的值,如果這個值是大於127的,那麼就認為乙個雙位元組字符集裡的字元出現了。那時候凡是受過加持,會程式設計的計算機僧侶 們都要每天念下面這個咒語數百遍:

「乙個漢字算兩個英文本元!乙個漢字算兩個英文本元……」

看到這一段我想笑了,如果你拿到一段資料並不告知你編碼方式的話,這樣下去是很折磨人的,除非你檢視詳細資料。雖然看上去變長儲存可以節省空間,我覺得自己單用的時候可以這麼考慮,通用的資料還是unicode好。

最後結合我自己的嘗試補充,除unicode編碼外的其他編碼發方式不能相互編碼解碼,可能解出亂碼,但是其他編碼轉到unicode編碼是沒有問題的。

字串 位元組陣列互轉

將byte轉換為string 或者將string轉換為byte author administrator public class byteorstringhelper param str 源字串轉換成位元組陣列的字串 return public static byte stringtobyte s...

C 字串到位元組陣列,位元組陣列轉整型

int num 12345 string num1 convert.tostring 12345,16 byte bytes bitconverter.getbytes num 將int32轉換為位元組陣列 num bitconverter.toint32 bytes,0 將位元組陣列內容再轉成in...

C 字串與位元組陣列互轉

定義string變數為str,記憶體流變數為ms,位元陣列為bt 1.字串轉位元陣列 1 byte bt system.text.encoding.default.getbytes 字串 2 byte bt convert.frombase64string 字串 2.字串轉流 1 memorystr...