按照我之前的问题:尽管手册页有免责声明,为什么“strchr”似乎可以使用多字节字符? https://stackoverflow.com/q/25566356/3194340,我发现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);
Ouput:
é 是一个多字节字符
这就是我所期望的:多字节字符的第一个字节的位置。
先验地,这不是规范的用法strstr
但似乎效果很好。
这个解决方法安全吗?您能想到会导致错误的任何副作用或特殊情况吗?
[EDIT]:我应该明确表示我不想使用wchar_t
类型并且我处理的字符串是 UTF-8 编码的(我知道这一点choice http://utf8everywhere.org/可以讨论,但这是一个无关紧要的辩论)
Edit
基于 OP 的更新问题“UTF-8 上下文中是否存在这种误报”
因此,答案是 UTF-8 的设计方式使其不会受到如上所示的字符部分不匹配的影响并导致任何误报。所以使用起来完全安全strstr
带有 UTF-8 编码的多字节字符。
原答案
No strstr
不适合包含多字节字符的字符串。
如果您在包含多字节字符的字符串中搜索不包含多字节字符的字符串,则可能会出现误报。 (使用时Shift-jis 编码 http://www.rtpro.yamaha.co.jp/RT/docs/misc/kanji-sjis.html在日语语言环境中, strstr("掘某事", "@some") 可能会给出误报)
+---------+----+----+----+
| c1 | c2 | c3 | c4 | <--- string
+---------+----+----+----+
+----+----+----+
| c5 | c2 | c3 | <--- string to search
+----+----+----+
如果 c1 的尾随部分(意外地)与 c5 匹配,您可能会得到不正确的结果。我建议使用 unicode 和 unicode 子字符串检查函数或多字节子字符串检查函数。 (_mbsstr http://msdn.microsoft.com/en-us/library/z9da80kz.aspx例如)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)