搜尋

首頁  >  問答  >  主體

macos - 檔案的編碼是一個怎樣的機制

例如我在mac上有個f.txt文件,系統是utf-8編碼
其中有資料"\xE6\x97\A5"—在utf-8編碼下為漢字"日"

那我用ultraedit將f.txt另存為以下幾個檔案:

  1. f1.txt檔案
    其實際儲存的內容為"\xE6\x97\A5",讓ultraedit將其解釋為是gb18030編碼,那麼在ultraedit介面顯示為亂碼。之後另存為gb18030編碼的文件,在mac系統開啟卻是utf-8,顯示正常的。

  2. f2.txt檔案
    實際儲存內容為"\xE6\x97\A5",解釋為utf-8,那麼顯示為"日"

  3. f3.txt檔案
    直接另存為gb18030編碼,那麼ultraedit會自動改變編碼 即把"\xE6\x97\A5"變成"\xC8\xD5"。之後vim開啟檔案呼叫ascii編碼解釋。

問題來了,
既然實際儲存資料是"\xE6\x97\A5",那我的編輯器憑什麼解釋為utf-8編碼呢?我想得到GBK解釋的亂碼怎麼辦?
是在文件的二進位頭部加入某種標記嗎,如果是,這種標記該如何查看?
是在編輯器端進行基於編碼的語意分析嗎?

怪我咯怪我咯2776 天前748

全部回覆(2)我來回復

  • 迷茫

    迷茫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這種文件常會出問題(這可是個大坑,編譯器會認為這是一個非法字符,可是你又看不到)。

    编码Bset fileencoding=utf-8,儲存時候使用的編碼,儲存的時候自動轉換為另一種編碼。但是如果一開始開啟的時候就辨識錯了編碼,再轉換的時候一個不存在的字元也是不會完成轉換的。

    所以 f1.txt 儲存為 gp18030 可能不會進行編碼的轉換。

    」問題來了,我想要得到實際儲存資料是"xE6x97A5",但是用gb18030編碼解釋,該如何做?「這是什麼意思?

    回覆
    0
  • PHP中文网

    PHP中文网2017-05-16 16:39:24

    文件編碼就是實際以何種方式儲存的程式碼規定,首先就回答你的問題,UTF8编码中是xE6x97A5,你就不可能说采用GB18030编码结果还为xE6x97A5字。

    編輯器識別文本文件編碼有不同的方式,有的文件編碼帶有Magic頭,可以直接識別其前幾個字節來完成,不過大部分文本文件不帶有此類識別碼,完全靠編輯器透過上下文和使用者的語言環境進行猜測。

    回覆
    0
  • 取消回覆