例如我在mac上有個f.txt文件,系統是utf-8編碼
其中有資料"\xE6\x97\A5"—在utf-8編碼下為漢字"日"
那我用ultraedit將f.txt另存為以下幾個檔案:
f1.txt檔案
其實際儲存的內容為"\xE6\x97\A5",讓ultraedit將其解釋為是gb18030編碼,那麼在ultraedit介面顯示為亂碼。之後另存為gb18030編碼的文件,在mac系統開啟卻是utf-8,顯示正常的。
f2.txt檔案
實際儲存內容為"\xE6\x97\A5",解釋為utf-8,那麼顯示為"日"
f3.txt檔案
直接另存為gb18030編碼,那麼ultraedit會自動改變編碼 即把"\xE6\x97\A5"變成"\xC8\xD5"。之後vim開啟檔案呼叫ascii編碼解釋。
問題來了,
既然實際儲存資料是"\xE6\x97\A5",那我的編輯器憑什麼解釋為utf-8編碼呢?我想得到GBK解釋的亂碼怎麼辦?
是在文件的二進位頭部加入某種標記嗎,如果是,這種標記該如何查看?
是在編輯器端進行基於編碼的語意分析嗎?
迷茫2017-05-16 16:39:24
就拿 vim 來說吧
一個文字文件,vim 打開的時候按某種編碼A打開,轉換成某種編碼B,然後保存的時候轉換成另一種編碼C,其他文本編輯器類似,可能沒有vim這麼可以設置和自動完成。
編碼B:整個檔案沒有影響,只是事關顯示的,就是vim與作業系統互動時候使用的編碼。
编码A
:使用 set fileencodings=ucs-bom,utf-8,gbk,cp936,latin-1
设置。vim 按照设置的顺序检查检测文件的编码。因为某些编码里不存在某些二进制序列的组合,所以如果检测到就认为不是这种编码,检查下一种编码,否则就认为是这一种。因为latin-1
可以出现任何二进制序列的组合,所以如果放到第一个,那么将永远以latin-1
顯示。
在一般的二進位檔案裡是不存在字元編碼的標記的。但是Unicode裡面有個特殊叫做零寬度空格(FEFF
)而FFFE
是不存在的编码,所以在Unicode的标准里可以人为的在开始加入这个字符(这个字符在任何字体下都是没有宽度的,在中文字符里面没有任何的效果跟没有一样,是为了照顾东南亚某些语言的显示而设置的)。这样就便于文本编辑器检查字符和字节顺序,但是在代码里include
這種文件常會出問題(這可是個大坑,編譯器會認為這是一個非法字符,可是你又看不到)。
编码B
:set fileencoding=utf-8
,儲存時候使用的編碼,儲存的時候自動轉換為另一種編碼。但是如果一開始開啟的時候就辨識錯了編碼,再轉換的時候一個不存在的字元也是不會完成轉換的。
所以 f1.txt 儲存為 gp18030 可能不會進行編碼的轉換。
」問題來了,我想要得到實際儲存資料是"xE6x97A5",但是用gb18030編碼解釋,該如何做?「這是什麼意思?
PHP中文网2017-05-16 16:39:24
文件編碼就是實際以何種方式儲存的程式碼規定,首先就回答你的問題,日
在UTF8
编码中是xE6x97A5
,你就不可能说采用GB18030
编码结果还为xE6x97A5
的日
字。
編輯器識別文本文件編碼有不同的方式,有的文件編碼帶有Magic
頭,可以直接識別其前幾個字節來完成,不過大部分文本文件不帶有此類識別碼,完全靠編輯器透過上下文和使用者的語言環境進行猜測。