通过c++中的winsock发送Unicode字符串
sending Unicode string via winsock in c++
我改变了下面的代码发送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
这样的东西。只有原始二进制数据——字节序列。
length = strlen(txt);
-计算终止于零的宽字符串长度的函数是wcslen
。对于小端UTF16字符串(即WIN32平台上的宽字符串),如果第一个宽字符是ASCII(或Latin1)字符,则strlen
返回1(因为第二个字节是第一个宽字符的高字节,并且对于ASCII字符它包含零)。nWrite = send( desc, txt + iStart, nBlock, 0 )
Yousend
BYTES而不是字符(特别是宽字符)。因此,如果您想要发送宽字符串的二进制表示(这是不可移植的,因此不应该通过网络发送,但如果客户端和服务器在同一平台上,则可以工作),您必须这样做:nWrite = send( desc, txt + iStart, sizeof(wchar_t)*nBlock, 0 )
。当你像这样发送时,你只发送了宽弦的一半。当然,连接另一端的应用程序应该知道发送的是特定平台的宽字符串的二进制表示(而不是ASCII字符串或其他东西)。当然,你不应该做一些事情,比如发送特定于平台/编译器的内部二进制宽字符串表示。您应该使用一些文档完备的网络协议(如telnet或HTTP等),其中大多数使用ASCII或UTF-8字符编码进行文本表示。因此,您应该将您的宽字符串转换为您选择的协议所要求的表示形式。
- 如何将unicode字符串从C++传递到delphi
- 将 unicode 字符串与 c ++ 符号进行比较?
- C++:Unicode 字符串文字的可移植性
- 如何使用 CTypes 将 wchar_t** - 以空结尾的 UNICODE 字符串数组 - 返回到 Python 脚
- Xamarin Android:在 C++ 中将字符串从 C# 封送到 Unicode 字符串的正确方法是什么?
- 如何在 python 包装中使用 unicode 字符串用于带有 cython 的 c++ 类?
- 如何使用poco :: logger记录Unicode字符串
- 如何将 Unicode 字符串连接成字符串以传递到 mysql 调用中
- Unicode字符串Visual C 构造函数
- 如何将 (ICU4C) Unicode 字符串逐个字符复制到另一个 Unicode 字符串
- 如何从Windows中的进程中读取Unicode字符串
- 如何在Visual C 中的BSTR和32位Unicode字符串之间进行转换
- C 编译器如何从UTF8源文件中生成Unicode字符串文字
- 如何检测终端中的unicode字符串宽度
- 如何在字符级别操作Unicode字符串
- 获取Crypto++中Unicode字符串的SHA1
- 将 unicode 字符串转换为字符串
- c++Unicode字符串与易混淆字符的比较.例如(U 0054)应为==(U03A4)等
- 如何在带L(或不带L)的变量中传递unicode字符串
- C++中的Unicode字符串处理