Como chegar & nbsp se comportar corretamente usando HTML Purifier?




Eu estou usando [HTML Purifier](http://htmlpurifier.org) no meu projeto PHP e estou tendo problemas em fazê-la funcionar corretamente com a entrada do usuário.


Estou tendo os usuários entram em HTML usando um editor WYSIWYG ( [TinyMCE](http://tinymce.moxiecode.com/) ), mas sempre que um usuário entra na entidade HTML `&nbsp;`(espaço sem quebra) que fica guardado no banco de dados como esse personagem estrangeiro estranho ( `Â`).


No entanto, a coisa é, quando eu editar a entrada salvo usando o editor WYSIWYG que é exibido corretamente como `&nbsp;`. Ele também funciona corretamente quando exibido, só que o código-fonte que aparece como um espaço real, mas não o caractere de espaço não-quebra.


Além disso, no banco de dados MySQL que mostra como o personagem estrangeiro estranho.


Eu li o doc sobre [Unicode e HTML Purifier](http://htmlpurifier.org/docs/enduser-utf8.html) e mudou a minha base de dados e página web de codificação para ser UTF-8, mas ainda estou tendo problemas com o caractere de espaço sem quebras não ser mutilado. As outras entidades HTML, tais como `&lt;`e `&gt;`, se salvo como `<`e `>`, mas por que não `&nbsp;`?
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.
<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> <p>o que acontece é que o tinymce converte cada quebra de linha dupla na fonte html para <code>&lt;p&gt;&lt;/p&gt;</code> e vice-versa. ele realmente removerá qualquer <code>&lt;p/&gt;</code> que você inserir manualmente na origem html depois de salvar, porque quando o conteúdo da postagem for renderizado, <code>&lt;p&gt;</code> e <code>&lt;/p&gt;</code> serão adicionados.</p><p>a substituição auto -<code>&lt;p&gt;</code> só funciona quando você está renderizando o conteúdo de uma postagem com <code>&lt;?php the\_content() ?&gt;</code>, se você exportar <code>$post-&gt;post\_content</code> diretamente, ela não passará pelos mesmos ganchos de formatação e parecerá simples e sem quebras de linha ou parágrafos.</p><p>se o que você deseja é muitas tags <code>&lt;br/&gt;</code> na marcação renderizada, provavelmente você deve encontrar uma solução melhor baseada em css e o uso das propriedades css <code>margin</code> ou <code>padding</code>.</p> <p>o operador <a href="http://php.net/manual/en/language.operators.errorcontrol.php"><code>@</code></a> tells php para suprimir mensagens de erro, para que elas não sejam mostradas.</p><p>por exemplo, usando:</p><pre><code>$result = mysql\_query("this is an invalid query"); </code></pre><p>resultaria em um aviso sendo mostrado, informando que a consulta mysql é inválida, enquanto</p><pre><code>$result = @mysql\_query("this is still an invalid query"); </code></pre><p>não faria.</p><p>note, no entanto, que esta é uma prática de programação muito ruim, pois não faz com que o erro desapareça, apenas os esconde e torna a depuração muito pior, já que você não consegue ver o que está realmente errado com seu código.</p><p>em vez de usar <code>@</code>, você deve desativar <s><code>error\_reporting</code> e <code>display\_errors</code></s> apenas <code>display\_errors</code> em <a href="http://no.php.net/manual/en/errorfunc.configuration.php">php.ini</a> </p> <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> <p>a especificação json <em>requer</em> suporte utf-8 por decodificadores. como resultado, todos os decodificadores json podem manipular o utf-8 tão bem quanto eles podem manipular as seqüências numéricas de escape. esse também é o caso dos intérpretes de javascript, o que significa que o jsonp também lidará com o json codificado em utf-8.</p><p>a capacidade dos codificadores json de usar as seqüências numéricas de escape apenas oferece mais opções. uma razão pela qual você pode escolher as seqüências de escape numéricas seria se um mecanismo de transporte <em>entre</em> seu codificador e o decodificador pretendido não é seguro para binário.</p><p>outro motivo pelo qual você pode querer usar sequências de escape numéricas é impedir que determinados caracteres apareçam no fluxo, como <code>&lt;</code>, <code>&amp;</code> e <code>"</code>, que podem ser interpretados como sequências html se o código json for colocado sem escapar para html ou um navegador interpretar incorretamente como html. isso pode ser uma defesa contra injeção de html ou scripts entre sites (note: alguns caracteres devem ter escape em json, incluindo <code>"</code> e <code>\</code>).</p><p>algumas estruturas, incluindo a implementação do json no php, <em>sempre</em> fazem as seqüências numéricas de escape no lado do codificador para qualquer caractere fora do ascii. isso é destinado a compatibilidade máxima com mecanismos de transporte limitados e similares. no entanto, isso não deve ser interpretado como uma indicação de que os decodificadores json têm um problema com o utf-8.</p><p>então, eu acho que você só poderia decidir qual usar assim:</p><ul> <li> <p>basta usar o utf-8, a menos que seu método de armazenamento ou transporte entre o codificador e o decodificador não seja seguro para binário.</p> </li> <li> <p>caso contrário, use as seqüências de escape numéricas.</p> </li> </ul> <p>oi felipe, blz?</p>
<p>o writehead() serve para passar os headers http corretos conforme a regra de negócio.</p>
<p>caso ele não seja passado, o cliente não tem como saber o tipo do retorno.</p>
<p>o que acontece é que o navegador é um cliente bastante inteligente e ele já consegue inferir que o tipo do documento é um html, mesmo sem a informação do content-type, pq o seu conteudo inicia com a tag <code>html</code>.</p>
<p>caso a url seja acessada a partir de um cliente que não faz esse tratamento, ele exibiria um texto plano.</p>
<p>você pode fazer um teste para validar essa resposta alterando o conteudo da resposta para que ele não mais inicie com a tag <code>html</code>.</p>
<p>se vc fizer isso, verá que o navegador passa a exibir o conteudo como texto plano normal.</p>
<p>depois compartilha aqui se a explicação te ajudou. &#61;)</p> Bom, testei em outro navegador e funcionou... Mas curioso, quando tento entrar com outra conta(no opera) o erro não ocorre, mas quando retorno para está ele aparece. Vou tentar reinstalar o Opera apagando qualquer dado salvo,  ou criar outra conta rsrsrsrsrs (Opera Forever) Obrigado pela atenção...   
Provavelmente o erro seja que o navegador salvou algum detalhe da minha conta que gera conflito na página inicial, e a limpeza de navegar não foi profunda o suficiente para corrigir. <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>depois de trabalhar nisso o dia inteiro, finalmente cheguei à solução. é só que o php5-curl não foi instalado. tão simples e estúpido quanto parece.</p><p>então, o que estava acontecendo com maior probabilidade é que o plug-in jomsocial/jomsocial update exigia curl para exibir seus sites de administração. eu acho que o jomsocial update era executado toda vez que o administrador entrava no painel do administrador, e é por isso que desativá-lo impedia a tela em branco da morte (enquanto o site de administração do jomsocial não estava acessível de qualquer maneira).</p><p>ainda assim, estou confuso sobre a maneira de apresentar a solução: isso aconteceu comigo em outros cenários, mas você geralmente encontra a solução porque os logs são bastante explícitos ao imprimir que curl\_init () não está definido. como isso pode ser confuso, para que absolutamente nada foi registrado nos logs?</p><p>bem, na verdade, muito bagunçado. enquanto escrevia essas palavras, tive a sensação do que poderia estar acontecendo. sim, as chamadas curl\_init () são precedidas pelo operador '@', que silencia erros mesmo quando o log e\_all é definido. não sei se esse é um estilo de codificação comum, mas, no que diz respeito à depuração, isso tudo transforma um inferno.</p><p>enfim, essa é a resposta para quem pode ter o mesmo problema.</p><p>saudações!</p> nevermind… 
ao fim de uma semana de volta disto, lembrei-me de utilizar ’ para o username e password, e ja funcionou… 
bem se alguém passar pelo mesmo, o que têm de fazer é: 
server: ‘mqtt://localhost:1883’ 
user: ‘user’ 
password: ‘password’