繁体   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