命令提示字元 16:文字文件

這章是要討論文字編碼及命令提示字元對於 Unicode 的支援。首先先來看最單純的:

ASCII

這是美國國家標準協會(ANSI)所制定的文字編碼方法,一共 128 個字,詳見維基百科



但 128 個實在沒有全球通用,所以國際標準化組織(ISO)就定義通用字符集 ISO 10646(Universal Character Set,UCS)來統一所有字集,經由統一碼聯盟(主要是一些企業)整理誕生了:

Unicode

有鑑於 ASCII 一個位元組(1 byte)不夠用,所以 Unicode 就用二個位元組(2 byte)來表示一個字,可達 65536 個字。對應字元的動作是「轉換格式」(Unicode Transformation Format,簡稱為 UTF),而二個位元組 Unicode 實作是:

UTF-16

這是 Unicode 的標準的名稱,在 ISO 的標準叫作 UCS-2 。另外 ISO 也定義了四個位元組,其 Unicode 實作是:

UTF-32

這是 Unicode 的標準的名稱,在 ISO 的標準叫作 UCS-4 。但實際上沒有那麼簡單,在麥金塔和個人電腦上讀取字元順序不同,如「U+4E59」,在個人電腦(像是 Windows)會取「4E59」的「乙」字;但麥金塔會取「594E」的「奎」字。為了區分,前者叫作大端序:

UTF-16 Big Endian (UCS-2 BE)
UTF-32 Big Endian (UCS-4 BE)

後者叫作小端序:

UTF-16 Little Endian (UCS-2 LE)
UTF-32 Little Endian (UCS-4 LE)

為了區別二者,編碼時會在文件第一個字加入位元組順序記號(Byte-Order Mark,BOM),第一個字是 U+FFFE 表示小端序;第一個字是 U+FEFF 表示大端序。



但原本 UTF-16 實在太粍空間了,原 ASCII 字集竟然要用二個位元組(2 byte),所以 Unicode 就創造了只用一個位元組(1 byte)存放的方法:

UTF-8

就是把 ASCII 字集第一位元(bit)置「0」以作識別,而其他字就是 UTF-16 字集。 UTF-8 因為編碼過所以不用考慮位元組序(因為很好辨識),但是微軟視窗作業系統的記事本就在所有文字文件檔(.txt)前面加上 0xEFBBBF 這個字來表示這是 UTF-8 ,但在大部份不支援的軟體(尤其是編譯器)會有問題,所以才會有另外一種文字文件產生:

UTF-8 without BOM

非常之好笑的是命令提示字元是不吃 BOM 的,當它被餵 BOM 時它會認為前面多一個字。



講那麼多是要接接下來的解釋,在前面也看到大部份的字元都要用到 Unicode ,當然在批次檔也有可能會用到,不過很可惜,命令提示字元支援得很差,啟用方法有二種,第一種是:

cmd /u

而第二種方法是:

chcp 65001

從 Windows® 10 中命令提示字元己經可以做一些 Unicode 的操作,這是相較之前幾版非常大的改進。連 .cmd 存成 Unicode 也是可以正常支援,這在以往是不行的。讀者可以嘗試對 Unicode 字元顯示,應該不會有什麼問題。但是 Unicode 字元眾多,使用時還是要再三確認執行是否正常,以免日後的批次檔出問題。

命令提示字元對 Unicode 支援進行大幅的改善,謝天謝地,這在之前是連想都不用想。字元編碼的部份也多少會一下,本教學已經整理得很精簡了,以後在使用上也不會有問題。下一章也跟這章性質很接近,會用到但不重要。



下一章:變數變換




  • 2012-09-11 初次發佈。
  • 2013-07-20 部分字句修改。
  • 2017-07-12 更新成 Windows 10 的版本。

沒有留言:

張貼留言

定時會整理。