POST 响应的 TIdHTTP 字符编码

2023-11-23

采取以下情况:

procedure Test;

var
 Response : String;

begin
 Response := IdHttp.Post(MyUrL, AStream);
 DoSomethingWith(Response);
end;

现在网络服务器以 UTF-8 格式返回我的数据。 假设它返回一些包含该字符的 UTF-8 XMLé。 如果我使用变量 Response 它不包含这个字符,但它是 UTF-8 变体(#C3#A9),所以 Indy 没有解码?

现在我知道如何解决这个问题:

procedure Test;

var
 Response : String;

begin
 Response := UTF8ToString(IdHttp.Post(MyUrL, AStream));
 DoSomethingWith(Response);
end;

此解决方案的一个警告:Delphi 发出警告 W1058(隐式字符串转换,可能导致从“string”到“RawByteString”的数据丢失)

我的问题:这是处理这个问题的正确方法吗?或者我可以指示 TIdHTTP 为我转换为 UnicodeString 吗?


如果您使用的是 Indy 10 的最新版本,则重载版本TIdHTTP.Post()返回一个String does将数据解码为 Unicode,但是用于解码的实际字符集取决于 HTTP 的媒体类型Content-Type响应头指定:

  1. 如果媒体类型是application/xml, application/xml-external-parsed-entity, application/xml-dtd,或者不是一个text/...类型但结尾为+xml,然后指定的字符集encoding使用 XML 序言的属性。如果未指定字符集,则使用 UTF-8。

  2. 否则,如果Content-Type响应头指定一个字符集,然后使用它。

  3. 否则,如果媒体类型是text/...输入,然后:

    A。如果媒体类型是text/xml, text/xml-external-parsed-entity,或以+xml, then us-ascii用来。

    b.否则ISO-8859-1用来。

  4. 否则,使用 Indy 的默认编码(默认为 ASCII)。

没有看到实际的 HTTPContent-Typeheader,很难知道你的情况属于哪种情况。听起来它落入 #2 或 #3b,这将说明按原样返回 UTF-8 字节值,如果ISO-8859-1或正在使用类似的字符集。

UTF8ToString()需要 UTF-8 编码RawByteString作为输入,但您传递的是 UTF-16 编码UnicodeString反而。在这种情况下,RTL 将执行 UTF16->Ansi 转换,并使用默认的 Ansi 字符集进行转换。这就是您收到编译器警告的原因,因为此类转换可能会丢失数据。

XML 实际上是一种二进制数据格式,受字符集编码的约束。 XML 解析器需要知道 XML 的编码是什么,并能够相应地解析原始编码字节。这就是为什么 XML 有一个显式的encoding属性位于 XML 序言中。然而,当TIdHTTP下载 XML 作为String,虽然它会自动将其解码为 Unicode,但它does not但相应地更新 XML 的序言。

真正的解决方案是不要将 XML 下载为String首先。将其下载为TStream反而 (TMemoryStream是一个更好的选择TStringStream)这样你的 XML 解析器就可以访问原始字节、原始字符集声明等。你可以传递TStream to the TXMLDocument.LoadFromStream()方法,例如。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

POST 响应的 TIdHTTP 字符编码 的相关文章

  • 闪亮的本地部署错误:输入字符串 1 无效 UTF-8

    我很惊讶地发现一个突然的错误 我的 ShinyApp 停止工作并出现未知错误 提示 输入字符串 1 无效 UTF 8 即使在昨天 该应用程序也可以正常运行 但是突然停止了 下面是我运行时的错误描述runApp gt runApp Liste
  • UTF-8、PHP 和 XML Mysql

    我在解决这个问题时遇到了很大的问题 我有一个编码 latin1 swedish ci 的 mysql 数据库和一个存储名称和地址的表 我正在尝试输出 UTF 8 XML 文件 但在使用以下字符串时遇到问题 Otiv gen它被输出为Otiv
  • delphi定时器比定时器服务中断例程更快

    大家好 我被要求为某人维护一个基于 Delphi 5 的程序 该程序使用一个计时器对象每 50 毫秒计时一次 并且在每次计时结束时运行单线程代码块 我只是想知道 如果执行这段代码所花费的时间比计时器滴答间隔长 会发生什么 这会很糟糕吗 例如
  • 如何更改 Chromium 组件的默认背景颜色?

    I use TChromium http code google com p delphichromiumembedded 我分配AWebPageAsString这是一个带有灰色背景颜色的静态 HTML 页面 FBrowser TChrom
  • PHP 中的 JS charCodeAt 等效项(具有完整的 unicode 和 emoji 兼容性)

    我在 JS 中有一个简单的代码 如果涉及特殊字符 我无法在 PHP 中复制它 这是 JS 代码 参见JSFiddle https jsfiddle net h8oca3qg 5 用于输出 var str t char t and speci
  • 如何更新Delphi对象检查器?

    继我最近发布的这个问题之后 组件编辑器可以在多个组件上执行吗 https stackoverflow com questions 14802371 can a component editor be executed on multiple
  • R 中带有变音符号的字符列表

    我试图将字符串中的电话 字符 出现次数制成表格 但变音符号单独作为字符制成表格 理想情况下 我有一个国际音标的单词列表 其中包含大量变音符号以及它们与基本字符的几种组合 我在这里给出了仅包含一个单词的 MWE 但对于单词列表和更多类型的组合
  • $(印度卢比符号)符号打印为? (问号)使用 Apache PDFBOX 生成 pdf

    我正在尝试在使用 apache pdfbox 创建的 pdf 文件中写入一个字符串 我使用 ISO 8859 1 作为 UTF 8 编码 但它仍然在打印问号 尝试了很多并在互联网上寻找解决方案 StackOverflow 有人可以帮忙吗 提
  • 如何添加资源并使用它们

    在我的应用程序中 我想添加 2 个图像作为资源 我想使用这些图像 当我在应用程序中单击 是 按钮时 第一张图像将被设置为壁纸 当我在应用程序中单击 否 按钮时 第二张图像将被设置为桌面壁纸 提前致谢 regards 最简单的方法是创建一个文
  • 是否有匹配单个字素簇的正则表达式?

    字素是用户感知的文本字符 在 unicode 中可能由多个代码点组成 From Unicode 标准附录 29 http unicode org reports tr29 Grapheme Cluster Boundaries 重要的是要认
  • ColdFusion cfmail 主题行中的特殊字符

    邮件主题行中的特殊字符将转换为问号或方框 我尝试将主题行的动态字符串包装在 URLEncodedFormat 中 但最终徒劳无功
  • DOMDocument 对我的字符串做了什么?

    dom new DOMDocument 1 0 UTF 8 str p Hello p var dump mb detect encoding str dom gt loadHTML str var dump dom gt saveHTML
  • 将以utf-8字符串为内容的unicode转换为str

    我正在使用 pyquery 来解析页面 dom PyQuery http zh wikipedia org w index php title CSS printable yes variant zh cn content dom mw c
  • 我可以在“Delphi 2007 for Win32”中使用.NET DLL吗?

    是否可以在 Delphi 2007 for Win32 中使用 NET DLL 我尝试以与 ActiveX 组件相同的方式导入 DLL 但它似乎不起作用 组件菜单 gt 导入组件 gt 导入 NET 程序集 是否可能 如果可以 步骤是什么
  • 获取 TransactSql 批处理中的语句数计数

    对于不使用 Delphi 的读者 虽然以下内容是根据 Delphi 编码来表达的 但我的实际技术问题不是特定于 Delphi 的 而是关于如何找出 Sql Server 如何 理解 TransactSql 批处理提交给它 TAdoQuery
  • Python中的Url解码UTF-8

    在 Python 2 7 中 给定一个类似的 URLexample com title D0 BF D1 80 D0 B0 D0 B2 D0 BE D0 B2 D0 B0 D1 8F D0 B7 D0 B0 D1 89 D0 B8 D1 8
  • Indy 的 TIdHTTPProxyServer:如何过滤请求?

    我正在使用 TIdHTTPProxyServer 来实现一个简单的 HTTP 代理 但我现在想阻止一些与某些 URL 匹配的连接 哪个事件和 或组件最适合实现这一目标 Indy 文档并没有太多解释 Thanks 作为基本过滤器 您可以使用
  • 向 UITextView 添加换行符

    我有一个UITextView这需要一个NSString带格式stringWithUTF8String 它从数据库获取其值 我希望数据库中的文本在文本中带有中断的情况下呈现 我尝试使用 n执行此操作 但它会呈现为文本 在应用程序的信息页面中以
  • 运行delphi客户端自动化程序后excel.exe保持加载状态的原因是什么?

    我编写了一个 Delphi 程序 该程序从单个 XLS 文件的多个不同电子表格中提取数据并将其合并到文本文件中以供以后处理 这是德尔福7console程序 最相关的代码片段的摘录将向您表明 显然 我的程序表现得相当好 或者至少达到了它需要的
  • 开源 Delphi 包可使用哪些项目选项?

    我写了一些 Delphi 代码 想在 GitHub 上分享 所有代码都根据需要包含在运行时和设计时包中 每个项目有许多项目选项需要设置 输出目录 搜索路径 编译选项等 我设法找到了一些适合我的情况的默认选项 但阅读此处的其他问答很明显有多个

随机推荐

  • 在 Eclipse 中选择远程系统类型列表为空

    我想在 Eclipse Luna 中进行交叉编译 Windows gt Linux 但是当我想在远程系统视图中添加连接时列表为空 我已经在 Eclipse 中安装了最新的 RSE 也许我错过了一个我还不知道的重要点 这就是为什么它是空的 有
  • 如何使用 Rhino Mocks 来模拟 HttpContext.Application

    我是 Mocking 框架的新手 并开始使用 RhinoMocks 来协助我的 MVC 应用程序单元测试 我在用着Scott Hanselmanns MVC 模拟助手协助模拟 HttpContext 我已经成功地 一段时间后 模拟了一些我需
  • 在 Rails 中,如何使用视图呈现 JSON?

    假设您在 users 控制器中 并且想要获取 show 请求的 json 响应 如果您可以在 views users 目录中创建一个名为 show json 并在 users show 之后的文件 那就太好了操作完成 它呈现文件 目前您需要
  • css中direction和text-align的区别

    两者有什么区别 方向 右转 文本对齐 右对齐 相关this问题 方向从右到左对元素进行排序 Example div div style display inline block A div div style display inline
  • 处理与 R 的数据库交互中的字段类型

    我使用 RMySQL 和 MySQL 数据库来存储我的数据集 有时数据会被修改 或者我也会将结果存储回数据库 长话短说 在我的用例中 R 和数据库之间有相当多的交互 大多数时候我使用方便的功能 例如dbWriteTable and dbRe
  • 将 2 个静态库链接到 1 个 iOS 静态库

    我在 Xcode 中创建了两个单独的静态库 用于在 iOS 上使用 A 和 B A 使用 B 中定义的方法 当创建需要 A 和 B 的新 Xcode 项目时 我可以分别包含它们 然而 为了简化集成 我更喜欢创建一个包含 A 和 B 的通用框
  • “错误:请求‘a’中的成员‘size’,它是指针类型”,但我不认为它是一个指针

    所以 我以为我正在尝试做一些简单的事情 但显然不是 我编写了这个函数 以便以后可以扩展它 并在需要时通过以下方式快速为用户提供菜单menu mystrings int menu string a int choice 0 cout lt l
  • Java 13 SE 规范不需要缓存装箱的 Byte 对象吗?

    阅读JAVA 13 SE规范 我发现在第5章 第5 1 7节 拳击转换有以下保证 如果被装箱的值 p 是计算常数的结果 boolean char short int 或 long 类型的表达式 15 28 以及 结果为 true false
  • 调试 R 中未由包导出的函数

    我想逐步使用debug or trace 未导出的函数 例如 我该如何做vcov polr包装的MASS 从函数中调用polr polr已导出 但 vcov polr 未导出 也就是说 当我跑步时polr 我希望调试浏览器在代码输入后启动v
  • 生成低位深度的图像文件?

    bpp 每像素位数 因此 32bpp 意味着 R G B A 为 8 8 8 8 就像 NET 有一个枚举 System Drawing Imaging PixelFormat 现在一旦我有一个Bitmap or Image对象与我的图形
  • 如何在WPF中绑定逆布尔属性?

    我所拥有的是一个具有IsReadOnly财产 如果这个属性为真 我想设置IsEnabledButton 上的属性 例如 设置为 false 我愿意相信我可以像IsEnabled Binding Path IsReadOnly 但这不适用于
  • NodeJS readdir 并需要相对路径

    假设我有这个目录结构 Project node modules SomeModule bar js config file json foo js foo js require bar bar js fs readdir config re
  • 清单合并失败错误

    我正在将当前项目的大型应用程序迁移到 Android Studio 和 Gradle 中 我目前陷入以下问题 Error 87 9 Execution failed for task App processDebugManifest gt
  • pip:根据包名称选择索引url?

    我创建了一个本地私有包存储库 按照惯例 所有这些包都以识别前缀命名 例如 foo package 这些包可能依赖于 PyPi 上可用的公共包 我们假设 PyPi 中不存在同名包的风险 通过使用 index url和 一起 extra ind
  • Java 代码未正确更新

    这可能看起来很奇怪 我用 Java 编写了代码 在 Eclipse 中 然后 我对代码做了一些修改 现在 我尝试运行新代码 修改后 但它仍然为我提供之前代码的输出 我在代码中放置了几个调试点 但它跳过了一些调试点 尽管它应该在它们处停止 并
  • 如何将 RFC-1123 日期时间格式化程序转换为本地时间

    我正在获取日期时间Thu 25 Aug 2016 08 59 00 GMT在这个RFC 1123在我的 Android 应用程序中格式化 我需要转换为当地时间 DateTimeFormatter RFC 1123 DATE TIME jav
  • 从 sockaddr * 转换为 sockaddr_in * 增加了所需的对齐方式

    当我使用一些看起来像这样的代码时 编译器会产生此警告 for p res p NULL p p gt ai next void addr std string ipVer IPv0 if p gt ai family AF INET ipV
  • 关于 Rails 中的演示者模式。有更好的方法吗?

    我的模型中有 def presenter presenter ProfilePresenter new self presenter end ProfilePresenter 是一个类 它具有 get link get img url si
  • Mysql - “选择类似”不使用索引

    我一直在研究MySQL 5 5 24 WinXP 上的索引 但我找不到服务器在运行时不使用一个索引的原因 LIKE用来 例子是这样的 我创建了一个测试表 create table testTable id varchar 50 primar
  • POST 响应的 TIdHTTP 字符编码

    采取以下情况 procedure Test var Response String begin Response IdHttp Post MyUrL AStream DoSomethingWith Response end 现在网络服务器以