我收到一个字符串,在调试器中显示为'{'#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;
答案 0 :(得分: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);
答案 1 :(得分:0)
使用
RxBufStr := InputBuffer.Extract();
代码没有指定终结符或数据大小,因此客户端可能只接收部分已发送数据。
您可以将具有给定(已知)长度的数据读入TIdBytes数组,然后使用正确的编码将其转换为字符串。
一种方法是
TEncoding.Unicode.GetString( MyByteArray );
(找到here)