file\_get\_contents () quebra os caracteres utf-8
<p>estou carregando um html de um servidor externo. a marcação html tem codificação utf-8 e contém caracteres como ľ, š, č, ť, ž etc. quando carrego o html com file\_get\_contents () assim:</p><pre><code>$html = file\_get\_contents('http://example.com/foreign.html'); </code></pre><p>ele bagunça os caracteres utf-8 e carrega å, ¾, ¤ e um absurdo similar ao invés de caracteres utf-8 apropriados.</p><p>como posso resolver isso?</p><p>atualizar:</p><p>eu tentei salvar o html em um arquivo e emiti-lo com codificação utf-8. ambos não funcionam, o que significa que file\_get\_contents () já está retornando o html corrompido.</p><p>update2:</p><pre><code>&lt;!doctype html public "-//w3c//dtd xhtml 1.0 strict//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd"&gt; &lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="sk" lang="sk"&gt; &lt;head&gt; &lt;meta http-equiv="content-type" content="text/html; charset=utf-8" /&gt; &lt;meta http-equiv="content-style-type" content="text/css" /&gt; &lt;meta http-equiv="content-language" content="sk" /&gt; &lt;title&gt;test&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;?php $html = file\_get\_contents('http://example.com'); echo htmlentities($html); ?&gt; &lt;/body&gt; &lt;/html&gt; </code></pre>
<p>tudo bem. eu descobri que o file\_get\_contents () não está causando esse problema. há uma razão diferente da qual falo em outra questão. me bobo.</p><p>veja esta pergunta: <a href="https://stackoverflow.com/questions/2236889/why-does-dom-change-encoding">por que o dom muda a codificação?</a> </p>
Quando o documento é transferido através de HTTP, [as informações do cabeçalho HTTP são as informações crutial](http://www.w3.org/TR/html401/charset.html#h-5.2.2) :



> 
> [...] agentes de usuário conformes devem observar as seguintes prioridades para determinar a codificação de caracteres de um documento (da mais alta prioridade para a menor):
> 
> 
> 1. Um HTTP " `charset`" parâmetro em um " `Content-Type`campo".
> 2. Uma `META`declaração com " `http-equiv`" definido para " `Content-Type`" e um valor definido para " `charset`".
> 3. O `charset`conjunto de atributos em um elemento que designa um recurso externo.
> 
> 
> 


Portanto, verifique se você declarar a codificação de caracteres no [`Content-Type`campo de cabeçalho](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.17) e não apenas dentro do documento. ```
header('Content-type: text/html; charset=UTF-8') ;

/**
 * Encodes HTML safely for UTF-8. Use instead of htmlentities. 
 *
 * @param string $var 
 * @return string 
 */
function html_encode($var)
{
    return htmlentities($var, ENT_QUOTES, 'UTF-8');
}

```

Esses dois me salvou e eu acho que agora está *trabalhando* . Eu vou voltar se eu continuar a encontrar problemas. Devo armazená-lo no DB, por exemplo, como "&" ou como "&"? <p>cria um filter e seta o encoding para utf-8, deve resolver:</p>
<pre class="prettyprint"><code>&#64;webfilter(&#34;/*&#34;)
public class characterencodingfilter implements filter {

 &#64;override
 public void dofilter(servletrequest request, servletresponse response, filterchain chain) throws servletexception, ioexception {
 request.setcharacterencoding(&#34;utf-8&#34;);
 chain.dofilter(request, response);
 }
}</code></pre> O espaço não-separável não está sendo guardada no seu banco de dados como um personagem estrangeiro estranho, ele está sendo salvo como *dois* caracteres. O caractere de Unicode espaço sem quebra é codificado em UTF-8 como `0xC2 0xA0`, o qual na norma ISO 8859-1-se parece com "A" (isto é, um caracteres estrangeiros estranho seguido de um espaço não separável).


Você provavelmente está se esquecendo de fazer `SET NAMES 'utf8'`na sua conexão de banco de dados, o que faz com PHP para enviar seus dados para o MySQL como ISO-8859-1 (o padrão).


Dê uma olhada no " [UTF-8 todo o caminho ...](https://stackoverflow.com/questions/279170/utf-8-all-the-way-through) " para ver como configurar corretamente UTF-8 quando usando PHP e MySQL. **Editar** : ok eu acho que isso funciona (pelo menos funcionou no meu ambiente de teste, ver revisões para tentativa anterior)



```
$.ajaxSetup({
    'beforeSend' : function(xhr) {
        xhr.overrideMimeType('text/html; charset=UTF-8');
    },
});
$('#stuff').load('/yourresource.file'); // your ajax load

```

o que eu tinha era o principal arquivo definido no `UTF-8`eo arquivo de dados definido em `ISO-8859-1`. sem o código acima, eu tenho um monte de lixo para a cadeia teste **åäöé** , como esperado. com o código acima, carregou **åäöé** adequadamente codificada. <p>oi, marcélio!</p>
<p>o arquivo foi disponibilizado com esse erro de sintaxe, ai quando baixamos ele e utilizamos, recebemos esse erro, mas é só corrigir a letra <code>k</code> para minúscula que é resolvido.</p> <p>opa bruno, tudo bom?</p>
<p>tente incluir essa linha antes de utilizar o <code>printwriter</code> pra adicionar conteúdo à sua resposta:</p>
<pre class="prettyprint"><code>resp.setheader(&#34;content-type&#34;, &#34;text/html; charset&#61;utf-8&#34;);</code></pre>
<p>isso força a resposta a utilizar um encoding específico. outra alternativa seria incluir isso no corpo html da resposta:</p>
<pre class="prettyprint"><code>string body &#61; &#34;&lt;html&gt;&#34;&#43;
 &#34;&lt;head&gt;&lt;meta charset&#61;&#34;utf-8&#34;&gt;&lt;/head&gt;&#34;&#43;
 &#34;&lt;body&gt;&#34;&#43;seuconteudo&#43;&#34;&lt;/body&gt;&#34;&#43;
 &#34;&lt;/html&gt;&#34;;
writer.println(body);</code></pre>
<p>acredito que uma dessas opções vai resolver seu problema!</p>
<p>caso contrário, pode voltar aqui e vemos mais alternativas pra atacar!</p>
<p>um abraço e bons estudos!</p> <p>verificou o nome do arquivo? verificou se a imagem está na mesma pasta que o arquivo html? verificou se tudo está escrito correto?</p>
<p>se possível, cole o código html aqui para que possamos ajudá-lo.</p> normalmente esse problema acontece por problema no local onde o arquivo está sendo salvo.

ou o caminho tem mais do que 256 caracteres (que é o limite… <p>hmm, então já está salvo no banco com essas coisas. bom, você tem problemas de codificação em algum lugar. seja nos seus arquivos php, html ou mesmo no banco. tenta usar essa função antes de fazer as queries pra ver se resolve daniel.</p>
<pre class="prettyprint"><code>mysqli\_set\_charset ( $conexao , &#34;utf8&#34;)</code></pre>
<p>tenta inserir e remover registros depois de usar essa função pra ver se resolve.</p>