![](/img/trans.png)
[英]How to deal with non-ASCII UTF-8 characters across my application stack
[英]Running Ascii regex over non-ASCII characters with 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;
}
如果我通過輸入hello¿ ¿
(包含UTF-8編碼的非ASCII字符)運行程序,它返回0
即未找到,但是如果我通過輸入hel√√運行它(再次包含非ascii)它返回1,即找到。
我的問題:當運行utf字符時, boost::regex
(即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正則表達式引擎的結果不可靠。
這是一個錯誤,而不是一個功能:我在一個更好的系統上嘗試了你的例子(在Windows MinGW上的g ++ 4.9.2),一切都很順利:
#include <iostream>
#include <string>
#include <regex>
int main()
{ std::string text ="hello¿"; // or "hello√"
std::string patterns ="¿"; // or "√"
std::regex regex = std::regex(patterns);
std::smatch match;
std::cout << std::regex_search(text, match, regex) << std::endl;
}
輸出:
1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.