簡體   English   中英

在C中使用帶有unicode字符串的正則表達式

[英]using regular expression with unicode string in C

我目前在 unicode 字符串上使用正則表達式,但我只需要匹配 ASCII 字符,從而有效地忽略所有 unicode 字符,直到現在 regex.h 中的函數工作正常(我在 linux 上,因此編碼為 utf8)。 但是有人可以確認這樣做是否真的可以嗎? 或者我需要一個 Unicode 正則表達式庫(比如 ICU?)

UTF-8 是一種變長編碼 有些字符是 1 個字節,有些是 2 個,其他的則是 3 或 4 個字節。您現在知道每個字符的前綴可以讀取許多字節。 0 表示 1 個字節,110 表示 2 個字節,1110 表示 3 個字節,11110 表示 4 個字節。

如果您嘗試將 UTF-8 字符串讀取為 ASCII 或任何其他固定寬度的編碼,事情會變得非常錯誤......除非該 UTF-8 字符串只包含 1 個字節的字符,在這種情況下它與 ASCII 匹配。

然而,由於 UTF-8 中沒有字節包含空字節,並且沒有任何額外的字節可以與 ASCII 混淆,如果你真的只匹配 ASCII,你可能能夠逃脫它......但我不會不推薦它,因為有比 POSIX 更好的正則表達式選項,它們很容易使用,為什么在你的代碼中留下一個隱藏的編碼炸彈讓一些傻瓜稍后處理? (注意:那個傻瓜可能是你)

相反,請使用支持 Unicode 的正則表達式庫,如 Perl Compatible Regular Expressions (PCRE)。 PCRE通過將PCRE2_UTF標志傳遞給PCRE2_UTFpcre2_compile PCRE regex 語法比 POSIX regex 更強大、更廣為理解,並且 PCRE 具有更多的特性。 PCRE 帶有 Gnome Lib ,它本身提供了非常方便的 C 函數的盛宴。

你需要小心你的模式和你要匹配的文本。

例如,給定表達式ab

"axb" matches 
"aèb" does NOT match

原因是當 UTF-8 編碼時è是兩個字節長,但是. 只會匹配第一個。

因此,只要您只匹配 ASCII 字符序列,您就是安全的。 如果你混合使用 ASCII 和非 ASCII 字符,你就有麻煩了。

您可以嘗試將單個 UTF-8 編碼的“字符”與以下內容進行匹配:

([\xC0-\xDF].|[\xE0-\xEF]..|\xF0...|.)

但這假設文本編碼正確(坦率地說,我從未嘗試過)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM