我正在尝试使用 Shift-JIS 字符串在 C++ 中执行
strstr
。但由于接受的答案here指出,如果使用标准strstr
,可能会出现误报,所以我不能只使用标准库中的常规答案。显然 Windows 提供了 _mbsstr
可以满足我的需求,但我也瞄准其他平台。
我尝试使用gnulib,因为它还提供了
mbsstr
,但我无法让它工作,因为它需要自动工具,而我正在使用cmake。
还有什么可以达到这个目的吗?
您必须编写完全自定义的 Shift-JIS 搜索算法或解码为适合常规搜索算法的字符串,例如UCS-4 或 UTF-8。
例如,基于 wikipedia's Shift-JIS 描述的简单自定义算法
using sjchar = std::uint8_t;
using sjstring_view = std::basic_string_view<sjchar>;
bool multibyte_prefix(sjstring_view str)
{
auto first = str[0];
if(first >= 0x81 && first <= 0x9f)
return false;
if(first >= 0xe0 && first <= 0xef)
return false;
return true;
}
size_t custom_search(sjstring_view str, sjstring_view sub)
{
for(size_t i = 0; i < str.size();)
{
if(str.substr(i).starts_with(sub))
return i;
if(multibyte_prefix(str))
i += 2;
else
i++;
}
return str.npos;
}