-
1 # 我不掙錢
-
2 # TonyDeng
那是因為你指定輸出函式把這一串數字作為字串解釋,具體輸出成什麼字元,跟系統的編碼設定有關,輸出函式使用系統預設編碼。
參考如下程式碼的輸出,就明白原理:
不同的編碼系統,字串位元組陣列的值不同,編碼長度也不同。如下例子,字串是同一個,但我把它轉換為不同的編碼,得到的位元組陣列是不同的。這就是我們常見亂碼的原因,對未知編碼的文字檔案,若解碼不對,則出現亂碼,這個時候,你需要變換編碼進行嘗試。特別留意:utf-8是變長編碼的,4個漢字,普通是對應8個位元組,但我選定的這四個漢字utf-8卻是12個位元組碼,沒有固定的。
-
3 # 編碼之道
這個問題涉及到字元編碼與陣列的儲存機制,還是讓我們透過一個例項來解釋吧,先看下面這個簡單的程式以及它的執行結果,如下圖:
首先我們定義兩個陣列str1和str2,一個以漢字的方式初始化,程式碼第10行,另外一個以位元組數字方式初始化,見程式碼11行。表面上來看,這兩個陣列是完全不一樣的,接著讓我們分別以不同的方式輸出它們的內容。首先在13行和14行分別以字串方式輸出它們的內容,在右邊的程式執行結果可見它們輸出了同樣的內容——西安歡迎您。此外我們還定義了一個數組arr1,並透過數字給它賦值,程式碼12行,在15行我們將arr1轉換為一個字串,並且輸出它的內容,我們同樣得到了相同的結果。接下來,我們再以數字的方式輸出str1、str2以及pstr3的內容,見程式碼17-28行,在右側的輸出結果中可以看到,三種方式還是輸出了相同的內容。
由上面程式可見,雖然透過不同的方式對陣列進行初始化賦值,但是使用同樣的輸出方式,就會得到同樣的輸出結果,可見它們的實質內容是相同的。
為什麼會這樣呢,這就涉及到字元的儲存問題,我們知道,計算機內部的資料都是有0和1組成的二進位制數,要表示字元,就需要對它們進行編碼,因為計算機技術最初是從美國發展起來的,所以最初的ASCII編碼只有英文字母、數字和控制字元,一共256個。後來隨著計算機的發展,應用越來越廣,其它國家為了使計算機能處理自己的語言,就發明了很多別的編碼方式,各種編碼方式之間存在嚴重的相容性問題,於是為了統一,後來人們提出了UNICODE編碼。在這種編碼方式下,每個漢字用兩個位元組儲存,如果以字串輸出,就會顯示字元的內容,如果以數字輸出,就會顯示它的編碼。
目前,大部分的現代編譯器都開始使用UNICODE進行字串編碼,比如我用的是VS2017,就會出現陣列內容是數字,卻能輸出漢字的情況,如果同樣的程式碼,換作一些比較老的編譯器,可能就不會輸出漢字,而是一些亂碼了。
回覆列表
計算機根據編碼把位元組陣列對應的字元輸出到顯示器,中文常用的編碼有UTF8和GBK,如果讀取資料用錯了編碼會顯示亂碼