我需要在二进制数据(文件)中找到 unicode 文本。
我正在寻找可以在 macOS 上使用的任何 C 或 C++ 代码或库。因为我猜这对其他平台也很有用,所以我宁愿让这个问题不特定于 macOS。
在 macOS 上,NSString
无法使用满足我对 unicode 精通需求的函数,因为它们不适用于二进制数据。
作为替代方案,我尝试了regex
macOS 上提供的 POSIX 兼容函数,但它们有一些限制:
- 它们不精通规范化,即如果我搜索预组合 (NFC) 字符,如果它在目标数据中以分解 (NFD) 形式出现,它将找不到字符。
- 不区分大小写的搜索不适用于拉丁 NFC 字符(搜索 Ü 找不到 ü)。
显示这些结果的示例代码如下。
有哪些代码或库可以满足这些需求?
我不需要正则表达式功能,但如果有一个正则表达式库可以处理这些要求,我也可以。
基本上,我需要使用以下选项进行 unicode 文本搜索:
- 不区分大小写
- 归一化不敏感
- 变音符号不敏感
- 适用于任意二进制数据,查找匹配的 UTF-8 文本片段
这是显示在 macOS 上使用 TRE 正则表达式实现的结果的测试代码:
#include <stdio.h>
#include <regex.h>
void findIn (const char *what, const char *data, int whatPre, int dataPre) {
regex_t re;
regcomp (&re, what, REG_ICASE | REG_LITERAL);
int found = regexec(&re, data, 0, NULL, 0) == 0;
printf ("Found %s (%s) in %s (%s): %s\n", what, whatPre?"pre":"dec", data, dataPre?"pre":"dec", found?"yes":"no");
}
void findInBoth (const char *what, int whatPre) {
char dataPre[] = { '<', 0xC3, 0xA4, '>', 0}; // precomposed
char dataDec[] = { '<', 0x61, 0xCC, 0x88, '>', 0}; // decomposed
findIn (what, dataPre, whatPre, 1);
findIn (what, dataDec, whatPre, 0);
}
int main(int argc, const char * argv[]) {
char a_pre[] = { 0xC3, 0xA4, 0}; // precomposed ä
char a_dec[] = { 0x61, 0xCC, 0x88, 0}; // decomposed ä
char A_pre[] = { 0xC3, 0x84, 0}; // precomposed Ä
char A_dec[] = { 0x41, 0xCC, 0x88, 0}; // decomposed Ä
findInBoth (a_pre, 1);
findInBoth (a_dec, 0);
findInBoth (A_pre, 1);
findInBoth (A_dec, 0);
return 0;
}
输出是:
Found ä (pre) in <ä> (pre): yes
Found ä (pre) in <ä> (dec): no
Found ä (dec) in <ä> (pre): no
Found ä (dec) in <ä> (dec): yes
Found Ä (pre) in <ä> (pre): no
Found Ä (pre) in <ä> (dec): no
Found Ä (dec) in <ä> (pre): no
Found Ä (dec) in <ä> (dec): yes
期望的输出:所有情况都应该给出“是”