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

时间:2011-11-07 21:35:40

标签: 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;
}

1 个答案:

答案 0 :(得分:4)

对于TCP(和UDP)协议,没有wchar_t这样的东西。对于函数send,没有wchar_t这样的东西。只有原始二进制数据 - 字节序列。

此代码的问题如下:

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

  2. nWrite = send( desc, txt + iStart, nBlock, 0 )send BYTES 不是字符(尤其不是宽字符)。因此,如果你想发送宽字符串的二进制表示(不是可移植的,因此不应该通过网络发送,但如果客户端和服务器在同一平台上则可以工作),你必须这样做:{{1} }。当你发送它时,你只发送一半的宽字符串。当然,连接另一端的应用程序应该知道发送特定平台的宽字符串的二进制表示(不是ASCII字符串或其他东西)。

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