W. *_*man 4 c++ character-encoding wstring
我有这个std :: string,其中包含一些跨越多个字节的字符.
当我对此字符串执行子字符串时,输出无效,因为当然,这些字符计为2个字符.在我看来,我应该使用wstring,因为它将这些字符存储为一个元素而不是更多.
所以我决定将字符串复制到wstring中,但是当然这没有意义,因为字符仍然分为2个字符.这只会让情况变得更糟.
将字符串转换为wstring有一个很好的解决方案,将特殊字符合并为1个元素而不是2个元素.
谢谢
更简单的版本.基于提供的解决方案获取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)
一个std::string对象不是字符的字符串,它是字节的字符串.它根本没有所谓的" 编码 "的概念.同样如此std::wstring,除了它是一个16位值的字符串.
为了对您的文本执行需要处理不同字符的操作(例如,当您想要获取子字符串时),您需要知道std :: string对象使用了什么编码.
更新:既然您澄清了输入字符串是UTF-8编码,您仍然需要决定用于输出的编码std::wstring.我想到了UTF-16,但它实际上取决于您将传递std::wstring对象所期望的API .假设UTF-16可以接受,您有多种选择:
MultiByteToWideChar功能; 不需要额外的依赖.