中文編碼筆記

2021-09-01 22:45:06 字數 2822 閱讀 7349

[size=large][b]問題描述:[/b][/size]

上週在壓縮tar格式檔案的時候, 遇到了亂碼問題。

既是檔名在tar檔案中顯示為亂碼。 如下圖所示

[img]

[b]你好[/b]被轉換成了[b]浣犲ソ[/b]

為什麼會這樣, 首先要了解一下中文編碼。

[b]國標碼和unicode[/b]

[i]國家標準強制標準冠以「gb」。現時中華人民共和國官方強制使用gb 18030標準,但較舊的計算機仍然使用gb 2312。[/i]

正如chrome瀏覽器裡面所顯示的三種中文編碼-> utf-8, gbk, gb18030.

個人感覺一般開發都使用utf8和gbk編碼。

而 "你好"->"浣犲ソ" 在這裡也正是使用gbk標準來解碼utf8編碼文字所產生的錯誤。

[b]gbk和unicode的編碼表[/b]

utf8:[url]

gbk: [url]

這裡就檢視「你」這個漢字是怎麼編碼的。 在gbk中。對應的是c4 e3,而在utf-8中,對應的是e4 bd a0。

(注:最初我以為gbk的編碼和utf8的編碼之間會有一定的聯絡,一直在找它們的規律。結果發現, 我完全想錯了。 他們的編碼是沒有什麼可以轉換的關係的。後面再說)

[size=large][b]編碼解碼過程[/b][/size]

上述編碼全部都是十六進製制的數字。 這裡說一下編碼解碼的過程,拿

string str="你" 為例,先看一下文字是如何轉換為二進位制的。

gbk:

string gbk="你";

byte bytes=gbk.getbytes("gbk");

system.out.println(bytes.length);

for(int i=0;i區域和語言-》管理, 可以看到:

[img]

所謂非unicode程式所使用的語言, 既是當我們開啟乙個程式,而該程式所使用的編碼不是unicode, 這時候系統要使用的解碼方法。

舉個例子, 我們要開啟乙個日文軟體,該日文軟體並不是使用的utf8編碼,而是其它的日本本地的編碼, 這時候系統便會呼叫我們在這裡所設定的[b]非unicode程式所使用的語言[/b]。 我猜大概就是gbk gb之類的。 於是我們就能看到滿屏的亂碼。

因此我們如果把這裡修改為 日本(日語),重啟電腦再開啟該日文軟體,就會正確顯示日文了。 原因也就是系統用正確的編碼標準來解碼了。

[size=large][b]tar檔名亂碼問題[/b][/size]

回到最初遇到的問題。我在網上查了很久, 最後看到

[url] 這裡說[b]tar壓縮格式不會記錄字符集, 而rar和zip會[/b]。 如果這樣的話, 那tar真是不適合中文。

具體來說就是, 檔名被壓縮程式設定了utf8編碼, 但是到了tar中, tar不支援utf8,於是我們的系統就使用了[b]非unicode程式所使用的語言[/b]來進行解碼。

於是呢, 就有了以下步驟:

[color=red]1. 定義了乙個字元「你」, 然後該字元被用'utf8'編碼, 變成了2進製11100100,10111101,10100000

之後此二進位制被傳入了某乙個程式中, 該程式不知道『你』這個字是什麼編碼格式的, 於是嘗試用gbk進行解碼。

gbk是怎麼解碼的呢? 會把這段二進位制當做每16位表示乙個字元。

於是前面的11100100,10111101就被提取了出來, 然後程式開始在gbk編碼表中搜尋對應的字元。

結果就找到了 e4 bd->浣 。

接下來的10100000沒法解碼, 就出來了乙個問號'?'。[/color]

這段話是之前做的筆記, 也就是系統使用國標碼標準來解碼utf-8編碼文字所出現的問題。

最後放上tar檔案壓縮的問題**。

system.out.println(system.getproperty("file.encoding"));

system.out.println(charset.defaultcharset().name());

string path="d:\\_thumbnail";

string f="d:\\t.tar";

tararchiveoutputstream taos=new tararchiveoutputstream(new fileoutputstream(f),"utf-8");//這裡設定為gbk就可以解決亂碼問題

file of=new file(path);

file ofs=of.listfiles();

system.out.println(ofs.tostring());

for(file off:ofs)

tararchiveoutputstream taos=new tararchiveoutputstream(new fileoutputstream(f),"utf-8");//這裡設定為gbk就可以解決亂碼問題

[color=violet]constructor for tarinputstream.

parameters:

os the output stream to use

encoding name of the encoding to use for file names[/color]

如注釋寫的一樣, 這裡不寫編碼格式,則會使用預設的utf-8來進行檔名編碼。

之所以設定gbk編碼不會出現亂碼,就是因為系統得不到tar壓縮檔案名的編碼資訊,就採用了非unicode所使用語言,既gbk, 來進行解碼。

[size=large][b]解決方法:[/b][/size]

壓縮tar檔案時,檔名用英文即可。

終於寫完了-o- 寫的不是一般的亂

中文編碼 1 常見中文編碼格式

為什麼要有中文編碼格式?最早的ascii碼只包括了字母 標點符號 特殊字元等127個字元。這些字元對於拉丁語系國家的人使用是足夠的,但是對於非拉丁語系國家 如中國 日本等 ascii碼就遠遠不夠了。因此就需要編碼來表示大量的漢字字元。常用的幾種中文編碼格式 1 unicode編碼 unicode編碼...

常見編碼格式(中文編碼)

中文編碼主要有以下四種 gb2312簡體中文編碼,乙個漢字占用2個位元組,在大陸是主要的編碼方式。當文章 網頁中包含正體中文 日文 韓文等時,這些內容可能無法被正確編碼。big5正體中文編碼,主要在台灣地區使用。gbk支援簡體及正體中文,但對他國非拉丁字母語言還是有問題。utf 8 unicode編...

中文編碼簡介

中文字庫有關的常見編碼有 單位元組編碼 gb2312 80 gb12345 90 gbk unicode編碼 unicode字符集 big5編碼。下面簡要介紹一下 1.gb2312 80 全稱是gb2312 80 資訊交換用漢字編碼字符集 基本集 1980年發布,是中文資訊處理的國家標準,在大陸及海...