C++ C++;对MBCS使用std::string函数,对UTF-16使用std::wstring函数

C++ C++;对MBCS使用std::string函数,对UTF-16使用std::wstring函数,c++,windows,string,utf-16,mbcs,C++,Windows,String,Utf 16,Mbcs,有没有人处理过为MBCS使用std::string函数的问题?例如,在C中,我可以这样做: p = _mbsrchr(path, '\\'); 但是在C++中我这样做: found = path.find_last_of('\\'); 如果trail字节是斜杠,那么会在trail字节处找到最后一个stop吗?对于std::wstring也是同样的问题 如果我需要用另一个字符替换所有的字符,比如说所有的前斜杠都是反斜杠,那么正确的方法是什么?我是否必须检查每个字符的前导代理字节,然后跳过跟踪?

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

p = _mbsrchr(path, '\\');
<>但是在C++中我这样做:

found = path.find_last_of('\\');
如果trail字节是斜杠,那么会在trail字节处找到最后一个stop吗?对于std::wstring也是同样的问题

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

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


编辑:正如David正确指出的,在处理多字节代码页时,需要处理更多的问题。用于处理字节索引和MBC。在使用ANSI代码页时,我似乎无法可靠地使用find_last_。

您不需要对代理项对做任何特殊的处理。作为代理项对的一半的单个16位字符单元也不能是非代理项字符单元

所以

这是完全正确的

同样,您也可以使用
wstring
查找中的最后一个


对于多字节ANSI代码页来说更复杂。您确实需要处理lead和trail字节问题。我的建议是,如果你真的要处理多字节的ANSI数据,就应该将其标准化为更合理的编码

等等,这同样适用于MBC吗?David是的,ANSI代码页也是如此。因为我非常确定MBCS可以在跟踪字节中提供斜杠字符。你知道在那种情况下我该怎么办吗。感谢您的回答,到目前为止,在任何ANSI代码页中都无需担心,
find_last_of
在那里很好。即使使用UTF-8,您也可以搜索
'\\'
,而不用担心多字节编码问题。这是因为所有在UTF8中需要多个字节的代码点的最高有效位都是1。我忘记了多字节的ANSI代码页。那么就不要在MBCS中使用find_last_了?你能针对这种情况更新你的答案吗
if( *i == L'/' )
    *i = L'\\';