寻求精通Unicode的功能来搜索二进制数据中的文本

时间:2019-04-27 22:42:11

标签: regex search boyer-moore

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

我正在寻找可以在macOS上使用的任何C或C ++代码或库。由于我猜想这对其他平台也有用,所以我宁愿使这个问题不仅仅针对macOS。

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

作为替代方案,我尝试了macOS上提供的符合POSIX的regex函数,但是它们有一些限制:

  • 它们不是标准化专家,也就是说,如果我搜索预组合(NFC)字符,则在目标数据中如果它以分解(NFD)形式出现,则找不到字符。
  • 不区分大小写的搜索不适用于拉丁文NFC字符(搜索Ü找不到ü)。

下面显示这些结果的示例代码。

那里有什么代码或库可以满足这些需求?

我不需要正则表达式功能,但是如果有一个可以满足这些要求的正则表达式库,我也可以。

基本上,我需要使用以下选项进行Unicode文本搜索:

  • 不区分大小写
  • 对标准化不敏感
  • 对变音符号不敏感
  • 处理任意二进制数据,找到匹配的UTF-8文本片段

下面的测试代码显示了在macOS上使用TRE regex实现的结果:

#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

所需的输出:所有情况都应为“是”

1 个答案:

答案 0 :(得分:0)

我已经解决了这个问题,方法是编写自己的前任程序,生成一个将所有交替符(大小写和规范化但不包括变音符)组合在一起的正则表达式,并将其传递给regex函数。

完整的解决方案是documented here