当前位置: 首页 > 面试题库 >

PHP DOMDocument loadHTML无法正确编码UTF-8

丁均
2023-03-14
问题内容

我正在尝试使用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中的字符串。这导致UTF-8字符串被错误地解释。

如果您的字符串不包含XML编码声明,则可以在前面加上一个,以使该字符串被视为UTF-8:

$profile = '<p>イリノイ州シカゴにて、アイルランド系の家庭に、9</p>';
$dom = new DOMDocument();
$dom->loadHTML('<?xml encoding="utf-8" ?>' . $profile);
echo $dom->saveHTML();

如果您不知道该字符串是否已经包含这样的声明,则SmartDOMDocument中提供了一种变通方法,它可以帮助您:

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

这不是一个很好的解决方法,但是由于并非所有字符都可以用ISO-8859-1表示(就像这些武士刀一样),所以这是最安全的选择。



 类似资料:
  • 我正在评估与thymeleaf模板引擎的Spring启动。我正面临UTF8字符表单张贴问题。 对于最简单的post示例: 在控制器中: 在本例中,Spring MVC(或thymeleaf)无法正确编码具有UTF-8字符的表单。 如果我输入,我将看到以下日志: 应编码为。正文应该是,但我不知道为什么它会变成,并被解码成错误的字符。 我在谷歌上搜索并找到了一些解决方案,比如添加一个编码过滤器: 但不

  • 我正在处理一个位置数据集,其中一些位置名称使用本地字符。大多数字符都被正确地看到,但我对一些罗马尼亚字符有意见,比如“ș”。 我尝试改变我的Windows 10 64位系统区域设置使用UTF-8编码,但这并没有解决问题。 可以在此处找到用于测试的示例文件:https://drive.google.com/file/d/1T7QQQ7G_dA_rXD9Ewf51uuQ6CUkscjP_/view?u

  • 我真的被Eclipselink MOXy 2.5.1卡住了,没有给我提供正确编码的亚洲字符(或其他字符,例如:德语umLautsäöü)。 我的代码: 测试类如下所示: 属性"key"仅为测试目的初始化一个字符串,我从一个UTF-8编码的文件中读取,该文件没有包含BOM 当我通过客户端调用这两种资源时: 我得到以下结果: 奇怪的是,当我在/test2中编组测试对象的toString()方法时,它将

  • 我下载了cratedb的源代码,但无法正确编译,下面是详细说明:jdk:1.8 /workspace/crate编译 应该是elasticsearch包不见了,下一步怎么办? 谢谢!

  • 我想正确打印unicode(比如希腊字符),但我有问题。例如: 问题是是否有任何解决方案可以正确打印所有卡哈拉特。我认为对于希腊字符,UTF-16是可以的。

  • 因此,我最近开始使用ffmpeg下载实时流媒体视频,但我面临的问题是,下载的视频会阻塞很多,特别是对于长视频(如2小时)而言。 我当前用于下载流文件的命令:- ffmpeg-i"https://link. m3u8"-c复制output.mkv 此命令在35分钟长的视频中运行良好[没有任何卡滞问题],但在2小时长的视频中失败 当我试图使用x264 lib命令编码2小时长的视频时,它还显示了“无效长