pcre2 UTF32 usage
pcre2 UTF32 usage
我刚刚花了一些时间弄清楚 pcre2 接口,并认为我已经掌握了大部分。我想支持 UTF32,pcre2 已经构建了支持,代码点宽度已设置为 32。
下面的代码是我使用设置为 8 的代码点宽度。 如何更改此设置以使用 UTF32?
#include "gtest/gtest.h"
#include <pcre2.h>
TEST(PCRE2, example) {
//iterate over all matches in a string
PCRE2_SPTR subject = (PCRE2_SPTR) string("this is it").c_str();
PCRE2_SPTR pattern = (PCRE2_SPTR) string("([a-z]+)|\s").c_str();
int errorcode;
PCRE2_SIZE erroroffset;
pcre2_code *re = pcre2_compile(pattern, PCRE2_ZERO_TERMINATED, PCRE2_ANCHORED | PCRE2_UTF, &errorcode,
&erroroffset, NULL);
if (re) {
uint32_t groupcount = 0;
pcre2_pattern_info(re, PCRE2_INFO_BACKREFMAX, &groupcount);
pcre2_match_data *match_data = pcre2_match_data_create_from_pattern(re, NULL);
uint32_t options_exec = PCRE2_NOTEMPTY;
PCRE2_SIZE subjectlen = strlen((const char *) subject);
errorcode = pcre2_match(re, subject, subjectlen, 0, options_exec, match_data, NULL);
while (errorcode >= 0) {
PCRE2_UCHAR *result;
PCRE2_SIZE resultlen;
for (int i = 0; i <= groupcount; i++) {
pcre2_substring_get_bynumber(match_data, i, &result, &resultlen);
printf("Matched:%.*sn", (int) resultlen, (const char *) result);
pcre2_substring_free(result);
}
// Advance through subject
PCRE2_SIZE *ovector = pcre2_get_ovector_pointer(match_data);
errorcode = pcre2_match(re, subject, subjectlen, ovector[1], options_exec, match_data, NULL);
}
pcre2_match_data_free(match_data);
pcre2_code_free(re);
} else {
// Syntax error in the regular expression at erroroffset
PCRE2_UCHAR error[256];
pcre2_get_error_message(errorcode, error, sizeof(error));
printf("PCRE2 compilation failed at offset %d: %sn", (int) erroroffset, (char *) error);
}
大概subject
和pattern
需要以某种方式转换,result
是同一类型?我在 pcre2 标头中找不到任何内容来表示对此的支持。 我想subjectlen
将不再是简单的strlen
.
最后,我通过浏览了一些文档和标题将此示例放在一起,还有什么我应该做的/值得知道的吗?
最后我离开了pcre2,在评估了RE2,PCRE2和ICU之后,我选择了ICU。它的 unicode 支持(从我目前看到的)比其他两个要完整得多。它还提供了一个非常干净的API和许多用于操作的实用程序。重要的是,像PCRE2一样,它提供了一个perl风格的正则表达式引擎,开箱即用,可以很好地与Unicode配合使用。
如果正确设置代码宽度,这可能是问题所在:(PCRE2_SPTR) string("this is it").c_str();
将 c_str() 转换为 PCRE2_SPTR 不会使字符串成为 utf32。
如果您不确定是否设置正确的代码宽度(我没有在您的 sorce 代码中看到它),您可以通过为所有内容添加 _32 后缀来强制使用 32 位,例如pcre2_compile_32
.
这取决于您将要使用的字符类型以及您将要定位的系统。
std::string
的基本单位是char
,通常为 8 位并支持 UTF-8(可能因实现/系统而异)。因此,在此类系统中处理 UTF-32 时,您不能使用std::string("some string")
和此类代码。
PCRE2_CODE_UNIT_WIDTH
必须与要使用的基本字符单元的位大小匹配。对于 8 位char
它应该定义为 8,对于 16 位char
它应该定义为 16 等等......
在 GNU/Linux 中,您可以使用wchar_t
,即支持 32 位和 UTF-32 的std::wstring
。在窗口中,wchar_t
是 16 位(使用 UTF-16)。
在>=C++11
中,您可以使用char32_t
,即至少为32位的std::u32string
(您必须确保它在目标系统中正好是32位)
我在C++中有一个 PCRE2 的包装器,其中包含一些有关如何处理 UTF-16 和 UTF-32 模式的示例(在 src 目录中)。
- C++ Usage of AsyncCallback
- std::visit and std::variant usage
- QLoggingCategory::setFilterRules usage
- C++ std::initializer_list usage
- Direct3D typedef usage
- Windows SetupAPI DIF_REMOVE usage
- 在使用 UTF32-CPP 从 UTF8 到 UTF8 的对话中,我收到错误"utf8::invalid_code_point"
- C++ unique_ptr() Usage
- c++14 static constexpr auto with odr usage
- The usage of snprintf
- pcre2 UTF32 usage
- Qt QProccess with ping utility usage
- Usage of InternetGetConnectedStateEx
- Usage of QOpenGLVertexArrayObject
- QtGstreamer camerabin2 usage
- pcl::PCLPointCloud2 usage
- Zlib usage - deflateEnd() error
- OpenCV C++ usage of cv::Moments
- libGL heap usage
- 为什么"find usage"不适用于不同子项目中的信号