PHP文档日文字符编码问题

PHP文档日文字符编码问题,php,encoding,utf-8,utf,Php,Encoding,Utf 8,Utf,我有一个文件名为:ニューヨーク・ヤンキース-チケット-200x225.jpg 我能够用我的PHP代码成功地做到这一点: if (file_exists(ABSPATH . 'ニューヨーク・ヤンキース-チケット-200x225.jpg')) { echo 'yes'; } 但是,当我使用DOMDocument解析我的内容时,返回相同的字符串,如下所示: 壛壛壛壛壛壛壛壛壛壛壛壛壛-200x225.jpg 如何使用以下代码防止这种情况发生?我们的应用程序是国际化的,因此我们需要容纳

我有一个文件名为:ニューヨーク・ヤンキース-チケット-200x225.jpg

我能够用我的PHP代码成功地做到这一点:

    if (file_exists(ABSPATH . 'ニューヨーク・ヤンキース-チケット-200x225.jpg')) {
    echo 'yes';
}
但是,当我使用DOMDocument解析我的内容时,返回相同的字符串,如下所示: 壛壛壛壛壛壛壛壛壛壛壛壛壛-200x225.jpg

如何使用以下代码防止这种情况发生?我们的应用程序是国际化的,因此我们需要容纳所有utf-8字符:

$dom = new DOMDocument();
$dom->encoding = 'utf-8';
$dom->loadHTML($content);
$images = $dom->getElementsByTagName('img');

foreach ($images as $image) {
    if( $image->hasAttribute('srcset') ) continue;
    echo $initImgSrc = $image->getAttribute('src');
    if (!preg_match('/[_-]\d+x\d+(?=\.[a-z]{3,4}$)/', $initImgSrc)) continue;

    $newImgSrc = preg_replace('/[_-]\d+x\d+(?=\.[a-z]{3,4}$)/', '', $initImgSrc);
    if (strpos($newImgSrc, '/') === 0) {
        $newImgPath = str_replace( '/wp-content', ABSPATH . 'wp-content', $newImgSrc);
    } else {
        $newImgPath = str_replace( get_home_url(), ABSPATH, $newImgSrc);
    }
    if (!file_exists($newImgPath)) continue;
    echo 'yes';
    $dom->saveXML($image);

    $oldSrc = 'src="' . $initImgSrc . '"';
    $newDataSrcSet = $initImgSrc . ' 1x, ' . $newImgSrc . ' 2x';
    $newSrcWithSrcSet = $oldSrc . ' srcset="' . $newDataSrcSet .'"';
    $content  = str_replace( $oldSrc, $newSrcWithSrcSet, $content );
}
return $content;

此代码正常工作,只是不使用日语字符。非常感谢您的帮助

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();
$profile='イリノイ州シカゴにて、アイルランド系の家庭に、9

'; $dom=新的DOMDocument(); $dom->loadHTML('.$profile); echo$dom->saveHTML();
如果您不知道字符串是否已经包含这样的声明,那么有一种解决方法可以帮助您:

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

'; $dom=新的DOMDocument(); $dom->loadHTML(mb_convert_编码($profile,'HTML-ENTITIES','UTF-8'); echo$dom->saveHTML();
这不是一个很好的解决方法,但由于不是所有字符都可以在ISO-8859-1中表示(像这些katana),因此它是最安全的替代方法


答案从这里复制:

如果你认为这个问题的答案基本上是看另一个问题(和答案),那么你应该在评论部分说这是重复的。另一个问题可能有其他答案,这在这种情况下可能也会有所帮助,因此该问题应该只是链接起来,而不是重复答案。@rkg谢谢,第一个答案是正确的:立即工作。我本以为$dom->encoding会做同样的事情,但我想那是在保存之前进行编码,而不是在声明之前。谢谢大家@奈杰伦:谢谢你的提示。我只是碰巧最近在这里很活跃,只是想帮忙。下次我会做得更好。