Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::wstring与std::string_C++_String_Unicode_C++ Faq_Wstring - Fatal编程技术网

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::WSCONT/<代码>由所有流行的C++编译器支持
  • 什么是“宽字符”
  • 当您要存储“宽”(Unicode)字符时
  • 是:其中255个(不包括0个)
  • 以下是一篇介绍性文章:
  • 当您想使用Unicode字符串而不仅仅是ascii时,这对国际化很有帮助
  • 是的,但它与0不兼容
  • 不知道有什么不知道的
  • 宽字符是特定于编译器的处理unicode字符固定长度表示的方法,对于MSVC它是2字节字符,对于gcc我理解它是4字节。a+1表示
  • 1) 正如Greg所提到的,wstring有助于国际化,那时您将以英语以外的语言发布产品

    4) 检查这个宽字符

    我经常使用std::string来保存utf-8字符,一点问题都没有。我衷心建议在与使用utf-8作为本机字符串类型的API接口时这样做

    例如,当我的代码与Tcl解释器接口时,我使用utf-8

    主要的警告是std::string的长度,不再是字符串中的字符数


  • 当您希望在字符串中存储宽字符时<代码>宽度取决于实现。如果我正确记得,Visual C++默认为16位,而GCC默认取决于目标。这里有32位长。请注意wchar_t(宽字符类型)与unicode无关。它只是保证它可以存储实现所支持的最大字符集的所有成员(至少与char一样长)。您也可以使用
    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元素和逻辑字符

  • 是的,char的长度始终至少为8位,这意味着它可以存储所有ASCII值
  • 是的,所有主要的编译器都支持它
  • 字符串
    <代码>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;
    }