C/C++ 中是否有任何可用于多字节字符串的 strstr 替代品?

问题描述 投票:0回答:1

我正在尝试使用 Shift-JIS 字符串在 C++ 中执行

strstr
。但由于接受的答案here指出,如果使用标准
strstr
,可能会出现误报,所以我不能只使用标准库中的常规答案。显然 Windows 提供了
_mbsstr
可以满足我的需求,但我也瞄准其他平台。

我尝试使用gnulib,因为它还提供了

mbsstr
,但我无法让它工作,因为它需要自动工具,而我正在使用cmake。

还有什么可以达到这个目的吗?

c++ c internationalization
1个回答
0
投票

您必须编写完全自定义的 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.