如何获得std :: string的准确长度?

Har*_*oon 1 c++ string std

我正在std::string使用此代码修剪一个long 以使其适合文本容器.

std::string AppDelegate::getTrimmedStringWithRange(std::string text, int range)
{
    if (text.length() > range)
    {
        std::string str(text,0,range-3);
        return str.append("...");
    }
    return text;
}
Run Code Online (Sandbox Code Playgroud)

但在其他语言的情况下,如HINDI "??????"长度std::string是错误的.

我的问题是如何在所有测试用例中检索std :: string的准确长度.

谢谢

Lig*_*ica 7

长度std::string不是"错误的"; 你只是误解了它的含义.一个std::string店字节,在你选择的编码不是"字符".它兴高采烈地不了解那一层.因此,长度std::string是它包含的字节数.

要计算这样的"字符",您需要一个支持分析所选编码的库,无论它是什么.

只有当您选择的编码与ASCII兼容时,您才能计算字节并完成它.


Fer*_*cio 6

假设您使用的是UTF-8,您可以将字符串转换为简单的(hah!)Unicode并计算字符数.我从rosettacode中抓住了这个例子.

#include <iostream>
#include <codecvt>
int main()
{
    std::string utf8 = "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b"; // U+007a, U+00df, U+6c34, U+1d10b
    std::cout << "Byte length: " << utf8.size() << '\n';
    std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> conv;
    std::cout << "Character length: " << conv.from_bytes(utf8).size() << '\n';
}
Run Code Online (Sandbox Code Playgroud)

  • 这将产生Unicode代码点中字符串的长度,但它不会产生字符串的显示大小,因为某些Unicode字符的长度为零(特别是组合像变音符号这样的字符),而其他Unicode字符在固定宽度控制台上的长度为2.(如果输出不是固定宽度的字体,那么情况就明显不同了.)在Posix中,你可以使用`wcswidth`,但这可能适用于C++,也可能不适用. (5认同)