將 Byte 陣列還原為文字 (尤其是中文)

有很多方式可以從檔案中讀取文字。但是當我們選擇使用 Stream.ReadByte 來讀取檔案中的文字時,它是以一個 Byte、一個 Byte 的方式讀進來的。如果是以 File.ReadAllBytes 的方法讀取檔案,則是以 Byte[] 讀取...

有很多方式可以從檔案中讀取文字。但是當我們選擇使用 Stream.ReadByte 來讀取檔案中的文字時,它是以一個 Byte、一個 Byte 的方式讀進來的。如果是以 File.ReadAllBytes 的方法讀取檔案,則是以 Byte[] 讀取。

比較起以 File.ReadAllLines 讀取 String[] 或以 StreamReader.ReadLine 讀取 String,讀取 Byte 或 Byte 陣列對於中文字元顯然並不是很好的辦法,尤其是當你需要把這些 Byte 轉換為 String 來使用的時候。在大部份時候,若要讀取文字檔案,使用 File.ReadAllLines 或 StreamReader.ReadLine 等方法是比較合宜的。

不管怎樣,如果你已經以 Byte 或 Byte[] 讀取進來了,你要如何還原為中文字串呢?

 

一個中文字元是以兩個 Byte 來代表的,第一個 Byte 一律大於 128,第二個 Byte 則不一定。如果你使用 ASC() 來得出一個中文字,會得到一個負值 (這是因為將兩個 Byte 解釋成 Int16 的綠故;在這種情況下,凡是大於 32767 的值會以負數型式表示,所以所有中文字都會得到負值)。如果你把它加上 65536,則會得到正確的正值。例如「題」這個字,它的 ASC() 值是 -15548,或是 49988 (加上 65536 之後),而它的第一個 Byte 的值是 195,第二個 Byte 是 95。

如果你要把它恢復為中文字,方法就是將第一個 Byte 乘上 256,再加上第二個 Byte 的值,然後再套用 Chr() 就行了。

所以以「題」為例,195 (第一個 Byte 的值) * 256 + 95 (第二個 Byte 的值) = 49988;而 Chr(49988) 就是「題」字。

以下就是一個將位元組陣列還原成含中英文字串的程式:


Dim ch() As Byte = {195, 68, 32, 65, 32, 165, 216, 32}
Dim str As String = String.Empty
For i As Integer = 0 To ch.Length - 1
    If ch(i) > 128 AndAlso i < ch.Length - 1 Then
        str += Chr(ch(i) * 256 + ch(i + 1))
        i += 1
    Else
        str += Chr(ch(i))
    End If
Next
Response.Write(str)

 

這個程式可以正確的使用在夾雜中英文和各種符號的情況中。


Dev 2Share @ 點部落