使用`strstr`在字符串中搜索多字节UTF-8字符是否安全?

Coc*_*nop 7 c string utf-8 multibyte-functions

按照我之前的问题:为什么`strchr`似乎与多字节字符一起工作,尽管手册免责声明?,我发现这strchr是一个糟糕的选择.

相反,我正在考虑使用strstr寻找单个字符(不是多字节char):

const char str[] = "This string contains é which is a multi-byte character";
char * pos = strstr(str, "é"); // 'é' = 0xC3A9: 2 bytes 
printf("%s\n", pos);
Run Code Online (Sandbox Code Playgroud)

输出继电器:

é是一个多字节字符

这是我所期望的:我的多字节字符的第一个字节的位置.

先验,这不是规范使用,strstr但似乎运作良好.
这种解决方法安全吗?你能想到会导致错误的任何副作用或特殊情况吗?

[编辑]:我应该确切地说我不想使用wchar_t类型,我处理的字符串是UTF-8编码的(我知道这个选择可以讨论,但这是一个无关紧要的辩论)

Moh*_*ain 7

strstr不适合包含多字节字符的字符串.

如果要在包含多字节字符的字符串中搜索不包含多字节字符的字符串,则可能会出现误报.(在日语语言环境中使用shift-jis编码时,strstr("求某事物","@ some")可能会出现误报)

+---------+----+----+----+
|   c1    | c2 | c3 | c4 |  <--- string
+---------+----+----+----+

     +----+----+----+
     | c5 | c2 | c3 |  <--- string to search
     +----+----+----+
Run Code Online (Sandbox Code Playgroud)

如果c1的尾随部分(意外)与c5匹配,则可能会得到错误的结果.我建议使用带unicode子串检查功能的unicode或多字节子串检查功能.(例如_mbsstr)

编辑
基于来自OP的更新问题"在UTF-8上下文中可以存在这样的误报"所以答案是UTF-8的设计方式使其不受如上所示的字符部分不匹配的影响并导致任何错误正.因此,使用strstrUTF-8编码的多字节字符是完全安全的.

  • 您不能使用UTF-8获得误报,因为字符的初始字节始终与任何可能的后续字符不同. (5认同)
  • 正如Ross已经提到过使用strstr for utf-8并且完全安全.生成UTF-8代码的方式是UTF-8字符集的字符之间不可能出现误报. (4认同)