C++子串多字节字符

W. *_*man 4 c++ character-encoding wstring

我有这个std :: string,其中包含一些跨越多个字节的字符.

当我对此字符串执行子字符串时,输出无效,因为当然,这些字符计为2个字符.在我看来,我应该使用wstring,因为它将这些字符存储为一个元素而不是更多.

所以我决定将字符串复制到wstring中,但是当然这没有意义,因为字符仍然分为2个字符.这只会让情况变得更糟.

将字符串转换为wstring有一个很好的解决方案,将特殊字符合并为1个元素而不是2个元素.

谢谢

eug*_*ene 6

更简单的版本.基于提供的解决方案获取UTF-8编码的std :: string的实际长度?作者Marcelo Cantos

std::string substr(std::string originalString, int maxLength)
{
    std::string resultString = originalString;

    int len = 0;
    int byteCount = 0;

    const char* aStr = originalString.c_str();

    while(*aStr)
    {
        if( (*aStr & 0xc0) != 0x80 )
            len += 1;

        if(len>maxLength)
        {
            resultString = resultString.substr(0, byteCount);
            break;
        }
        byteCount++;
        aStr++;
    }

    return resultString;
}
Run Code Online (Sandbox Code Playgroud)


Fre*_*abe 5

一个std::string对象不是字符的字符串,它是字节的字符串.它根本没有所谓的" 编码 "的概念.同样如此std::wstring,除了它是一个16位值的字符串.

为了对您的文本执行需要处理不同字符的操作(例如,当您想要获取子字符串时),您需要知道std :: string对象使用了什么编码.

更新:既然您澄清了输入字符串是UTF-8编码,您仍然需要决定用于输出的编码std::wstring.我想到了UTF-16,但它实际上取决于您将传递std::wstring对象所期望的API .假设UTF-16可以接受,您有多种选择:

  1. 在Windows上,您可以使用该MultiByteToWideChar功能; 不需要额外的依赖.
  2. UTF8-CPP库自称为处理UTF-*编码字符串提供了一个轻量级的解决方案.从来没有尝试过,但我一直听到它的好消息.
  3. 在Linux系统上,使用libiconv库非常常见.
  4. 如果你需要处理各种疯狂的编码,并且想要编码完整的alpha-and-omega字,请看ICU.

  • `std :: wstring`是`wchar_t`的字符串,_may_是16位,_或32位. (2认同)