problemas de codificação de caracteres PHP




Preciso de ajuda com um problema de codificação de caracteres que eu quiser ordenar uma vez por todas. Aqui está um exemplo de algum conteúdo que eu puxo de um feed XML, inserir no meu banco de dados e, em seguida, puxe para fora.


Como você não pode ver, um monte de caracteres especiais HTML corrompidos / quebrado. 


Como eu uma vez por todas pode parar isso? Como eu sou capaz de suportar todos os tipos de personagens, etc.?


Eu tentei literalmente cada pedaço de codificação posso encontrar, às vezes corrige-lo para a maioria, mas outros ainda estão corrompidos.
```
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>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>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>eu realmente consegui resolver meu próprio problema. para qualquer um que possa ler isso, o problema que causou isso foi que o meu arquivo <code>functions.php</code> tinha um fechamento</p><pre><code>?&gt; </code></pre><p>no final. por alguma razão, isso é o que causou o problema e, ao remover essa última linha, estava funcionando novamente.</p> <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>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> 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>opa mayki, tudo bem com você?</p>
<p>isso aconteceu porque o <code>&#43;</code> também é um quantificador dentro das expressões regulares, então precisamos utilizar a <code>\</code> para dizer que queremos o literal mesmo:</p>
<p>eu criei uma regex para testar aqui, um pouco diferente da sua veja:</p>
<pre class="prettyprint"><code>let pattern &#61; /[\d\.]&#43;e\&#43;\d{2}/g</code></pre><p>veja que eu estou criando um grupo que vai receber dígitos e ponto final, ai eu utilizo o <code>&#43;</code> para identificar que esse padrão de números e pontos para pegar mais de um</p>
<p>depois coloquei o <code>e</code>e o <code>\&#43;</code> para identificar que é de fato um <code>&#43;</code> e um <code>\d{2}</code> para ser os 2 últimos digitos</p>
<p>testando esse padrão:</p>
<pre class="prettyprint"><code>let valor &#61; &#34;2.4446506362607e&#43;29&#43;3.7298826723704e&#43;29&#34;
let pattern &#61; /[\d\.]&#43;e\&#43;\d{2}/g

let resposta &#61; valor.matchall(pattern)
resposta.next()

&gt;&gt;&gt;&gt;
done: false
value: array [ &#34;2.4446506362607e&#43;29&#34; ]

resposta.next()
&gt;&gt;&gt;
done: false
value: array [ &#34;3.7298826723704e&#43;29&#34; ]
</code></pre><p>compreendeu? </p>
<p>abraços e bons estudos!</p> Extrair texto de PDFs é difícil e quase sempre requer muito
cuidado.


Eu começaria com as ferramentas de linha de comando, como
pdftotext e ver o que eles cuspiram. O problema é que os PDFs podem
armazenar o texto em qualquer ordem, podem usar codificações de
fontes estranhas e podem fazer coisas como usar caracteres de
ligadura (o conjunto 'ff' e 'ij' que você vê na formatação
adequada) para lançar você.


O pdftotext é instalável em qualquer sistema Linux ... <p>encontrei uma solução para o seu problema.</p><p>baseado em <a href="https://stackoverflow.com/a/8798355/637284">this so answer</a> eu fiz um programa que usa classes de caracteres regex para procurar por letras que possam ter modificadores opcionais. ele divide sua string em caracteres simples (combinados, se necessário) e os coloca em uma lista:</p><pre><code>import java.util.*; import java.lang.*; import java.util.regex.*; class main { public static void main (string[] args) { string s="குமார்"; list&lt;string&gt; characters=new arraylist&lt;string&gt;(); pattern pat = pattern.compile("\\p{l}\\p{m}*"); matcher matcher = pat.matcher(s); while (matcher.find()) { characters.add(matcher.group()); } // test if we have the right characters and length system.out.println(characters); system.out.println("string length: " + characters.size()); } } </code></pre><p>onde <code>\\p{l}</code> significa uma letra unicode e <code>\\p{m}</code> significa uma marca unicode.</p><p>a saída do trecho é:</p><pre><code>கு மா ர் string length: 3 </code></pre><p>veja <a href="https://ideone.com/apkapn">https://ideone.com/apkapn</a> para uma demonstração funcional</p><hr><p><strong>edit</strong></p><p>eu agora chequei meu regex com todas as cartas tamil válidas tiradas das tabelas em <a href="http://en.wikipedia.org/wiki/tamil\_script">http://en.wikipedia.org/wiki/tamil\_script</a> . descobri que com o regex atual não capturamos todas as letras corretamente (cada letra na última linha da tabela composta de grantha é dividida em duas letras), então refinei meu regex para a seguinte solução:</p><pre><code>pattern pat = pattern.compile("\u0b95\u0bcd\u0bb7\\p{m}?|\\p{l}\\p{m}?"); </code></pre><p>com este padrão em vez do acima, você deve ser capaz de dividir sua sentença em cada letra tamil válida (desde que a tabela da wikipédia esteja completa).</p><p>o código que usei para verificar é o seguinte:</p><pre><code>string s = "ஃஅஆஇஈஉஊஎஏஐஒஓஔக்ககாகிகீகுகூகெகேகைகொகோகௌங்ஙஙாஙிஙீஙுஙூஙெஙேஙைஙொஙோஙௌச்சசாசிசீசுசூசெசேசைசொசோசௌஞ்ஞஞாஞிஞீஞுஞூஞெஞேஞைஞொஞோஞௌட்டடாடிடீடுடூடெடேடைடொடோடௌண்ணணாணிணீணுணூணெணேணைணொணோணௌத்ததாதிதீதுதூதெதேதைதொதோதௌந்நநாநிநீநுநூநெநேநைநொநோநௌப்பபாபிபீபுபூபெபேபைபொபோபௌம்மமாமிமீமுமூமெமேமைமொமோமௌய்யயாயியீயுயூயெயேயையொயோயௌர்ரராரிரீருரூரெரேரைரொரோரௌல்லலாலிலீலுலூலெலேலைலொலோலௌவ்வவாவிவீவுவூவெவேவைவொவோவௌழ்ழழாழிழீழுழூழெழேழைழொழோழௌள்ளளாளிளீளுளூளெளேளைளொளோளௌற்றறாறிறீறுறூறெறேறைறொறோறௌன்னனானினீனுனூனெனேனைனொனோனௌஶ்ஶஶாஶிஶீஶுஶூஶெஶேஶைஶொஶோஶௌஜ்ஜஜாஜிஜீஜுஜூஜெஜேஜைஜொஜோஜௌஷ்ஷஷாஷிஷீஷுஷூஷெஷேஷைஷொஷோஷௌஸ்ஸஸாஸிஸீஸுஸூஸெஸேஸைஸொஸோஸௌஹ்ஹஹாஹிஹீஹுஹூஹெஹேஹைஹொஹோஹௌக்ஷ்க்ஷக்ஷாக்ஷிக்ஷீக்ஷுக்ஷூக்ஷெக்ஷேக்ஷைஷொக்ஷோஷௌ"; list&lt;string&gt; characters = new arraylist&lt;string&gt;(); pattern pat = pattern.compile("\u0b95\u0bcd\u0bb7\\p{m}?|\\p{l}\\p{m}?"); matcher matcher = pat.matcher(s); while (matcher.find()) { characters.add(matcher.group()); } system.out.println(characters); system.out.println(characters.size() == 325); </code></pre> <p>olá valdiney, é para você fazer uma variação de código.</p>
<p>usar sua curiosidade e criatividade, variar, não se prender só ao que foi pedido, tipo:</p>
<p></p>fazendo diferente:
<strong> teste 1 </strong>
<strong> teste 2 </strong>
<strong> teste 3 </strong>
<p></p>
<p></p>