首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得std::string的精确长度?

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

Stack Overflow用户
提问于 2015-07-27 11:53:52
回答 3查看 4.8K关注 0票数 2

我正在微调一个长std::string,以便使用此代码将其放入文本容器中。

代码语言:javascript
复制
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;
}

但是对于HINDI "हिन्दी"这样的其他语言,std::string的长度是错误的。

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

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-27 12:16:02

假设您使用的是UTF-8,您可以将您的字符串转换为一个简单的字符串(哈哈!)对字符进行编码和计数。我从罗塞塔科抓取了这个例子。

代码语言:javascript
复制
#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';
}
票数 8
EN

Stack Overflow用户

发布于 2015-07-27 12:08:05

std::string的长度不是“错误的”;您只是简单地误解了它的含义。std::string在您选择的编码中存储字节,而不是“字符”。它兴高采烈地对这一层一无所知。因此,std::string的长度是它包含的字节数。

要计算这些“字符”,您将需要一个库来支持对所选编码的分析,不管是什么。

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

票数 7
EN

Stack Overflow用户

发布于 2015-07-27 12:29:14

正如注释中所解释的,长度将返回以utf8编码的字符串的字节数。在这种多字节编码中,对非ascii字符进行2到6个字节的编码,这样您的utf8字符串长度就会比unicode字符的实际数量长。

解决方案1

如果您有许多长字符串,则可以将它们保存在utf8中。utf8编码使查找额外的多字节字符相对容易:它们都以二进制的10 10xxxxxx开头。因此,计算这些额外字节的数量,并从字符串长度中减去这些字节数。

代码语言:javascript
复制
cout << "Bytes: " << s.length() << endl;
cout << "Unicode length " << (s.length() - count_if(s.begin(), s.end(), [](char c)->bool { return (c & 0xC0) == 0x80; })) << endl;

解决方案2

如果需要进行更多的处理,而不仅仅是计算长度,则可以考虑使用标准库中的wstring_convert::from_bytes()将字符串转换为wstring。wstring的长度应该是您所期望的。

代码语言:javascript
复制
wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> cv;
wstring w = cv.from_bytes(s);
cout << "Unicode length " << w.length() << endl;

注意: linux上的 wstring基于32位wchar_t,其中一个宽字符可以包含所有的unicode字符集。这太完美了。然而,在windows上,wchar_t只有16位,所以有些字符可能仍然需要多字编码.幸运的是,所有的印地语字符都在从U+0000到U+D7FF的范围内,可以在一个16位字上进行编码。所以这也应该没问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31652407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档