Estou tentando analisar um pouco de HTML usando DOMDocument, mas quando o faço, de repente perco minha codificação (pelo menos é assim que me parece).
$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);
}
O resultado desse código é que recebo vários caracteres que não são japoneses. No entanto, se eu fizer:
echo $profile;
é exibido corretamente. Eu tentei saveHTML e saveXML, e nenhum é exibido corretamente. Estou usando o PHP 5.3.
O que eu vejo:
ã¤ãªãã¤å·ã·ã«ã´ã«ã¦ãã¢ã¤ã«ã©ã³ãç³»ã®å®¶åºã«ã9人åå¼ã®5çªç®ã¨ãã¦çã¾ãããå½¼ãå«ãã¦4人ã俳åªã«ãªã£ããç¶è¦ªã¯æ¨æã®ã»ã¼ã«ã¹ãã³ã§ãæ¯è¦ªã¯éµä¾¿å±ã®å®¢å®¤ä¿ã ã£ããé«æ ¡æ代ã¯ãã£ãã£ã®ã¢ã«ãã¤ãã«å¤ãã¿ãæè²è³éãåããªããã«ããªãã¯ç³»ã®é«æ ¡ã¸é²å¦ã
O que deve ser mostrado:
イリノイ州シカゴにて、アイルランド系の家庭に、9人兄弟の5番目として生まれる。彼を含めて4人が俳優になった。父親は木材のセールスマンで、母親は郵便局の客室係だった。高校時代はキャディのアルバイトに勤しみ、教育資金を受けながらカトリック系の高校へ進学
Edição: simplifiquei o código para cinco linhas, para que você possa testá-lo.
$profile = "<div lang=ja><p>イリノイ州シカゴにて、アイルランド系の家庭に、</p></div>";
$dom = new DOMDocument();
$dom->loadHTML($profile);
echo $dom->saveHTML();
echo $profile;
Aqui está o html retornado:
<div lang="ja"><p>イリノイ州シカゴã«ã¦ã€ã‚¢ã‚¤ãƒ«ãƒ©ãƒ³ãƒ‰ç³»ã®å®¶åºã«ã€</p></div>
<div lang="ja"><p>イリノイ州シカゴにて、アイルランド系の家庭に、</p></div>
php
utf-8
character-encoding
Um pouco A.
fonte
fonte
Respostas:
DOMDocument::loadHTML
tratará sua corda como estando na ISO-8859-1, a menos que você diga o contrário. Isso resulta em seqüências de caracteres UTF-8 sendo interpretadas incorretamente.Se a sua sequência não contiver uma declaração de codificação XML, você pode acrescentar uma para fazer com que a sequência seja tratada como UTF-8:
Se você não pode saber se a sequência já conterá essa declaração, há uma solução alternativa no SmartDOMDocument que deve ajudá-lo:
Essa não é uma ótima solução, mas como nem todos os caracteres podem ser representados na ISO-8859-1 (como essas katana), é a alternativa mais segura.
fonte
$dom->loadHTML('<?xml encoding="utf-8" ?>' . $content);
corrigi-o para mim no PHP7 (por isso ainda é um problema) - esse é um problema realmente irritante, porque eu defini utf8 no documento HTML (com<meta charset="UTF-8" />
) mas que não tem efeito, parece precisar da parte <? xml, que é totalmente não intuitivo.$dom->loadHTML(mb_convert_encoding($profile, 'HTML-ENTITIES', 'UTF-8'));
funciona bem! Obrigado,O problema está com
saveHTML()
esaveXML()
, ambos não funcionam corretamente no Unix. Eles não salvam caracteres UTF-8 corretamente quando usados no Unix, mas funcionam no Windows.A solução alternativa é muito simples:
Se você tentar o padrão, receberá o erro que descreveu
Tudo o que você precisa fazer é salvar da seguinte maneira:
Essa linha de código fará com que seus caracteres UTF-8 sejam salvos corretamente. Use a mesma solução alternativa se você estiver usando
saveXML()
.Atualizar
Conforme sugerido por " Jack M " na seção de comentários abaixo e verificado por " Pamela " e " Marco Aurélio Deleu ", a seguinte variação pode funcionar no seu caso:
Nota
Caracteres em inglês não causam nenhum problema quando você usa
saveHTML()
sem parâmetros (porque os caracteres em inglês são salvos como caracteres de byte único em UTF-8)O problema ocorre quando você possui caracteres de vários bytes (como chinês, russo, árabe, hebraico, etc.)
Eu recomendo a leitura deste artigo: http://coding.smashingmagazine.com/2012/06/06/all-about-unicode-utf8-character-sets/ . Você entenderá como o UTF-8 funciona e por que você tem esse problema. Você levará cerca de 30 minutos, mas é um tempo bem gasto.
fonte
$str = utf8_decode($dom->saveHTML($dom->documentElement));
utf8_decode($dom->saveHTML($dom->documentElement));
fez perfeitamente para mim.Verifique se o arquivo de origem real está salvo como UTF-8 (você pode tentar os BOM Chars não recomendados com UTF-8 para ter certeza).
Também no caso de HTML, verifique se você declarou a codificação correta usando
meta
tags:Se for um CMS (como você marcou sua pergunta no Joomla), pode ser necessário definir as configurações apropriadas para a codificação.
fonte
<meta charset="UTF-8">
tag mais recente não funciona com DOMDocument.Você pode prefixar uma linha que reforça a
utf-8
codificação, assim:E você pode continuar com o código que já possui, como:
fonte
Demorei um pouco para descobrir, mas aqui está a minha resposta.
Antes de usar o DomDocument, usaria file_get_contents para recuperar URLs e depois processá-los com funções de string. Talvez não seja o melhor, mas rápido. Depois de me convencer de que Dom era tão rápido, tentei o seguinte:
Isso falhou espetacularmente na preservação da codificação UTF-8, apesar das metatags apropriadas, configurações de php e todo o restante dos remédios oferecidos aqui e em outros lugares. Aqui está o que funciona:
etc. Agora está tudo certo com o mundo. Espero que isto ajude.
fonte
DomDocument('1.0', 'UTF-8')
. Mas no meu caso, apenas html parcial é carregado.Você deve alimentar o DOMDocument com uma versão do seu HTML com um cabeçalho que faça sentido. Assim como HTML5.
talvez seja uma boa ideia manter seu html o mais válido possível, para que você não entre em problemas quando iniciar a consulta ... por volta de :-) e fique longe
htmlentities
!!!! Isso é um necessário e para trás desperdiçando recursos. mantenha seu código insano !!!!fonte
Estou usando o php 7.3.8 em um manjaro e estava trabalhando com conteúdo em persa. Isso resolveu meu problema:
fonte
Funciona bem para mim:
fonte
?
)Use-o para obter o resultado correto
Esta operação
É ruim, porque símbolos especiais como & lt; , & gt; pode estar no perfil $ e eles não serão convertidos duas vezes após mb_convert_encoding. É o buraco para XSS e HTML incorreto.
fonte
A única coisa que funcionou para mim foi a resposta aceita de
CONTUDO
Isso trouxe novas questões, de ter
<?xml encoding="utf-8" ?>
na saída do documento.A solução para mim foi então fazer
Algumas soluções me disseram que, para remover o
xml
cabeçalho, eu precisava executarIsso não funcionou para mim como para um documento parcial (por exemplo, um documento com duas
<p>
tags), apenas uma das<p>
tags em que foi devolvida.fonte
O problema é que, quando você adiciona parâmetro à função DOMDocument :: saveHTML (), perde a codificação. Em alguns casos, você precisará evitar o uso do parâmetro e usar a função de string antiga para encontrar o que está procurando.
Acho que a resposta anterior funciona para você, mas como essa solução alternativa não funcionou para mim, estou adicionando essa resposta para ajudar as pessoas que podem estar no meu caso.
fonte
Também pode codificar como abaixo .... reunidos em https://davidwalsh.name/domdocument-utf8-problem
fonte