【问题标题】:C++ Using std::string functions for MBCS and std::wstring functions for UTF-16C++ 对 MBCS 使用 std::string 函数,对 UTF-16 使用 std::wstring 函数
【发布时间】:2012-05-19 19:47:39
【问题描述】:

有没有人处理过在 MBCS 中使用 std::string 函数的问题?例如在 C 中我可以这样做:

p = _mbsrchr(path, '\\');

但在 C++ 中我正在这样做:

found = path.find_last_of('\\');

如果尾字节是斜线,那么 find_last_of 会在尾字节处停止吗? std::wstring 也是同样的问题。

如果我需要用另一个字符替换所有字符,请说所有正斜杠都带有反斜杠,那么正确的方法是什么?我是否必须检查每个字符的前导代理字节然后跳过线索?现在我正在为每个 wchar 执行此操作:

if( *i == L'/' )
*i = L'\\';

谢谢

编辑:正如 David 正确指出的那样,在使用多字节代码页时需要处理更多。 Microsoft says use _mbclen 用于处理字节索引和 MBCS。在使用 ANSI 代码页时,我似乎无法可靠地使用 find_last_of。

【问题讨论】:

    标签: c++ windows string utf-16 mbcs


    【解决方案1】:

    您不需要对代理对做任何特别的事情。作为代理对的一半的单个 16 位字符单元不能同时是非代理字符单元。

    所以,

    if( *i == L'/' )
        *i = L'\\';
    

    完全正确。

    您同样可以将find_last_ofwstring 一起使用。

    多字节 ANSI 代码页更复杂。您确实需要处理前导和尾随字节问题。如果您确实必须处理多字节 ANSI 日期,我的建议是规范化为更合理的编码。

    【讨论】:

    • 等等,MBCS 也一样吗?
    • 大卫是的,ANSI 代码页也是如此。因为我很确定 MBCS 可以在结尾字节中给出斜杠字符。你知道我在那种情况下应该怎么做吗?感谢您到目前为止的回答
    • 在任何 ANSI 代码页中都无需担心,find_last_of 在那里很好。即使使用 UTF-8,您也可以搜索 '\\' 而不必担心多字节编码问题。这是因为在 UTF8 中需要多个字节的所有代码点的最高有效位都为 1。
    • 不,没错。我忘记了多字节 ANSI 代码页。
    • 那么不要将 find_last_of 与 MBCS 一起使用?您能否针对这种情况更新您的答案
    猜你喜欢
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 2012-05-02
    • 1970-01-01
    相关资源
    最近更新 更多