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

sending Unicode string via winsock in c++

本文关键字:Unicode 字符串 发送 winsock c++ 中的 通过      更新时间:2023-10-16

我改变了下面的代码发送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;
}

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

这段代码的问题如下:
  1. length = strlen(txt); -计算终止于零的宽字符串长度的函数是wcslen。对于小端UTF16字符串(即WIN32平台上的宽字符串),如果第一个宽字符是ASCII(或Latin1)字符,则strlen返回1(因为第二个字节是第一个宽字符的高字节,并且对于ASCII字符它包含零)。

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

  3. 当然,你不应该做一些事情,比如发送特定于平台/编译器的内部二进制宽字符串表示。您应该使用一些文档完备的网络协议(如telnet或HTTP等),其中大多数使用ASCII或UTF-8字符编码进行文本表示。因此,您应该将您的宽字符串转换为您选择的协议所要求的表示形式。