我需要在二进制数据(文件)中找到unicode文本。
我正在寻找可以在macOS上使用的任何C或C ++代码或库。由于我猜想这对其他平台也有用,所以我宁愿使这个问题不仅仅针对macOS。
在macOS上,无法使用NSString
函数来满足我对unicode的精明需求,因为它们不适用于二进制数据。
作为替代方案,我尝试了macOS上提供的符合POSIX的regex
函数,但是它们有一些限制:
下面显示这些结果的示例代码。
那里有什么代码或库可以满足这些需求?
我不需要正则表达式功能,但是如果有一个可以满足这些要求的正则表达式库,我也可以。
基本上,我需要使用以下选项进行Unicode文本搜索:
下面的测试代码显示了在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
所需的输出:所有情况都应为“是”
答案 0 :(得分:0)
我已经解决了这个问题,方法是编写自己的前任程序,生成一个将所有交替符(大小写和规范化但不包括变音符)组合在一起的正则表达式,并将其传递给regex函数。
完整的解决方案是documented here。