【问题标题】:delphi xe6 No mapping for the Unicode character exists in the target multi-byte code pagedelphi xe6 目标多字节代码页中不存在 Unicode 字符的映射
【发布时间】:2014-11-21 12:57:31
【问题描述】:

以下代码适用于 Win32,无论如何,如果在 Android 或 iOS 上运行,它会引发异常。例外是:“目标多字节代码页中不存在 Unicode 字符的映射”

function GetURLAsString(aURL: string): string;
    var
      lHTTP: TIdHTTP;
      lStream: TStringstream;

    begin
      lHTTP := TIdHTTP.Create(nil);
      lStream := TStringstream.Create(result);//create('',EEncoding.utf8),not work
      try

        lHTTP.Get(aURL, lStream);
        lStream.Position := 0;
        result := lStream.readstring(lStream.Size);//error here
      finally
        FreeAndNil(lHTTP);
        FreeAndNil(lStream);
      end;
    end;

【问题讨论】:

  • 这里没有问题,请澄清。移动平台仅处理 UTF-16 unicode 字符串。
  • @LURD Indy 能够在移动平台上转换为 UTF-16(由操作系统特定的转换 API 支持)
  • 注意:TIdHTTP.Create(nil) 可以缩写为 TIdHTTP.Create
  • @mjn,正如 Remy 所说,TStringStream 不能胜任这里的工作。

标签: android ios delphi unicode indy


【解决方案1】:

TStringStream 不适合这种情况。它要求您在其构造函数中指定编码。如果您不这样做,它会改用操作系统默认编码。在 Windows 上,该默认设置是特定于运行应用程序的用户帐户的区域设置。在移动设备上,默认值为 UTF-8。

HTTP 可以使用任意数量的字符集传输文本。如果数据与TStringStream 使用的编码不匹配,您将遇到解码问题。

TIdHTTP 知道接收到的数据的字符集,可以为你解码成 Delphi string,例如:

function GetURLAsString(aURL: string): string;
var
  lHTTP: TIdHTTP;
begin
  lHTTP := TIdHTTP.Create(nil);
  try
    Result := lHTTP.Get(aURL);
  finally
    FreeAndNil(lHTTP);
  end;
end;

【讨论】:

  • 我用这个,没有抛出异常,但是有些字符不能显示,用stringstream可以在win32上显示,
  • 您使用的是 Unicode 版本的 Delphi。无论您在什么操作系统上运行,Delphi string 始终在所有平台上使用 UTF-16,TIdHTTP 知道如何根据报告的源数据字符集在所有平台上将数据解码为 UTF-16 .如果您在显示字符时遇到问题,则可能是源数据使用与报告不同的字符集进行编码,使用 Indy 或操作系统不支持的字符集进行编码,或者您根本没有正确显示字符串。
  • 如果在 Windows 上使用默认编码的 TStringStream 时数据显示 OK,但在 Android 上不显示 OK,最可能的原因是传输的数据使用 Latin1 (ISO-8859 -1) 或类似的字符集,但 HTTP 回复未报告这一点。 TIdHTTP 会将原始字节直接保存到TStringStream 中,然后使用自己的默认编码对字节进行解码,在 Windows 上是 8 位 Ansi,但在移动设备上是 UTF-8。使用我上面给你的代码,HTTP 回复的字符集很重要,所以它必须准确,否则数据将无法正确解码。
  • 这样一来,HTTP 服务器就有责任报告正确的字符集。如果您提供您正在下载的实际 URL,我可以告诉您它是否正确报告了字符集。如果是,那么我可以在 Indy 的解码逻辑中查找错误(假设您使用的是最新的 Indy 版本)。如果不是,则需要在服务器端解决。
  • 服务器是PHP脚本,使用'json_encode'和'urldecode',urldecode错误在这里?,问题应该在这里,我试试。非常感谢。
猜你喜欢
  • 2014-08-30
  • 1970-01-01
  • 2017-03-21
  • 2013-08-14
  • 2014-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-13
相关资源
最近更新 更多