1

我收到一个字符串,它'{'#0'S'#0'a'#0'm'#0'p'#0'l'#0'e'#0'-'#0'M'#0'e'#0's'#0's'#0'a'#0'g'#0'e'#0'}'#0在调试器中显示。

OutputDebugString我需要在调试输出 ( )中打印出来。

当我运行时OutputDebugString(PChar(mymsg)),只显示接收到的字符串的第一个字符(可能是因为#0字符串结束标记)。

如何将该字符串转换为OutputDebugString可以使用的东西?

更新 1:这是代码。我想打印变量的内容RxBufStr

procedure ReceivingThread.OnExecute(AContext : TIdContext);
var
  RxBufStr: String;
begin    
  with AContext.Connection.IOHandler do
  begin
    CheckForDataOnSource(10);
    if not InputBufferIsEmpty then
    begin
      RxBufStr := InputBuffer.Extract();
    end;
  end;
end;
4

2 回答 2

5

您在问题中显示的数据看起来像 UTF-16 编码数据而不是 UTF-8。但是,由于您使用的是支持 Unicode 的 Delphi 和一种string数据类型,显然存在编码不匹配的问题。如果您明白我的意思,您的字符串变量似乎是双 UTF-16 编码的!

因此,InputBuffer.Extract假设数据是使用 ANSI 或 UTF-8 传输的。换句话说,8 位编码。但实际上数据是以 UTF-16 传输的。

要解决此问题,您需要将缓冲区的读取与缓冲区的传输对齐。您需要确保双方使用相同的编码。UTF-8 将是一个不错的选择。

如果缓冲区中的数据是 UTF-16,那么您可以使用

RxBufStr := InputBuffer.Extract(-1, TIdTextEncoding.Unicode);

如果您切换到 UTF-8,则使用

RxBufStr := InputBuffer.Extract(-1, TIdTextEncoding.UTF8);
于 2012-11-13T11:11:34.607 回答
0

RxBufStr := InputBuffer.Extract();

该代码没有指定终止符或数据大小,因此客户端可能仅接收到发送数据的一部分。

您可以将具有给定(已知)长度的数据读取到 TIdBytes 数组中,然后使用正确的编码将其转换为字符串。

一种方法是

TEncoding.Unicode.GetString( MyByteArray );

(在这里找到)

于 2012-11-13T11:46:16.483 回答