【问题标题】:Sending TCHAR buffer with send(sock, wszBuffer, ...)?使用 send(sock, wszBuffer, ...) 发送 TCHAR 缓冲区?
【发布时间】:2011-04-03 02:35:46
【问题描述】:

我有一条宽字符 XML 消息,需要通过 C++ 中的 Win32 套接字发送。

TCHAR wszBuffer[1024];

在发送之前我应该​​将宽字符缓冲区sprintf(szSendBuffer, "%S", wszBuffer) 发送到char 数组吗?

发送这个的正确方法是什么?

【问题讨论】:

  • @dreamlax:C++ 中的 Win32 套接字。固定问题。

标签: c++ sockets send widestring tchar


【解决方案1】:

您可以简单地将其转换为 char*。另一方面,您可以简单地将接收到的缓冲区转换为 wchar_t*。

【讨论】:

  • sizeof 始终以字节为单位,而不是元素的计数,因此您显示的表达式是错误的。
【解决方案2】:

将 wszBuffer 直接传递给套接字函数,将其转换为 char*,长度 = sizeof(wszBuffer),或 1024 * sizeof(TCHAR)。在这种情况下,缓冲区将按原样发送。

如果您想将此文本作为 ANSI 字符串发送,请通过任何字符串转换函数对其进行转换。 sprintf 还可以,另一种方式是 W2A。但有些信息可能会丢失。

【讨论】:

  • 我不控制接收端,它是一个Java TCP服务器。如果我简单地转换它,这不会影响其流读取并解析为 XML 的字符吗?
  • 如果接收方需要 ANSI 字符串,则需要将其转换为 ANSI。如果接收者需要 Unicode 字符串,只需将其作为字节流发送。当然,两端必须相同。
【解决方案3】:

由于您正在处理 XML,因此您需要在通过套接字发送之前将其编码为 UTF-8 或其他 XML 友好的字符编码(并在 XML 的序言中指定该编码)。

【讨论】:

    【解决方案4】:

    使用 WideCharToMultiByte 将其转换为 UTF-8(或任何其他基于 char 的编码,只要您在 XML 文件中声明即可)。

    【讨论】:

      猜你喜欢
      • 2012-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 2014-12-11
      • 1970-01-01
      相关资源
      最近更新 更多