como decodificar sequências de escape unicode como "\ u00ed" para caracteres codificados utf-8 apropriados?
<p>existe uma função em php que pode decodificar seqüências de escape unicode como "<code>\u00ed</code>" para "<code>í</code>" e todas as outras ocorrências semelhantes?</p><p>eu encontrei uma pergunta similar <a href="https://stackoverflow.com/questions/2045058/converting-these-types-of-unicode-to-utf8-in-php/2045105#2045105">aqui</a> mas parece não funcionar.</p>
<p>tente isto:</p><pre><code>$str = preg\_replace\_callback('/\\\\u([0-9a-fa-f]{4})/', function ($match) { return mb\_convert\_encoding(pack('h*', $match[1]), 'utf-8', 'ucs-2be'); }, $str); </code></pre><p>caso seja baseado em utf-16, c/c++/java/json-style:</p><pre><code>$str = preg\_replace\_callback('/\\\\u([0-9a-fa-f]{4})/', function ($match) { return mb\_convert\_encoding(pack('h*', $match[1]), 'utf-8', 'utf-16be'); }, $str); </code></pre>
<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. ```
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>se você estiver interessado no código de erro, é uma maneira mais portátil de obtê-lo, em vez de dividir por 256:</p><pre><code>printf("exit code: %i\n", wexitstatus(pclose(fp))); </code></pre><p>no entanto, <code>popen</code> é uma maneira, então você está criando outras soluções alternativas pelo estilo de redirecionamento usual no shell ou segue este código não testado para fazer o certo:</p><pre><code>#include &lt;unistd.h&gt; #include &lt;stdio.h&gt; /* since pipes are unidirectional, we need two pipes. one for data to flow from parent's stdout to child's stdin and the other for child's stdout to flow to parent's stdin */ #define num\_pipes 2 #define parent\_write\_pipe 0 #define parent\_read\_pipe 1 int pipes[num\_pipes][2]; /* always in a pipe[], pipe[0] is for read and pipe[1] is for write */ #define read\_fd 0 #define write\_fd 1 #define parent\_read\_fd ( pipes[parent\_read\_pipe][read\_fd] ) #define parent\_write\_fd ( pipes[parent\_write\_pipe][write\_fd] ) #define child\_read\_fd ( pipes[parent\_write\_pipe][read\_fd] ) #define child\_write\_fd ( pipes[parent\_read\_pipe][write\_fd] ) void main() { int outfd[2]; int infd[2]; // pipes for parent to write and read pipe(pipes[parent\_read\_pipe]); pipe(pipes[parent\_write\_pipe]); if(!fork()) { char *argv[]={ "/usr/bin/bc", "-q", 0}; dup2(child\_read\_fd, stdin\_fileno); dup2(child\_write\_fd, stdout\_fileno); /* close fds not required by child. also, we don't want the exec'ed program to know these existed */ close(child\_read\_fd); close(child\_write\_fd); close(parent\_read\_fd); close(parent\_write\_fd); execv(argv[0], argv); } else { char buffer[100]; int count; /* close fds not required by parent */ close(child\_read\_fd); close(child\_write\_fd); // write to child’s stdin write(parent\_write\_fd, "2^32\n", 5); // read from child’s stdout count = read(parent\_read\_fd, buffer, sizeof(buffer)-1); if (count &gt;= 0) { buffer[count] = 0; printf("%s", buffer); } else { printf("io error\n"); } } } </code></pre><p>o código é daqui:</p><p> <a href="http://jineshkj.wordpress.com/2006/12/22/how-to-capture-stdin-stdout-and-stderr-of-child-program/">http://jineshkj.wordpress.com/2006/12/22/how-to-capture-stdin-stdout-and-stderr-of-child-program/</a> </p> <p>danilo,</p>
<p>veja se você consegue entender onde errou abaixo, se preciso poste aqui neste tópico ou marque como resolvido:</p>
<pre class="prettyprint"><code>for ($i &#61; 0 ; $i &lt;&#61; 10 ; $i &#43;&#43; ) {
 echo $i . &#39; * 2 &#61; &#39; . $i * 2 . php\_eol;
 } </code></pre> Note-se que não se trata de "programação estrita unicode" per se, mas alguma experiência prática.


O que fizemos na minha empresa era criar uma biblioteca invólucro em torno da biblioteca ICU da IBM. A biblioteca wrapper tem uma interface UTF-8 e converte para UTF-16 quando é necessário chamar UTI. No nosso caso, nós não se preocupar muito com sucessos de desempenho. Quando o desempenho foi um problema, nós também fornecido interfaces de UTF-16 (usando o nosso próprio tipo de dados).


Aplicações poderia permanecer em grande parte como-é (usando caracteres), embora em alguns casos, eles precisam estar cientes de certas questões. Por exemplo, em vez de strncpy () usamos um invólucro que evita cortar sequências UTF-8. No nosso caso, isso é suficiente, mas também pode considerar cheques para combinar caracteres. Temos também wrappers para a contagem do número de codepoints, o número de grafemas, etc.


Quando a interface com outros sistemas, às vezes precisamos fazer composição caráter personalizado, assim você pode precisar de alguma flexibilidade lá (dependendo do aplicativo).


Nós não usamos wchar\_t. Usando UTI evita problemas inesperados na portabilidade (mas não outros problemas inesperados, é claro :-). <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 problema acabou sendo algo tão simples quanto <code>&amp;amp;</code>, mudança simples:</p><pre><code>&lt;input type="hidden" name="return-url" value="&lt;?php echo base64\_encode('index.php?option=com\_file\_manager&amp;amp;view=file&amp;amp;layout=modal&amp;amp;tmpl=component'); ?&gt;" /&gt; </code></pre><p>para:</p><pre><code>&lt;input type="hidden" name="return-url" value="&lt;?php echo base64\_encode('index.php?option=com\_file\_manager&amp;view=file&amp;layout=modal&amp;tmpl=component'); ?&gt;" /&gt; </code></pre><p>fiz o truque. obrigado a todos por suas contribuições.</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. <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>