programing

std:: wstring VS std:: string

css3 2023. 4. 10. 22:07

std:: wstring VS std:: string

의 차이를 이해할 수 없습니다.std::string ★★★★★★★★★★★★★★★★★」std::wstring. 알고있어요wstring【유니코드】하다

  1. 로 하면 요?std::wstring에 걸쳐서std::string
  2. 수 있다std::string특수 문자를 포함한 전체 ASCII 문자 세트를 보유할 수 있습니까?
  3. 이는?std::wstringC++는요?
  4. '넓은 문자'란 정확히 무엇입니까?

string무슨 일입니까?wstring

std::string의 템플릿입니다.char , , , , 입니다.std::wstring에 탑재되어 있습니다.

char ★★wchar_t

char는 보통 8비트 문자를 포함하도록 되어 있습니다. wchar_t에는 넓은 문자가 에서는, 「Linux 」, 「Linux 」가 됩니다.wchar_t4 4 、 Windows 、 2 바바바바바 。

그럼 유니코드는 어때?

는 어느 쪽도 그렇지 않다는 이다.char 않다wchar_t유니코드

Linux에서?

Linux OS를 예로 들겠습니다.Ubuntu 시스템은 이미 Unicode를 인식하고 있습니다.char 문자열로 작업하면 기본적으로 UTF-8(즉, Unicode 문자열의 chars)로 인코딩됩니다.다음 코드:

#include <cstring>
#include <iostream>

int main()
{
    const char text[] = "olé";


    std::cout << "sizeof(char)    : " << sizeof(char) << "\n";
    std::cout << "text            : " << text << "\n";
    std::cout << "sizeof(text)    : " << sizeof(text) << "\n";
    std::cout << "strlen(text)    : " << strlen(text) << "\n";

    std::cout << "text(ordinals)  :";

    for(size_t i = 0, iMax = strlen(text); i < iMax; ++i)
    {
        unsigned char c = static_cast<unsigned_char>(text[i]);
        std::cout << " " << static_cast<unsigned int>(c);
    }

    std::cout << "\n\n";

    // - - -

    const wchar_t wtext[] = L"olé" ;

    std::cout << "sizeof(wchar_t) : " << sizeof(wchar_t) << "\n";
    //std::cout << "wtext           : " << wtext << "\n"; <- error
    std::cout << "wtext           : UNABLE TO CONVERT NATIVELY." << "\n";
    std::wcout << L"wtext           : " << wtext << "\n";

    std::cout << "sizeof(wtext)   : " << sizeof(wtext) << "\n";
    std::cout << "wcslen(wtext)   : " << wcslen(wtext) << "\n";

    std::cout << "wtext(ordinals) :";

    for(size_t i = 0, iMax = wcslen(wtext); i < iMax; ++i)
    {
        unsigned short wc = static_cast<unsigned short>(wtext[i]);
        std::cout << " " << static_cast<unsigned int>(wc);
    }

    std::cout << "\n\n";
}

는 다음 텍스트를 출력합니다.

sizeof(char)    : 1
text            : olé
sizeof(text)    : 5
strlen(text)    : 4
text(ordinals)  : 111 108 195 169

sizeof(wchar_t) : 4
wtext           : UNABLE TO CONVERT NATIVELY.
wtext           : ol�
sizeof(wtext)   : 16
wcslen(wtext)   : 3
wtext(ordinals) : 111 108 233

는 '올레'에char110, 108, 195는 169는 4번입니다.wchar_t★★★★★★★★★★★★★★★★」

해서 라, 용, 용, 용, 용, a, a, a, a, 할 때는charLinux linux를 、 Unicode 를 linux linux linux 。 ★★★★★★★★★★★★★★★.std::string와 with with with with char, (그래서)std::string유니코드라고 합니다.

:std::stringC 문자열 API와 마찬가지로 "olé" 문자열은 3자가 아닌 4자로 간주됩니다.따라서 UTF-8에서는 일부 문자 조합이 금지되어 있기 때문에 Unicode 문자를 잘라내거나 재생할 때는 주의해야 합니다.

Windows 에서는요?

Windows windows windows windows 、 릅릅릅릅릅릅릅 windows windows windows windows 。는 Win32와 하는 많은 .char유니코드가 등장하기 전에 전 세계에서 생산된 다양한 문자 집합/코드에 저장되었습니다.

그래서 이들의 솔루션은 흥미로운 것이었습니다.어플리케이션과char그 후 머신의 로컬 문자 세트/코드를 사용하여 GUI 라벨에 문자 문자열이 부호화/인쇄/표시됩니다.이러한 문자열은 오랫동안 UTF-8이 될 수 없습니다.예를 들어 프랑스어 현지화 Windows에서는 "olé"가 되지만 키릴 현지화 Windows에서는 "olé"가 다릅니다(Windows-1251을 사용하는 경우 "olé").따라서 "역사 앱"은 여전히 예전 방식으로 작동합니다.

의 애플리케이션의, 는 Unicode 를 사용합니다.wchar_tUTF-16으로 인코딩된 UTF-16은 2바이트 문자로 인코딩된 Unicode입니다(또는 적어도 UCS-2는 대리 문자가 없기 때문에 BMP 이외의 문자(>=64K)).

「」를 사용하는 char각의 문자로 구성되어 있기 때문이다char를 사용하는 에서는 s)를 사용합니다.wchar_twidechar)라고 각는 1~의 "글자"로 되어 있기 입니다).wchar_t자세한 내용은 MultiByteToWideCharWideCharToMultiByte Win32 변환 API를 참조하십시오.

따라서 Windows에서 작업하는 경우,wchar_t(GTKQT... 등, 그것을 숨기는 프레임워크를 사용하지 않는 한).사실 Windows는 이면에서wchar_t에 의해,에서도 「이력 애플리케이션」이 .char「」로 변환wchar_t와 같은 SetWindowText()(Win32 GUI API).

메모리 문제?

UTF-32는 문자당4 바이트이기 때문에 UTF-8 텍스트와 UTF-16 텍스트가 항상 UTF-32 텍스트보다 적게 사용하거나 같은 양의 메모리를 사용하는 경우(통상은 적게 사용하는 경우)에는 추가할 필요가 없습니다.

메모리의 문제가 있는 경우는, 대부분의 서양 언어보다, UTF-8 텍스트는 같은 UTF-16 텍스트보다 메모리를 적게 사용합니다.

다만, 그 외의 언어(중국어, 일본어 등)에서는, UTF-8 에 사용되는 메모리는 UTF-16 에 비해 같거나 조금 더 커집니다.

대체로 UTF-16은 문자당 2바이트, 경우에 따라서는 4바이트를 사용합니다(난해한 언어의 글리프(클링온)를 취급하지 않는 한).Elvish?)의 경우 UTF-8은 1~4바이트를 소비합니다.

상세한 것에 대하여는, https://en.wikipedia.org/wiki/UTF-8#Compared_to_UTF-16 를 참조해 주세요.

결론

  1. std:: string over std:: string을 사용해야 하는 경우

    Linux에서?거의 없습니다(§).Windows 에서는요?거의 항상(§ almost).크로스 플랫폼 코드로요?툴킷에 따라 다릅니다.

    (communications): 툴킷 또는 툴킷을 사용하지 않는 한

  2. 수 있다std::string특수문자를 포함한 모든 ASCII 문자 세트를 유지할 수 있습니까?

    A 의 : Astd::string는, 「스위치」버퍼의 보관 유지에 적합합니다.std::wstring★★★★★★★★★★★★★★★★★★!

    Linux에서?네, 윈도우에서요?Windows 사용자의 현재 로케일에 사용할 수 있는 것은 특수 문자뿐입니다.

    편집(Johann Gerell코멘트 후): astd::string 것을 할 수 char- string ( '')char255 입니다.) 0 ~ 255 ( 치 being being being ) 。 : ★★★★★★★★★★★★★★★,

    1. ASCII 부 0 、 127 、 higher higher higher ascii higher ascii ascii ascii ascii ascii ascii asciicharASCII가 .
    2. a char까지는 정확하게 에서 127까지입니다.
    3. a char ~ )에 가 지정되지만 128~255로 되어 있는 한 Unicode 할 수 (Unicode, Non-Unicode 등
  3. 이는?std::wstring일반적인 C++ 컴파일러가 거의 모두 지원합니까?

    대부분의 경우 Windows에 이식된 GCC 기반 컴파일러를 제외합니다.g++ 4.3.2 (Linux에서)로 동작하며, Visual C++ 6부터 Win32에서 Unicode API를 사용했습니다.

  4. 넓은 글자가 정확히 뭐죠?

    C/C++로 입니다.wchar_t단순한 것보다 더 큰 규모입니다.char큰 색인의 문자를 합니다.인덱스가 255(또는 127(유니코드 문자)보다 큰 문자(예: Unicode 문자)를 넣는 데 사용됩니다.

.std::wstringWindows 또는 그 외의 장소(인터페이스가 필요로 하는 경우 제외), Windows API 콜 및 구문설탕으로서의 각 부호화 변환에 근접한 경우를 제외한다.

제 견해는 http://utf8everywhere.org에 요약되어 있으며, 그 중 제가 공동저자로 있습니다.

어플리케이션이 API 콜 중심(주로 UI 어플리케이션 등)이 아닌 한 Unicode 문자열을 std::string에 저장하고 UTF-8로 인코딩하여 API 콜에 가까운 변환을 실행하는 것이 좋습니다.이 기사에서 개략적으로 설명하고 있는 이점은 특히 복잡한 어플리케이션에서 변환의 명백한 번거로움을 능가합니다.이는 멀티플랫폼과 라이브러리 개발의 경우 이중으로 해당됩니다.

이제 질문에 답해 드리겠습니다.

  1. 몇 가지 약한 이유들.와이드차어가 유니코드를 지원하는 적절한 방법이라고 믿어졌던 역사적 이유로 존재합니다.현재는 UTF-16 스트링을 선호하는 API 인터페이스로 사용되고 있습니다.이러한 API 호출 바로 근처에서만 사용합니다.
  2. 이것은 std:: 문자열과는 관계가 없습니다.어떤 인코딩을 넣든 저장할 수 있습니다.유일한 문제는 그 내용을 어떻게 다루느냐는 것입니다.저는 UTF-8을 추천하기 때문에 모든 Unicode 문자를 올바르게 유지할 수 있습니다.이것은 Linux에서는 일반적인 관행이지만, Windows 프로그램도 그렇게 해야 한다고 생각합니다.
  3. 아니요.
  4. 와이드 문자는 헷갈리는 이름입니다.유니코드 초기에는 문자를 2바이트로 인코딩할 수 있다는 믿음이 있었고, 그래서 이름이 붙여졌다.오늘날, 이것은 "2바이트 길이의 문자의 모든 부분"을 나타냅니다.UTF-16은 이러한 바이트쌍(와이드 문자라고도 함)의 시퀀스로 간주됩니다.UTF-16의 1개의 문자는 1개 또는2개의 페어를 사용합니다.

그래서 여기 있는 모든 독자들은 사실, 상황에 대해 명확하게 이해해야 한다.그렇지 않다면 Paercebal의 매우 포괄적인 답변을 읽어야 합니다. [btw: 감사합니다!]

나의 실용적 결론은 충격적일 정도로 간단하다: C++(및 STL)의 "문자 인코딩"은 모두 실질적으로 고장나 무용지물이다.Microsoft의 탓이든 아니든, 그것은 도움이 되지 않습니다.

상세한 조사 결과, 큰 좌절감과 그에 따른 경험은 다음과 같습니다.

  1. 부호화 및 변환에 대해서는 스스로 책임을 져야 한다는 것을 인정한다(그리고 그 대부분은 다소 사소한 것임을 알게 될 것이다).

  2. 을 사용합니다('UTF-8'의 std:: string'만).typedef std::string UTF8String)

  3. 이러한 UTF8String 객체가 멍청하지만 저렴한 컨테이너임을 인정합니다.그 안에 있는 문자에 직접 액세스 하거나 조작하거나 하지 말아 주세요(검색, 치환 등.할 수 있지만, 실제로는 멀티바이트 문자열에 대한 텍스트 조작 알고리즘을 작성하는 데 시간을 낭비하고 싶지 않습니다.다른 사람들이 이미 그런 바보 같은 짓을 했더라도, 그러지 마세요!내버려둬! (글쎄, 말이 되는 시나리오도 있고...)ICU 라이브러리를 사용하면 됩니다).

  4. 스트링에 을 사용합니다(UCS-2의 std:wstring).typedef std::wstring UCS2StringWIN32 API합니다(은 나중에UCS-2는 대부분의 사용자에게 충분합니다(자세한 것은 나중에...).

  5. 는 문자별 액세스(읽기, 조작 등)가 필요할 때마다 UCS2String 인스턴스를 사용합니다.문자 기반 처리는 NON-MultiByte 표현으로 수행해야 합니다.그것은 간단하고, 빠르고, 쉽다.

  6. UTF-8과 UCS-2 사이의 왕복 변환을 위해 다음 두 가지 유틸리티 기능을 추가합니다.

    UCS2String ConvertToUCS2( const UTF8String &str );
    UTF8String ConvertToUTF8( const UCS2String &str );
    

변환은 간단합니다.구글은 여기서 도움이 될 것입니다.

바로 그겁니다.메모리가 중요한 곳이나 모든 UTF-8 I/O에 UTF8String을 사용합니다.UCS2String은 문자열을 해석하거나 조작할 필요가 있는 장소에서 사용합니다.이 두 표현은 언제든지 변환할 수 있습니다.

대체안 및 개선점

  • 문자 인코딩( 문자은 플레인 테이블(ISO-8859-1 등할 수 .const wchar_t tt_iso88951[256] = {0,1,2,...};UCS2 'UCS2' 'UCS2' 'UCS2'

  • 하지 않은 UCS-2)로 합니다.typedef std::basic_string<uint32_t> UCS2String)

ICU 또는 기타 Unicode 라이브러리

고급 제품용입니다.

  1. 문자열에 와이드 문자를 저장하는 경우. wide구현에 따라 달라집니다.Visual C++는 16비트로 디폴트이며, GCC는 타겟에 따라 디폴트입니다.여기 32비트예요.wchar_t(와이드 문자 타입)는 Unicode 와는 관계가 없습니다.구현이 해당 로케일에서 지원하는 가장 큰 문자 집합의 모든 구성원을 적어도 char만큼 저장할 수 있음을 보증합니다.Unicode 문자열은 다음과 같이 저장할 수 있습니다.std::stringutf-8부호화도 가능합니다.하지만 유니코드 코드 포인트의 의미를 이해하지 못합니다. ★★★★★★★★★★★★★★★★★.str.size()문자열 내의 논리 문자의 수는 알 수 없지만 해당 문자열/wstring에 저장되어 있는 char 또는 wchar_t 요소의 양만 알 수 있습니다.따라서 gtk/glib C++ 래퍼 피플은 utf-8을 처리할 수 있는 클래스를 개발했습니다.

    wchar_t의 길이가 32비트인 경우utf-32Unicode 부호화로 고정(utf-32는 고정 길이) 부호화를 사용하여 Unicode 문자열을 저장 및 처리할 수 있습니다.이것은 당신의 끈이s.size()그러면 함수는 적절한 양의 wchar_t 요소와 논리 문자를 반환합니다.

  2. 네, char는 항상 8비트 이상입니다.즉, 모든 ASCII 값을 저장할 수 있습니다.
  3. 네, 모든 메이저 컴파일러가 지원합니다.

저는 utf-8 문자를 문제없이 유지하기 위해 std:: string을 자주 사용합니다.네이티브 스트링 타입으로 utf-8을 사용하는 API와 인터페이스 할 때도 적극 추천합니다.

예를 들어 코드를 Tcl 인터프리터와 인터페이스 할 때 utf-8을 사용합니다.

주요 경고는 std:: 문자열의 길이이며 문자열의 문자 수가 아닙니다.

좋은 질문입니다!DATA ENCODING(때로는 CHARSET도 포함)는 데이터를 파일에 저장하거나 네트워크를 통해 데이터를 전송하기 위한 메모리 표현 메커니즘이라고 생각하기 때문에 이 질문에 다음과 같이 대답합니다.

1. std:: string over std:: string은 언제 사용해야 합니까?

프로그래밍 플랫폼이나 API 함수가 단일 바이트 함수이고, 예를 들어 Windows에서 읽은 유니코드 데이터를 처리하거나 구문 분석하고자 하는 경우.REG 파일 또는 네트워크 2바이트 스트림. 쉽게 처리하려면 std::wstring 변수를 선언해야 합니다. 예: wstring ws=L' 国"(a ( 6 옥텟 메모리: 0x4E2D 0x56)FD 0x0061)에서는 ws[0]를 사용하여 문자 '''을 얻고 ws[1]를 사용하여 문자 '''을 얻고 ws[2]를 사용하여 문자 'a' 등을 얻을 수 있습니다.

2. std:: string은 특수문자를 포함한 ASCII 문자 세트 전체를 유지할 수 있습니까?

네, 하지만 주의하세요:미국 ASCII(각 0x00~0x)FF 옥텟은 "123abc&*_&"와 같은 인쇄 가능한 텍스트를 포함한 하나의 문자를 나타냅니다.특수 문자는 주로 ''로 인쇄합니다.편집자 또는 단말기를 혼동하지 마십시오.또한 일부 다른 국가에서는 자체 "ASCII" 문자 집합을 확장합니다. 예를 들어 중국어에서는 한 문자를 나타내기 위해 2 옥텟을 사용합니다.

3. std::wstring은 일반적인 모든 C++ 컴파일러에서 지원됩니까?

아마도, 혹은 대부분.사용한 적이 있다: VC++6 및 GCC 3.3, YES

4. '넓은 캐릭터'란 정확히 무엇입니까?

와이드 문자는 주로 2 옥텟 또는 4 옥텟을 사용하여 모든 국가의 문자를 포함함을 나타냅니다.2 옥텟 UCS2가 대표적인 샘플입니다.영어 'a'로, 메모리는 0x0061의 2옥텟입니다(ASCII 'a'의 메모리는 1옥텟 0x61)

  1. '와이드'(유니코드) 문자를 저장하려는 경우.
  2. 네: 255개(0개 제외)
  3. 네.
  4. 여기 소개 기사 http://www.joelonsoftware.com/articles/Unicode.html가 있습니다.

여기에는 매우 좋은 답변이 몇 가지 있지만 Windows/Visual Studio와 관련하여 추가할 수 있는 몇 가지가 있다고 생각합니다.VS2015년, VS2015년판.으로 UTF-8 된 Linux UTF-8을 합니다.std::string.Windows/VS 、 windows windows windows windows windows windows windows windows windows windows windows windows windows windows windows windows windows windows windows windows 。이유는 이렇다. 에서는, Windows 를 사용해 되어 있는 하고 있습니다.char로케일 코드 페이지를 사용하여 부호화한다.이것은 거의 항상 ASCII 문자 세트 뒤에 128개의 다른 특수 문자가 이어집니다.Windows API를 사용할 때뿐만 아니라 이들 문자열이 표준 C++와 상호작용하는 주요 장소가 3개 있습니다.리터럴로 됩니다.★★★★★★★★★★★★★★★★★★:std::cout를 사용합니다.<<을 「」에 것std::fstream.

저는 언어 전문가가 아니라 프로그래머라는 것을 앞에 내세울 것입니다.USC2와 UTF-16은 동일하지 않은 것은 감사하지만, 제 목적상 서로 교환할 수 있을 정도로 가깝기 때문에, 저는 여기서 사용하고 있습니다.실제로 어떤 Windows를 사용하는지는 모르지만, 일반적으로는 알 필요도 없습니다.이 답변에 UCS2를 언급했으므로, 이 문제에 대한 저의 무지로 인해 다른 사람을 화나게 했다면 미리 사과드리며, 잘못된 사항이 있으면 기꺼이 변경해 드리겠습니다.

스트링 리터럴

코드 페이지로 나타낼 수 있는 문자만 포함하는 문자열 리터럴을 입력하면 VS는 코드 페이지에 따라 문자당 1바이트 인코딩으로 파일에 저장합니다.코드 페이지를 변경하거나 다른 코드 페이지를 사용하여 소스를 다른 개발자에게 전달하면 (테스트를 하지 않은) 캐릭터가 달라지는 것에 주의해 주세요.다른 코드 페이지를 사용하여 컴퓨터에서 코드를 실행하면 문자도 바뀔지 모르겠습니다.

코드 페이지로 나타낼 수 없는 문자열 리터럴을 입력하면 VS는 파일을 Unicode로 저장하라는 메시지를 표시합니다.됩니다., 비 페이지에 됩니다.ASCII 는 2바이트 이상입니다.즉, 다른 사람에게 소스를 제공하면 소스가 동일하게 표시됩니다.는 모두 VS UTF-8로 됩니다.?.

앞에 Unicode를 입니다.L VSUTF-8 UCS2로 변환합니다. 다음 이을 '다보다'로 옮겨야 합니다.std::wstring하여 utf-8에 .std::string하여 코드 하고 Windows API에 수 std::string와이드 문자열 리터럴은 사용하지 않는 것이 좋습니다.

표준:: cout

를 사용하여 하는 경우<<할 수 있는 것은 「」입니다.std::string 아니라, 이에요.std::wstring텍스트는 로케일 코드 페이지를 사용하여 인코딩해야 합니다.「 」가 std::wstring 후 중 문자는 Windows 됩니다.?(기억이 안 나는데 글자를 바꿀 수 있을지도 몰라)

std:: fstream 파일명

Windows OS 에서는, 파일명에 UCS2/UTF-16 을 사용하고 있기 때문에, 코드 페이지에 관계없이, 임의의 Unicode 문자의 파일을 사용할 수 있습니다., 코드 파일을 하려면 를 해야 .std::wstring그 밖에 다른 방법이 없다.은, 「Microsoft」의 입니다.std::fstream다른 시스템에서는 컴파일 할 수 없습니다.std::string을 사용하는 경우 코드 페이지에 문자만 포함된 파일 이름만 사용할 수 있습니다.

옵션

Linux에서만 작업하고 있다면 이 정도까지는 도달하지 못했을 것입니다. UTF-8을 합니다.std::string★★★★★★ 。

작업하고 있는 는, UCS2 Windows 를 해 주세요.std::wstring. 에는 UTF8을 하고, 에 따라서한다고 하는 는 없습니다.일부 순수주의자들은 UTF8을 사용하고 필요할 때 변환한다고 말할지도 모르지만, 굳이 번거롭게 굴 필요는 없다.

만약 당신이 크로스 플랫폼이라면 솔직히 말해서 혼란스러울 것이다.Windows 상에서 UTF-8을 사용하려고 할 경우 문자열 리터럴과 콘솔 출력에 매우 주의해야 합니다.★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★♪「 」를 사용하고 std::wstring에서는 모든 에 할 수 가 있습니다.std::fstream변환은 필요하지만 파손의 위험은 없습니다.그래서 개인적으로 나는 이것이 더 나은 선택이라고 생각한다.많은 사람들이 동의하지 않지만, 저는 혼자가 아닙니다. wxWidgets xx가 。

다른 옵션은 typedef일 수 있습니다.unicodestring~하듯이std::stringLinux 및std::wstringUNI()라고 하는 매크로가 있어, Windows 에서는 L을 프리픽스 하고, Linux 에서는 아무것도 프리픽스 하지 않는 경우, 그 다음에 코드를 입력합니다.

#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;
}

어느 플랫폼에서도 괜찮을 것 같아요.

답들

질문에 답하려면

1) Windows용으로 프로그래밍을 하고 있는 경우, Windows에서 발생할 수 있는 파손 문제에 대처하거나 플랫폼 고유의 코드를 작성하고 싶은 경우를 제외하고, 플랫폼을 넘나드는 경우는 항상 그 경우가 있습니다.#ifdefsLinux를 사용하는 것만으로 해결되는 것은 아닙니다.

2) 네. Linux에서는 모든 Unicode에서도 사용할 수 있습니다.Windows 에서는, UTF-8 를 사용해 수동으로 인코딩 하는 경우에 한해, 모든 Unicode 에 사용할 수 있습니다.단, Windows API 와 표준 C++ 클래스에서는, 다음의 정보가 필요합니다.std::string로케일 코드 페이지를 사용하여 부호화됩니다.여기에는 모든 ASCII에 128자의 문자가 추가되어 있으며, 이 문자는 컴퓨터가 사용하는 코드 페이지에 따라 달라집니다.

3) 그렇게 생각합니다만, 그렇지 않은 경우는, 「std::basic_string」의 단순한 typedef에 지나지 않습니다.wchar_t대신char

4) 와이드 문자는 1바이트 규격보다 큰 문자 타입입니다.charWindows 에서는 2바이트, Linux 에서는 4바이트입니다.

  1. 국제화에 도움이 되는 ASCII뿐만 아니라 Unicode 문자열을 사용하고 싶은 경우
  2. 네, 하지만 0과 잘 어울리지 않습니다.
  3. 모르는 것은 아무것도 모른다
  4. wide character는 Unicode 문자의 고정 길이 표현을 처리하는 컴파일러 고유의 방법입니다.MSVC의 경우 2바이트 문자이고 gcc의 경우 4바이트인 것으로 알고 있습니다.http://www.joelonsoftware.com/articles/Unicode.html의 경우는 +1 입니다.

256 문자만으로 만족하지 않는 애플리케이션에는, 와이드 문자(8 비트 이상) 또는 UTF-8 와 같은 가변 길이 부호화(C++ 용어의 멀티 바이트 부호화)의 어느쪽인가를 사용할 수 있습니다.와이드 문자는 일반적으로 가변 길이 부호화보다 많은 공간을 필요로 하지만, 처리 속도가 빠릅니다.대량의 텍스트를 처리하는 다국어 애플리케이션은 일반적으로 텍스트를 처리할 때 넓은 문자를 사용하지만 디스크에 저장할 때는 UTF-8로 변환합니다.

의 유일한 차이점은string및 awstring는, 보존하는 문자의 데이터 타입입니다.문자열이 저장되다char사이즈가 8비트 이상인 것을 보증하기 위해 스트링을 사용할 수 있습니다.ASCII, ISO-8859-15 또는 UTF-8 텍스트.표준에서는 문자 집합 또는 인코딩에 대해 아무것도 언급하지 않습니다.

실제로 모든 컴파일러는 처음 128자가 ASCII에 대응하는 문자 집합을 사용합니다.이는 UTF-8 인코딩을 사용하는 컴파일러에서도 마찬가지입니다.UTF-8 또는 기타 가변 길이 인코딩에서 문자열을 사용할 때 주의해야 할 점은 인덱스와 길이가 문자가 아닌 바이트 단위로 측정된다는 것입니다.

wstring의 데이터 유형은 다음과 같습니다.wchar_t표준으로 정의되어 있지 않은 크기입니다.단, 이 사이즈는 문자 크기(통상은 16비트 또는 32비트) 이상이어야 합니다.wstring은 구현 정의 와이드 문자 인코딩에서의 텍스트 처리에 사용할 수 있습니다.표준에서는 부호화가 정의되어 있지 않기 때문에 스트링과 스트링 간의 변환은 간단하지 않습니다.wstring이 고정 길이의 부호화를 가지고 있다고 가정할 수도 없습니다.

다국어 지원이 필요하지 않은 경우 일반 문자열만 사용해도 됩니다.한편, 그래픽 애플리케이션을 작성하는 경우는, API가 와이드 문자만을 서포트하고 있는 경우가 많습니다.그리고 텍스트를 처리할 때 같은 와이드 문자를 사용하는 것이 좋습니다.UTF-16은 가변장 부호화이며, 이는 UTF-16이 Variable-Length 부호화라고 가정할 수 없음을 유념해 주십시오.length()문자 수를 반환합니다.API가 UCS-2 등의 고정 길이 인코딩을 사용하면 처리가 쉬워집니다.와이드 문자와 UTF-8 사이의 변환은 포터블한 방법으로는 어렵지만 사용자 인터페이스 API는 변환을 지원할 수 있습니다.

문자열의 휴대성을 유지할 경우 tstring, tchar를 사용할 수 있습니다.옛날부터 널리 사용되고 있는 기술입니다.이 예에서는 자체 정의 TCHAR을 사용하고 있습니다만, 인터넷에서 Linux 용 tchar.h 실장을 확인할 수 있습니다.

이는 wstring/wchar_t/UTF-16이 Windows에서 사용되고 string/char/utf-8(또는 ASCII..)이 Linux에서 사용됨을 의미합니다.

다음 예제에서는 영어/일본어 멀티바이트 혼합 문자열 검색이 Windows/Linux 플랫폼 모두에서 잘 작동합니다.

#include <locale.h>
#include <stdio.h>
#include <algorithm>
#include <string>
using namespace std;

#ifdef _WIN32
    #include <tchar.h>
#else
    #define _TCHAR char
    #define _T 
    #define _tprintf printf
#endif

#define tstring basic_string<_TCHAR>

int main() {
    setlocale(LC_ALL, "");
    tstring s = _T("abcあいうえおxyz");

    auto pos = s.find(_T("え"));
    auto r = s.substr(pos);
    _tprintf(_T("r=%s\n"), r.c_str());
}

1) Greg가 말한 바와 같이 wstring은 국제화에 도움이 됩니다.그때 영어 이외의 언어로 제품을 출시합니다.

4) 와이드 캐릭터에 대해서는, http://en.wikipedia.org/wiki/Wide_character 를 참조해 주세요.

당신은 언제 와이드 글자를 사용하지 말아야 합니까?

1990년 이전에 코드를 작성할 때.

확실히, 내가 뒤집고 있지만, 실제로 지금은 21세기이다. 127자는 이미 충분하지 않게 되었다.네, UTF8을 사용하실 수 있는데 왜 두통에 신경 쓰시나요?

언급URL : https://stackoverflow.com/questions/402283/stdwstring-vs-stdstring