use*_*652 12 c++ regex boost utf-8
#include <boost/regex.hpp>
#include <string>
#include <vector>
#include <iostream>
int main(int argc, char* argv[]) {
std::string text = argv[1];
std::string patterns = argv[2];
boost::regex regex = boost::regex(patterns);
boost::smatch match;
std::cout << boost::regex_search(text, match, regex) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
如果我在输入上运行程序hello¿ ¿(包含UTF-8编码的非ASCII字符),则返回0ie not found,但如果我在输入hel√√上运行它(再次包含非ascii),则返回1,即找到.
我的问题:boost::regex当运行utf字符时,(即ascii版本)的预期行为是什么?
编辑:感谢所有的评论,我仍然感兴趣的是为什么输出正好1,因为文本和正则表达式都包含非ascii字符.我的猜测是字节被解释为ascii,因此它们匹配.
在ASCII字符串上使用正则表达式是关于使用"bytes"来查找模式.
在UTF-8字符串上使用正则表达式是关于在"多字节"序列上使用正则表达式,其中序列表示Unicode代码点.
因此,正则表达式应用于Unicode字符串,其编码具有每个字符可变的字节数.
UTF-8字符串包含1到4个字节的多字节序列,表示Unicode"字符".在UTF-8中,只有ASCII 7位字符是1字节"宽".
因此 - 在UTF-8编码的字符串上使用ASCII正则表达式引擎,忽略UTF-8编码字符串中的多字节序列,并导致逐字节匹配模式.在UTF-8编码的字符串上使用此ASCII正则表达式引擎的结果无效.
请查看http://utfcpp.sourceforge.net.
要使正则表达式处理UTF-8编码的字符串,您必须...
std::codecvt_utf8结合使用临时设置全局语言环境来使正则表达式工作,或者regex_search函数返回一个布尔值并true匹配.
在您的情况下,ASCII正则表达式模式匹配UTF-8编码字符串的一部分,该字符串被无效地解析为ASCII字符串 - 正如您所假设的那样!
如果您使用UTF-8编码的字符串中的英文文本,则可以安全地使用ASCII正则表达式引擎.保留ASCII 7位范围,使得ASCII正则表达式引擎的结果不可靠.
| 归档时间: |
|
| 查看次数: |
1143 次 |
| 最近记录: |