在c++中通过winsock发送Unicode字符串

Sad*_*deh 3 c++ unicode winsock send

我更改了以下用于将 Unicode 字符串发送到客户端的代码。

请检查并告诉我为什么在客户端中当 txt 包含 Unicode 字符时我无法接收任何数据?

bool write_to_descriptor( int desc, wchar_t *txt, int length )
//bool write_to_descriptor( int desc, char *txt, int length )
{
    int iStart;
    int nWrite;
    int nBlock;

    if ( length <= 0 )
    length = strlen(txt);

    for ( iStart = 0; iStart < length; iStart += nWrite )
    {
    nBlock = UMIN( length - iStart, 4096 );
    if ( ( nWrite = send( desc, txt + iStart, nBlock, 0 ) ) < 0 )
        { perror( "Write_to_descriptor" ); return FALSE; }
    }

    return TRUE;
}
Run Code Online (Sandbox Code Playgroud)

Ser*_*ich 5

对于 TCP(和 UDP)协议来说,不存在wchar_t. 对于函数send来说,不存在诸如 之类的东西wchar_t。只有原始的二进制数据——字节序列。

这段代码存在的问题如下:

  1. length = strlen(txt);- 计算以零结尾的宽字符串长度的函数是wcslen。对于little-endian UTF16字符串(即WIN32平台上的宽字符串),如果第一个宽字符是ASCII(或Latin1)字符则strlen返回1(因为第二个字节是第一个宽字符的高字节,对于ASCII字符它包含零)。

  2. nWrite = send( desc, txt + iStart, nBlock, 0 )你的send 字节不是字符(尤其是宽字符)。因此,如果您想发送宽字符串的二进制表示形式(不可移植,因此不应通过网络发送,但如果客户端和服务器位于同一平台上则可以工作),您必须这样做nWrite = send( desc, txt + iStart, sizeof(wchar_t)*nBlock, 0 ):当你像这样发送时,你只发送了宽字符串的一半。当然,连接另一端的应用程序应该知道发送了特定平台的宽字符串的二进制表示形式(而不是 ASCII 字符串或其他内容)。

  3. 当然,您永远不应该执行诸如发送特定于平台/编译器的内部二进制宽字符串表示之类的操作。您应该使用一些记录良好的网络协议(例如 telnet 或 HTTP 或其他协议),其中大多数使用 ASCII 或 UTF-8 字符编码来表示文本。因此,您应该将宽字符串转换为您选择的协议所需的表示形式。