-1

我需要在二进制数据(文件)中找到 unicode 文本。

我正在寻找可以在 macOS 上使用的任何 C 或 C++ 代码或库。因为我猜这对其他平台也很有用,所以我宁愿让这个问题不特定于 macOS。

在 macOS 上,NSString无法使用满足我对 unicode 精通需求的函数,因为它们不适用于二进制数据。

作为替代方案,我尝试了regexmacOS 上提供的 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

期望的输出:所有情况都应该给出“是”

4

1 回答 1

0

我通过编写自己的前辈解决了这个问题,生成了一个结合了所有替代项(大小写和规范化但不是变音符号)的正则表达式,并将其传递给正则表达式函数。

完整的解决方案记录在这里

于 2019-04-28T16:54:04.823 回答