快速開始
教學
工具和語言
範例
參考
書籍評論
範例
正規表示法範例
數字範圍
浮點數
電子郵件地址
IP 位址
有效日期
數字日期轉換為文字
信用卡號碼
比對完整行
刪除重複行
程式設計
兩個相近的字詞
陷阱
災難性回溯
重複次數過多
拒絕服務
讓所有內容變成可選
重複擷取群組
混合 Unicode 和 8 位元組
本網站的更多資訊
簡介
正規表示法快速開始
正規表示法教學
替換字串教學
應用程式和語言
正規表示法範例
正規表示法參考
替換字串參考
書籍評論
可列印 PDF
關於本網站
RSS 摘要和部落格
RegexBuddy—The best regular expression debugger!

混合 Unicode 和 8 位元組字元碼

電腦在內部處理的是數字,而不是字元。當您儲存文字檔時,每個字元都會對應到一個數字,而這些數字會儲存在磁碟中。當您開啟文字檔時,這些數字會被讀取並對應回字元。在使用正規表示法處理文字時,正規表示法需要使用與您用來建立您要讓正規表示法處理的檔案或字串相同的對應方式。

當您在正規表示法中輸入所有字元時,您通常不需要擔心任何事。提供正規表示法功能的應用程式或程式設計函式庫會知道您的主旨字串使用哪些文字編碼,並據此進行處理。因此,如果您想要搜尋歐元貨幣符號,而且您有歐洲鍵盤,只要按下 AltGr+E 即可。您的正規表示法 會順利找到所有歐元符號。

但是,您無法在美國鍵盤上按下 AltGr+E。或者您可能希望您的原始碼保持 7 位元組乾淨(即純 ASCII)。在這些情況下,您需要在正規表示法中使用字元跳脫。

如果您的正規表示法引擎支援 Unicode,請直接使用 Unicode 跳脫 \u20AC(大多數 Unicode 風格)或 \x{20AC}PerlPCRE)。U+20AC 是歐元符號的 Unicode 碼點。它將永遠比對到歐元符號,不論您的主旨字串是使用 UTF-8、UTF-16、UCS-2 或其他任何編碼。即使您的主旨字串是使用舊版 8 位元組編碼頁編碼,也不會造成混淆。您可能需要告訴應用程式或正規表示法引擎您的檔案使用哪種編碼。但是 \u20AC 永遠都是歐元符號。

大多數 Unicode regex 引擎也支援 8 位元字元跳脫 \xFF。然而,不建議使用。對於字元 \x00\x7F,通常沒有問題。前 128 個 Unicode 碼點與大多數 8 位元碼頁所根據的 ASCII 表相同。

但是,\x80 以上的詮釋可能有所不同。純粹的 Unicode 引擎會將其視為與 \u0080 相同,表示拉丁語 1 控制碼。但大多數人預期 \x80 會比對歐元符號,因為在所有 Windows 碼頁中,它佔據 80h 位置。如果您的文字檔使用 Windows 碼頁編碼,則使用 8 位元 regex 引擎時會比對。

由於大多數人預期 \x80 會被視為 8 位元字元,而不是 Unicode 碼點 \u0080,因此有些 Unicode regex 引擎會完全照做。有些硬體連線使用特定碼頁,例如 Windows 1252 或電腦的預設碼頁,來詮釋 8 位元字元碼。

其他引擎會讓它取決於輸入字串。Just Great Software 應用程式在搜尋 Unicode 文字檔時,會將 \x80 視為 \u0080,但在搜尋 Windows 1252 文字檔時,會視為 \u20AC。這裡沒有魔法。它會比對文字檔中索引為 80h 的字元,不論文字檔的編碼為何。Unicode 碼點 U+0080 是拉丁語 1 控制碼,而 Windows 1252 字元索引 80h 是歐元符號。反過來,如果您在文字編輯器中輸入歐元符號,儲存為 UTF-16LE 會儲存兩個位元組 AC 20,而儲存為 Windows 1252 會給您一個位元組 80

如果您發現上述內容令人困惑,請勿在支援 Unicode 的 regex 引擎中使用 \x80\xFF

8 位元 Regex 引擎

在使用僅處理 8 位元資料的舊式(過時?)正規表示式引擎時,您無法使用 Unicode 跳脫,例如 \u20AC\x80 是您擁有的全部。請注意,即使是現代引擎也有舊式模式。例如,流行的 regex 函式庫 PCRE 預設會以 8 位元引擎執行。如果您要使用 Unicode 功能,需要明確啟用 UTF-8 支援。當您執行此操作時,PCRE 也會要求您將主旨字串轉換為 UTF-8。

在為 8 位元引擎建立正規表示式時,您必須考量要使用的字元集或編碼頁。8 位元正規表示式引擎並不在乎。如果您在正規表示式中輸入 \x80,它將比對任何位元組 80h,不論該位元組代表什麼。在 Windows 1252 文字檔中,它將是歐元符號,在 Latin-1 檔案中是控制碼,在 EBCDIC 檔案中是數字零。

即使是在正規表示式中的字面字元,您也必須將正規表示式中使用的編碼與主體編碼配對。如果您的應用程式使用 Latin-1 編碼頁,而您使用正規表示式 À,當您搜尋 Latin-2 文字檔時,它將比對 Ŕ。應用程式會適當地在螢幕上顯示為 À,因為它使用錯誤的編碼頁。這個問題並非正規表示式所特有。當您使用不同 8 位元編碼的檔案和應用程式時,您將會遇到它。

因此,在使用 8 位元資料時,請在十六進位編輯器中開啟您正在使用的實際資料。查看正在使用的位元組,並在您的正規表示式中指定它們。

如果使用 8 位元引擎處理 Unicode 檔案,情況會變得非常棘手。讓我們回到我們只有一個歐元符號的文字檔。當儲存為 little endian UTF-16(在 Windows 上稱為「Unicode」)時,8 位元正規表示式引擎將看到兩個位元組 AC 20(請記住,little endian 會反轉位元組)。當儲存為 UTF-8(沒有 endianness)時,我們的 8 位元引擎將看到三個位元組 E2 82 AC。您需要 \xE2\x82\xAC 來比對 8 位元正規表示式引擎中的 UTF-8 檔案中的歐元符號。