如何在Delphi 2009中将UTF-8字符串转换为PChar

时间:2012-11-13 10:40:22

标签: delphi encoding utf-8 delphi-2009

我收到一个字符串,在调试器中显示为'{'#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;

2 个答案:

答案 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