C++11 `std::wregex`支持utf-16/unicode还是仅支持UCS-2?

C++11 `std::wregex`支持utf-16/unicode还是仅支持UCS-2?,c++11,utf-16,utf-8,ucs2,c++,regex,unicode,encoding,widechar,C++11,Utf 16,Utf 8,Ucs2,C++,Regex,Unicode,Encoding,Widechar,随着标准库的引入 在Windows/MSVC平台上,wchar\u t的大小为2(16位),与系统/平台接口时,wchar\u t*通常为2(如CreateFileW) 然而,std::regex似乎不支持或不支持它,所以我想知道std::wregex是支持还是仅仅支持它 我在文档中找不到这方面的任何提及(Unicode或类似代码)。在其他语言中,进行规范化 问题是: 是std::wregex表示当wchar\u t的大小为2时?C++标准不强制执行任何编码。它们只是一系列的图表。只有std::

随着标准库的引入

在Windows/MSVC平台上,
wchar\u t
的大小为2(16位),与系统/平台接口时,
wchar\u t*
通常为2(如
CreateFileW

然而,
std::regex
似乎不支持或不支持它,所以我想知道
std::wregex
是支持还是仅仅支持它

我在文档中找不到这方面的任何提及(Unicode或类似代码)。在其他语言中,进行规范化

问题是:


std::wregex
表示当
wchar\u t
的大小为2时?

C++标准不强制执行任何编码。它们只是一系列的
图表
。只有
std::u8string
std::u16string
std::u32string
定义了编码

同样地,也环绕
std::basic_字符串
图表
。接受
std::basic_string
,用于
std::basic_string
的编码也将用于
std::basic_regex
。所以你说的“std::regex不是utf-8或者不支持它”是错误的。如果当前区域设置为UTF-8,则
std::regex
std::string
将为UTF-8(是的,现代Windows不支持)

在Windows上,std::wstring使用UTF-16,因此std::wregex也使用UTF-16。UCS-2已弃用,没有人再使用它了。你甚至不需要区分,因为UCS-2只是UTF16的一个子集,除非你使用了一个非常旧的工具,该工具在代理对的中间。UTF-16中的字符串搜索的工作原理与UCS-2中的完全相同,因为从干草堆的中间开始,一个合适的针字符串永远不会匹配。与UTF-8相同。如果工具不理解UTF-16,那么很可能它也不知道UTF-8是可变长度的,并且会在中间截断UTF-8

自同步:前导字节和延续字节不共享值(延续字节以10开头,而单字节以0开头,较长的前导字节以11开头)<这意味着搜索不会意外地发现一个字符在另一个字符中间开始的序列。< /强>这也意味着可以通过备份最多3字节的随机位置来找到字符的起始,以找到超前字节。如果流从中间序列开始,错误的字符将不会被解码,并且较短的序列将永远不会出现在较长的序列中

<>你唯一需要关心的是:避免在字符中间截断,如果需要,在匹配之前对字符串进行归一化处理。如果您从未在诸如commented这样的字符类中使用BMP之外的字符,则在仅限UCS-2的正则表达式引擎中可以避免前一个问题。将它们替换为一个组

在其他语言中,进行规范化

这是错误的。某些语言可能在匹配正则表达式之前进行规范化,但这肯定不适用于所有“其他语言”

如果您想要多一点保证,那么分别对UTF-8和UTF-16使用
std::basic_regex
std::basic_regex
。尽管如此,您仍然需要一个支持UTF-16的库,否则这仍然只适用于只包含单词的正则表达式字符串

更好的解决方案可能是换成另一个类似的库。你可以查看一些建议。它甚至有一列指示每个库

相关的:

另见


AFAIK no
std::regex
实现正确支持Unicode。而且,它们都非常慢。不要使用它们,而是使用类似re2的东西。有时,对于一些代码部分,可以看到和KORADRUDLPHH速度比较小,但它是一个很好的评论。当它比其他实现慢八百倍(它!)时,它是一个问题。Windows使用UTF16和Visual C++本身支持标准UTF16字符串,即代码> U16Stords<代码>。C++本身对UTF8没有特殊的处理,直到C++ 20和UTF8字符串被当作char数组处理。如果你首先把你的非英语字符串编码为UTF8,ReGEX会起作用。现在是一个<代码> TyPulf Basic SuxEX WrEGEX;代码>因此它可以与
wchar\u t
一起使用,即UCS-2。除非你想处理中文或表情符号,否则这不应该是个问题。您可能可以创建一个
basic_regex
来处理UTF16字符串。不管出于什么原因,这都是留给读者的练习。经过更多的测试,我的主要问题似乎是匹配一个组,例如,一个表情符号和utf-16。无论我是否反转组,它都不匹配。@darune你指的是字符类,比如
[旧的UCS-2 only正则表达式引擎的解决方法是
(似乎我指的是字符类,而不是组-但确实很好。)