Unicode char到wstring

时间:2015-07-04 03:20:06

标签: c++ unicode char wstring

我试图将C#字符串发送到C ++ wstring数据和副本。 (通过TCP)。

我成功地从C#发送了字符串数据(如Unicode,UTF-16),并通过char数组将其转换为C ++。

但我不知道如何将char数组转换为wstring。

这就是c ++获得" abcd"用utf-16

    [0] 97 'a'  char
    [1] 0 '\0'  char
    [2] 98 'b'  char
    [3] 0 '\0'  char
    [4] 99 'c'  char
    [5] 0 '\0'  char
    [6] 100 'd' char
    [7] 0 '\0'  char

这就是c ++获得"한글"用utf-16

    [0] 92 '\\' char
    [1] -43 '?' char
    [2] 0 '\0'  char
    [3] -82 '?' char

这就是当c ++获得"日本语"时的样子。用utf-16

    [0] -27 '?' char
    [1] 101 'e' char
    [2] 44 ','  char
    [3] 103 'g' char
    [4] -98 '?' char
    [5] -118 '?'char

由于UTF-8不支持所有日文字符,我试图通过UTF-16(基本上使用C#字符串)获取数据。 但我没有通过使用我找到的每种方式将这些char数组转换为wstring。

这是我之前尝试过的事情

std::wstring_convert<std::codecvt_utf16<wchar_t>> myconv 
 -> what wchar have to have
        [0] 54620 '한'   wchar_t
        [1] 44544 '글'   wchar_t
 ->What it have after using this 
    [0] 23765 '峕'   wchar_t
    [1] 174 '®' wchar_t

/

std::wstring wsTmp(s.begin(), s.end()); 

 -> what wchar have to have
            [0] 54620 '한'   wchar_t
            [1] 44544 '글'   wchar_t

->What it have after using this 
        [0] 92 '\\' wchar_t
        [1] 65493 'ᅰ'   wchar_t
        [2] 0 '\0'  wchar_t
        [3] 65454 'ᆴ'   wchar_t

在这两个中,我将数组的char更改为字符串并将其更改为wstring 那失败了......

有没有人知道如何将非英语UTF-16字符数据转换为wstring数据?

添加:C#侧码

byte[] sendBuffer = Encoding.Unicode.GetBytes(Console.ReadLine());
clientSocket.Send(sendBuffer);

它会转换&#39;한글&#39;像

这样的字节
    [0] 92  byte
    [1] 213 byte
    [2] 0   byte
    [3] 174 byte

1 个答案:

答案 0 :(得分:0)

  

我尝试将C#字符串数据发送到C ++ wstring数据和副本。 (通过TCP)

     

我成功地从C#发送字符串数据(如Unicode,UTF-16),并通过char数组在C ++中获取。

使用UTF-8而不是UTF-16传输数据会更好,更便携。

  

但我不知道如何将char数组转换为wstring。

wchar_t为16位的平台上,例如Windows(我认为您正在使用C#),您可以将char数组内容原样直接复制到{ {1}},例如:

std::wstring

如果您需要支持char *buffer = ...; int buflen = ...; std::wstring wstr(reinterpret_cast<wchar_t*>(buffer), buflen / sizeof(wchar_t)); 为32位的平台,则可以使用wchar_t

std::wstring_convert

由于char *buffer = ...; int buflen = ...; std::wstring_convert<std::codecvt_utf16<wchar_t>, wchar_t> conv; std::wstring wstr = conv.from_bytes(std::string(buffer, buflen)); // or: // std::wstring wstr = conv.from_bytes(buffer, buffer+buflen); 不是非常便携,所以请考虑使用wchar_t / std::u16string代替(如果您使用的是支持C ++ 11或更高版本的编译器),那么是专门为UTF-16数据设计的。

  

由于UTF-8不支持所有日文字符

是的,确实如此。 Unicode是实际的字符集,UTF只是用于将Unicode代码点表示为字节序列的编码。 所有 UTF(UTF-7,UTF-8,UTF-16和UTF-32)支持整个 Unicode字符集,而UTF旨在允许丢失 - 从一个UTF到另一个UTF的转换率较低。