C++ std::wstring与std::string
我无法理解C++ std::wstring与std::string,c++,string,unicode,c++-faq,wstring,C++,String,Unicode,C++ Faq,Wstring,我无法理解std::string和std::wstring之间的区别。我知道wstring支持Unicode字符等宽字符。我有以下问题: 什么时候我应该在std::string上使用std::string std::string能否保存整个ASCII字符集,包括特殊字符 >代码> STD::WSCONT/由所有流行的C++编译器支持 什么是“宽字符” 当您要存储“宽”(Unicode)字符时 是:其中255个(不包括0个) 对 以下是一篇介绍性文章: 当您想使用Unicode字符串而不仅仅是a
std::string
和std::wstring
之间的区别。我知道wstring
支持Unicode字符等宽字符。我有以下问题:
std::string
上使用std::string
std::string
能否保存整个ASCII字符集,包括特殊字符我经常使用std::string来保存utf-8字符,一点问题都没有。我衷心建议在与使用utf-8作为本机字符串类型的API接口时这样做 例如,当我的代码与Tcl解释器接口时,我使用utf-8 主要的警告是std::string的长度,不再是字符串中的字符数
utf-8
编码将unicode字符串精细地存储到std::string
中。但它无法理解unicode代码点的含义。因此,str.size()
不会给出字符串中逻辑字符的数量,而只是该字符串/wstring中存储的char或wchar\t元素的数量。为此,GTK/GLUBC++包装器开发了一个可以处理UTF-8的类。p>
如果wchar\u t的长度为32位,则可以使用utf-32
作为unicode编码,并且可以使用固定(utf-32是固定长度)编码存储和处理unicode字符串。这意味着您的wstring的s.size()
函数将返回适量的wchar\t元素和逻辑字符字符串
<代码>wstring?
std::string
是在char
和std::wstring
上的模板
char
vs.wchar\t
char
应该包含一个字符,通常是一个8位字符。wchar\u t
应该包含一个宽字符,然后事情就变得棘手了:在Linux上,
wchar\u t
是4个字节,而在Windows上是2个字节
那么呢?
问题在于char
和wchar\u t
都没有直接绑定到unicode
在Linux上?
让我们看一个Linux操作系统:我的Ubuntu系统已经支持unicode。当我使用字符字符串时,它是本机编码的(即字符的Unicode字符串)。以下代码:
#include <cstring>
#include <iostream>
int main(int argc, char* argv[])
{
const char text[] = "olé" ;
std::cout << "sizeof(char) : " << sizeof(char) << std::endl ;
std::cout << "text : " << text << std::endl ;
std::cout << "sizeof(text) : " << sizeof(text) << std::endl ;
std::cout << "strlen(text) : " << strlen(text) << std::endl ;
std::cout << "text(ordinals) :" ;
for(size_t i = 0, iMax = strlen(text); i < iMax; ++i)
{
std::cout << " " << static_cast<unsigned int>(
static_cast<unsigned char>(text[i])
);
}
std::cout << std::endl << std::endl ;
// - - -
const wchar_t wtext[] = L"olé" ;
std::cout << "sizeof(wchar_t) : " << sizeof(wchar_t) << std::endl ;
//std::cout << "wtext : " << wtext << std::endl ; <- error
std::cout << "wtext : UNABLE TO CONVERT NATIVELY." << std::endl ;
std::wcout << L"wtext : " << wtext << std::endl;
std::cout << "sizeof(wtext) : " << sizeof(wtext) << std::endl ;
std::cout << "wcslen(wtext) : " << wcslen(wtext) << std::endl ;
std::cout << "wtext(ordinals) :" ;
for(size_t i = 0, iMax = wcslen(wtext); i < iMax; ++i)
{
std::cout << " " << static_cast<unsigned int>(
static_cast<unsigned short>(wtext[i])
);
}
std::cout << std::endl << std::endl ;
return 0;
}
您将看到char
中的“olé”文本实际上由四个字符构成:110、108、195和169(不包括尾随的零)。(我将让您学习wchar\t
代码作为练习)
因此,在Linux上使用char
时,通常应该在不知道的情况下使用Unicode。由于std::string
与char
一起工作,因此std::string
已经可以使用unicode了
<> >注意<代码> STD::String ,如C字符串API,将考虑“OLE”字符串有4个字符,而不是三个字符。因此,在截断/使用unicode字符时应该谨慎,因为UTF-8中禁止某些字符组合
在窗户上?
在Windows上,这有点不同。在Unicode出现之前,Win32必须支持大量使用char
的应用程序,并支持世界各地生产的各种应用程序
因此,他们的解决方案很有趣:如果应用程序使用char
,则使用机器上的本地字符集/代码页对字符字符串进行编码/打印/显示在GUI标签上。例如,“olé”在法语本地化的窗口中是“olé”,但在西里尔语本地化的窗口中是不同的(“ol l”,如果您使用)。因此,“历史应用程序”通常仍会以旧方式工作
对于基于Unicode的应用程序,Windows使用wchar\u t
,宽度为2字节,编码方式为,Unicode编码方式为2字节字符(或者至少是最兼容的UCS-2,与IIRC几乎相同)
使用char
的应用程序称为“多字节”(因为每个字形由一个或多个char
组成),而使用wchar\u t
的应用程序称为“widechar”(因为每个字形由一个或两个wchar\u t
组成)。有关详细信息,请参阅和Win32转换API
因此,如果您在Windows上工作,非常希望使用wchar\u t
(除非您使用一个框架来隐藏它,如或…)
UCS2String ConvertToUCS2( const UTF8String &str );
UTF8String ConvertToUTF8( const UCS2String &str );
#include <fstream>
#include <string>
#include <iostream>
#include <Windows.h>
#ifdef _WIN32
typedef std::wstring unicodestring;
#define UNI(text) L ## text
std::string formatForConsole(const unicodestring &str)
{
std::string result;
//Call WideCharToMultiByte to do the conversion
return result;
}
#else
typedef std::string unicodestring;
#define UNI(text) text
std::string formatForConsole(const unicodestring &str)
{
return str;
}
#endif
int main()
{
unicodestring fileName(UNI("fileName"));
std::ofstream fout;
fout.open(fileName);
std::cout << formatForConsole(fileName) << std::endl;
return 0;
}