PHP DOMDocument loadHTML 未正确编码 UTF-8

2024-04-05

我正在尝试使用 DOMDocument 解析一些 HTML,但是当我这样做时,我突然丢失了我的编码(至少在我看来是这样)。

$profile = "<div><p>various japanese characters</p></div>";
$dom = new DOMDocument();
$dom->loadHTML($profile); 

$divs = $dom->getElementsByTagName('div');

foreach ($divs as $div) {
    echo $dom->saveHTML($div);
}

这段代码的结果是我得到了一堆非日语字符。但是,如果我这样做:

echo $profile;

它显示正确。我尝试过 saveHTML 和 saveXML,但都无法正确显示。我正在使用 PHP 5.3。

我所看到的:

ã¤ãªãã¤å·ã·ã«ã´ã«ã¦ãã¢ã¤ã«ã©ã³ãç³»ã®å®¶åº­ã«ã9人åå¼ã®5çªç®ã¨ãã¦çã¾ãããå½¼ãå«ãã¦4人ã俳åªã«ãªã£ããç¶è¦ªã¯æ¨æã®ã»ã¼ã«ã¹ãã³ã§ãæ¯è¦ªã¯éµä¾¿å±ã®å®¢å®¤ä¿ã ã£ããé«æ ¡æ代ã¯ã­ã£ãã£ã®ã¢ã«ãã¤ãã«å¤ãã¿ãæè²è³éãåããªããã«ããªãã¯ç³»ã®é«æ ¡ã¸é²å­¦ã

应该显示什么:

イリノイ州シカゴにて、アイルランド系の家庭に、9人兄弟の5番目として生まれる。彼を含めて4人が俳優になった。父親は木材のセールスマンで、母親は郵便局の客室係だった。高校時代はキャディのアルバイトに勤しみ、教育資金を受けながらカトリック系の高校へ進学

编辑:我已将代码简化为五行,以便您可以自己测试。

$profile = "<div lang=ja><p>イリノイ州シカゴにて、アイルランド系の家庭に、</p></div>";
$dom = new DOMDocument();
$dom->loadHTML($profile);
echo $dom->saveHTML();
echo $profile;

这是返回的 html:

<div lang="ja"><p>イリノイ州シカゴã«ã¦ã€ã‚¢ã‚¤ãƒ«ãƒ©ãƒ³ãƒ‰ç³»ã®å®¶åº­ã«ã€</p></div>
<div lang="ja"><p>イリノイ州シカゴにて、アイルランド系の家庭に、</p></div>

DOMDocument::loadHTML除非您另有说明,否则会将您的字符串视为 ISO-8859-1(HTTP/1.1 默认字符集)。这会导致 UTF-8 字符串被错误解释。

DOMDocument 使用 HTML4 解析器。如果您正在加载 HTML5,您可能需要查看替代解决方案 https://stackoverflow.com/questions/10712503/how-to-make-html5-work-with-domdocument.

如果您正在处理 (X)HTML 的简单片段,则可以在前面添加 XML 编码声明或元字符集声明,以使字符串被视为 UTF-8:

$profile = '<p>イリノイ州シカゴにて、アイルランド系の家庭に、9</p>';
$dom = new DOMDocument();

$dom->loadHTML('<?xml encoding="utf-8" ?>' . $profile);
echo $dom->saveHTML();

$dom->loadHTML('<meta charset="utf8">' . $profile);
echo $dom->saveHTML();

// The above versions will HTML-encode high-ASCII bytes.
// This version preserves the original characters
$contentType = '<meta http-equiv="Content-Type" content="text/html; charset=utf-8">';
$dom->loadHTML($contentType . $profile);
echo $dom->saveHTML();

如果您无法知道 HTML 是否已包含声明,可以使用以下解决方法智能DOM文档 http://beerpla.net/projects/smartdomdocument-a-smarter-php-domdocument-class/这应该可以帮助你:

$profile = '<p>イリノイ州シカゴにて、アイルランド系の家庭に、9</p>';
$dom = new DOMDocument();
$dom->loadHTML(mb_convert_encoding($profile, 'HTML-ENTITIES', 'UTF-8'));
echo $dom->saveHTML();

在 PHP 8.2+ 中,您将收到弃用警告,因此替代方案是:

$profile = '<p>イリノイ州シカゴにて、アイルランド系の家庭に、9</p>';
$dom = new DOMDocument();
$dom->loadHTML(mb_encode_numericentity($profile, [0x80, 0x10FFFF, 0, ~0], 'UTF-8'));
echo $dom->saveHTML();

(为了更好地解释这个相当神秘的数组,请参阅here https://stackoverflow.com/questions/35854535/better-explanation-of-convmap-in-mb-encode-numericentity.)

这不是一个很好的解决方法,但由于并非所有字符都可以用 ISO-8859-1 表示(例如这些武士刀),因此它是最安全的替代方案。

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

PHP DOMDocument loadHTML 未正确编码 UTF-8 的相关文章

  • 防止隐藏的输入被更改

    这一直让我压力很大 我有一个隐藏的输入
  • 如何用php检测浏览器是否是firefox? [复制]

    这个问题在这里已经有答案了 可能的重复 有没有php代码可以检测浏览器的版本和操作系统 https stackoverflow com questions 2142030 any php code to detect the browser
  • 如何在 Laravel 中基于 application/json 标头加载路由

    我正在使用application json标头来控制我的控制器在收到请求时的行为 我需要在单元测试中的 POST 中包含application json header 我试过了 public function testStore this
  • 从 Yii2 中的联结表检索数据

    我试图从 Yii2 中的连接表获取数据无需额外查询 我有 2 个模型 用户 组 通过连接表 user group 关联 在 user group 表中 我想存储此关系的额外数据 管理标志 将数据添加到连接表的最佳方法是什么 link 方法接
  • 如何在php中正确显示另一种语言的mysql表数据

    我有一个 mySQL 表 其中一列中的数据采用英语以外的语言 波斯语 当我在表中输入数据时 它会正确显示 但是当我想在 php 文件中显示数据时 它会显示如下 好吧 我应该怎么做才能以正确的形式显示数据 由于我经常使用 非英语 字符 因此要
  • 如何从 m3u 字符串中检索变量=“值”对

    我有 m3u 文件 其中包含类似示例的行 EXTINF 0 ExtFilter Viva group title Variedades tvg logo logo Viva png tvg name Viva 我在 PHP 中运行此命令但没
  • PHP ASCII 表库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有一个事实上的标准库用于在 PHP 中创建 ASCII 表 我想要一些 PHP 代码 当传递数组或其
  • 通过 PHP 检测 excel .xlsx 文件 mimetype

    我无法通过 PHP 检测 xlsx Excel 文件的 mimetype 因为它是 zip 存档 文件实用程序 file file xlsx file xlsx Zip archive data at least v2 0 to extra
  • PHP curl exec 在 php 脚本相同域上失败

    我使用 php curl 从同一域 url 中的 php 脚本获取内容 但我收到curl exec 错误 curl 错误代码为 28 或操作超时 经过几天的调试 我发现它可以在 htm 等非脚本页面上工作 但不能在 php 上工作 如果 u
  • ZipArchives 存储绝对路径

    我可以使用相对路径压缩文件吗 例如 zip gt addFile c wamp www foo file txt ZIP 应该具有如下目录结构 foo gt file txt and not wamp gt www gt foo gt fi
  • PHPMailer:如何将 Content-Type 设置为 multipart/alternative

    我正在使用 phpmailer 发送电子邮件 但消息的标题中带有 Content Type text html 我怎样才能将其更改为多部分 替代 它应该类似于 mail gt 我的配置是 mail new PHPMailer mail gt
  • 不使用 PHP 提交联系表单

    我还是一名学生 今天我们的讲师告诉我们 无需使用 mailto 函数即可提交联系我们表单的唯一方法是使用 PHP 我发誓去年另一位讲师向我们展示了一种仅使用 javascript 的方法 是否可以使用基本表单和 javascript 提交反
  • Powershell XMLDocument保存为无BOM的UTF-8

    我构建了一个 System Xml XmlDocument 类型的 XML 对象 scheme gettype IsPublic IsSerial Name BaseType True False XmlDocument System Xm
  • 我需要一个 jQuery Autocomplete 使用 ajax 返回 id 和 name 的示例

    我需要一个示例 说明如何编写 jQuery 自动完成代码来填充product id 同时显示调用ajax 页面 remote php 的product name
  • MYSQL:SQL查询获取自增字段的值

    我有一张桌子 主键是id及其自动递增 现在 当我插入新记录时 我需要获取更新记录的 id 我怎样才能做到这一点 如果我使用查询 select max id from table name 执行后我可以获得id 但我能确定它是刚刚插入的记录的
  • 增加内存限制时出现奇怪的错误

    我使用的是共享托管环境 PHP 的默认内存限制是 32M 我在 Concrete5 设置方面遇到一些问题 当我尝试登录 Concrete5 的管理面板时 出现内存限制错误Allowed memory size of 33554432 byt
  • 使用 Apache 允许 Glassfish 和 PHP 在同一服务器中协同工作

    是否可以建立从 Java 到 php 文件的桥梁 我有一个用 Java 编写的应用程序 我需要执行http piwik org http piwik org 这是用 PHP 编写的 在服务器中 我正在运行 PHP 但无法从浏览器访问 php
  • 将字符串分解为标记,保持引用的子字符串完整

    我不知道我在哪里看到它 但是谁能告诉我如何使用 php 和 regex 来完成这个任务 this is a string that has quoted text inside 我希望能够像这样爆炸它 0 this 1 is 2 a 3 s
  • node-mongodb-native的插入性能

    我正在使用 MongoDB 测试 Node js 的性能 我知道其中每一个都很好 彼此独立 但我正在尝试一些测试来感受它们 我遇到了这个问题 但无法确定来源 问题 我正在尝试在单个 Node js 程序中插入 1 000 000 条记录 它
  • 以 UTF8 而不是 UTF16 输出 DataTable XML

    我有一个 DataTable 我正在使用 WriteXML 创建一个 XML 文件 尽管我在以 UTF 16 编码导出它时遇到问题 并且似乎没有明显的方法来更改它 我了解 NET 在字符串内部使用 UTF 16 这是正确的吗 然后 我通过

随机推荐

  • GetSystemMetrics 和 TScreen 返回错误值

    我使用的是德尔福XE5 我认为我的笔记本电脑有问题 一段时间后 它向 Screen Width 和 GetSystemMetrics SM CXSCREEN 返回错误的值 高度相同 我的操作系统是 Windows 7 64 位 我的笔记本电
  • 以编程方式将证书安装到 Mozilla 中

    有没有办法以编程方式将证书安装到 mozilla 中 我们正在尝试编写所有内容的脚本来消除环境偏差 因此通过 mozilla 首选项手动安装它无法满足我们的需求 我认为有一种方法可以使用 certutil 来做到这一点 但我不确定 Mozi
  • 如何存储类内函数之间使用的 cookie jar?

    我想听听您关于如何有效存储 cookie 的建议 这些 cookie 将在类中由其他函数使用 我当前的代码如下所示 class SomeClass def init self username password self logged in
  • 不同长度的数组到一个 CSV

    如果您有多个不同长度的数组 如何将它们导出到 powershell 中的单个 csv 中 Array1 1 2 3 Array2 Bob smithy Alex Jeremy Array3 yes no 输出 CSV Number Name
  • Visual Studio 2008 中的“if 语句”之类的垂直线?

    是否有插件或设置可以添加垂直线来链接 Visual Studio 2008 中的 if 语句 之类的内容 Thanks 来自 DevExpress 的 CodeRush http www devexpress com Products Vi
  • AppStore 提交被拒绝 - 应用程序不允许使用 UDID

    我正在尝试将应用程序上传到 AppStore 但上传后我收到此错误 您的应用程序包含非公共 API 使用 请检查错误并更正它们 然后重新提交您的应用 应用程序不允许使用UDID 也不能使用UIDevice的唯一标识方式 请更新您的应用程序的
  • Python 数据结构开销/性能

    在 Python 中使用列表比使用字典和元组有任何性能优势吗 如果我正在优化速度 是否有任何理由选择其中一种而不是另一种 Rich 列表和字典是适合不同需求的野兽 确保您不使用列表进行线性搜索 其中字典哈希是完美的 因为它的速度要慢得多 另
  • 使用 .resx 文件和卫星程序集是否有性能差异?

    在构建本地化的 aspx Web 应用程序 卫星程序集的 resx 文件 时 哪种方法是最好的前进方式 网络上是否有任何可用的性能比较 嗯 不知道这样的比较是否有效 ResX 是一种以 XML 形式存储资源的存储格式 在嵌入 如果指定 到程
  • 使用 numpy 保存列表时内存不足

    我有一个相当大的列表 代表搜狗文本分类数据集中的标记 我可以处理 450 000 的整个训练集 并剩下 12 GB 的内存 但是当我在列表列表上调用 numpy save 时 内存使用量似乎增加了一倍 并且内存不足 为什么是这样 numpy
  • 在预构建的 docker 容器中更改用户的 uid (jenkins)

    我是 docker 的新手 所以如果这是我遗漏的一个相当明显的过程 我确实为前面的愚蠢问题道歉 我正在使用以下命令设置持续集成服务器jenkins泊坞窗图像 我做了一个docker pull jenkins 并创建了一个用户jenkins让
  • 浏览器中的图像缓存 - app-engine-patch 应用程序

    我在浏览器中为应用程序引擎应用程序缓存图像时遇到一些问题 我正在发送上次修改 过期和缓存控制标头 但每次都会从服务器加载图像 这是代码的标题部分 响应 内容类型 图像 jpg 响应 上次修改 current time strftime a
  • 如何将 Google Sheet 中的日期转换为字符串

    我想弄清楚如何将日期转换为谷歌表中的字符串 我有一个具有不同格式的日期字段 我想创建另一个与字面意思相同但作为文本的列 例如 如果我有以下数据 date date as string 12 05 2016 12 05 2016 12 5 2
  • 转储文件分析

    Recently I start facing issue on few servers where CPU start consuming more resources than usual trend I am trying to fi
  • VB.Net:如何在CEF中安装插件/扩展?

    我正在制作一个 vb net 网络浏览器 以及我正在使用的浏览引擎ChromeWebBrowser Net https sourceforge net projects chromewebbrowse source recommended
  • 在Windows操作系统中隐藏C程序的控制台

    我想在运行应用程序时隐藏我的 C 控制台 如何让我的应用程序在后台运行 程序与main 默认情况下编译为 SUBSYSTEM CONSOLE 应用程序并获取控制台窗口 如果您拥有应用程序正在启动的其他进程 则可以通过以下方法之一将它们修改为
  • 这些诸如 TFS 之类的多文档图标是什么意思?

    有谁知道 TFS 2017 源代码管理资源管理器中这些图标的含义是什么 文件是 cpp和 h 新添加的两个文件的图标显示正确 如下所示 但现有文件都变成了多黄色文档 为什么它替换了图标对于文件类型 图标最初加载正确 但在分析后似乎发生了变化
  • Codeigniter 文件路径

    抱歉打扰 但我对 codeigniter 中的文件路径有些困惑 因为您可能知道也可能不知道 CI 的文件系统布局如下 application controllers views models system contains CI frame
  • 从本地 apache 服务器发送邮件

    我想从我的 PHP Web 应用程序发送电子邮件 我知道这是可能的 因为几个月前 我的系统上有这个 功能 然后我开始使用 xampp 并且该功能消失了 我想 当我回到本地服务器并使用本地 MySQL 数据库和像以前一样的东西时 我可以再次从
  • phpexcel在单元格范围上设置数据类型

    With PHPExcel http phpexcel codeplex com 我在用着 workSheet gt fromArray array 设置我的数据 但是 需要将一列设置为字符串 带有前导零的数字 如果不设置为字符串 前导零将
  • PHP DOMDocument loadHTML 未正确编码 UTF-8

    我正在尝试使用 DOMDocument 解析一些 HTML 但是当我这样做时 我突然丢失了我的编码 至少在我看来是这样 profile div p various japanese characters p div dom new DOMD