我试图用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;

它显示正确.我try 了saveHTML和saveXML,但都没有正确显示.我使用的是PHP5.3.

我看到:

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

应显示的内容:

イリノイ州シカゴにて、アイルランド系の家庭に、9人sibling の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字符串被错误地解释.

如果字符串不包含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中表示(像这些katana),因此它是最安全的 Select .

Php相关问答推荐

Laravel 10查询中的多个where子句

Postgrid Webhook不叫laravel

Laravel中的通配符Undot数组

PHP FFI—Convert void * to int

如何在WordPress中为特定自定义帖子类型自定义URL struct

我需要多个SELECT语句的结果(使用由php ECHO创建的表中显示的Limit(X)

Htaccess-重写对&api.php";的API请求以及对";web.php";的其他请求

在特定订单状态更改时自定义WooCommerce订单发货项目

在WooCommerce中添加特定产品类型的百分比费用和固定费用

Laravel Carbon DiffForHumans选项(年,月,天)

拉威尔10有许多通过获取所有祖父母数据的子元素S图像

为什么PHP PDO忽略NOT NULL约束?

为WooCommerce中存储一些数据的购物车项目添加复选框

根据WooCommerce的定制订单状态增加产品库存

如何在laravel中获得两个时间戳之间的小时和分钟差异

奇怪的 preg_match_all() 行为

从插件更改主题功能,function_exists 不起作用

正则表达式将文本替换为标签 html 以字符开头

通过存储库检索 Blade 上的单值数据 出错

CodeIgniter 4中嵌套过滤器组不起作用