C++;。std::string::substr的Bug? 我一直在使用C++,使用了 STD< /Cord>库;特别是方法string::substr

C++;。std::string::substr的Bug? 我一直在使用C++,使用了 STD< /Cord>库;特别是方法string::substr,c++,string,utf-8,ascii,substr,C++,String,Utf 8,Ascii,Substr,我在这个方法中发现了一些错误,我想告诉你 对于字符串abcñ,调用substr(0,4)将返回abc? 对于字符串abcç,调用substr(0,4)将返回abc? 对于字符串abcñd,调用substr(0,5)将返回abcñ 对于字符串abcçd,调用substr(0,5)将返回abcç 我注意到在这些测试中,奇怪的字符(如ñ或ç)占据了两倍的大小。但是,string::substr不应该记住这一事实,或者使用不同的编码吗?在中,没有处理不同编码的方法。您知道std::string是std:

我在这个方法中发现了一些错误,我想告诉你

  • 对于字符串
    abcñ
    ,调用
    substr(0,4)
    将返回
    abc?
  • 对于字符串
    abcç
    ,调用
    substr(0,4)
    将返回
    abc?
  • 对于字符串
    abcñd
    ,调用
    substr(0,5)
    将返回
    abcñ
  • 对于字符串
    abcçd
    ,调用
    substr(0,5)
    将返回
    abcç

  • 我注意到在这些测试中,奇怪的字符(如
    ñ
    ç
    )占据了两倍的大小。但是,
    string::substr
    不应该记住这一事实,或者使用不同的编码吗?在中,没有处理不同编码的方法。

    您知道std::string是std::basic_string,std::wstring是std::basic_string吗?此外,此链接还明确说明substr是std::basic_string类的成员,而不是std::string。那么,在使用这些奇怪字符的情况下,我应该使用wstring吗?std::string只是一个字节数组。它不是Unicode字符数组。查找一些关于编码的文档,特别是UTF-8。是的,您应该使用std::wstring,并确保告诉编译器您的文字是由宽字符组成的。相反,我建议您使用std::string和UTF-8,因为UTF-8比UCS-2()更简单、更有效。请注意不要使用substr之类的函数,因为这些函数不是字符型的,而是字节型的。您必须使用支持Unicode的函数。