Depois do primeiro post, agora, nosso retorno é:

Problemas com acentos ����

Necessário aqui, é entender como funcionam as coisas. No browser, está sendo exibido � no lugar do acento.

Porém no console do Firebug, tá certinho.

Voltando para a primeira aba:


Cabeçalhos de Resposta
Content-Type text/html; charset=iso-8859-1

Vamos forçar esse charset:

<?php
  header ('Content-type: text/html; charset=iso-8859-1');
  echo 'Beleza, chegou até aqui!';

Okay, funciona.. basta mantermos o padrão. Se definirmos usar ISO, então usemos ISO em tudo.

Na codificação do arquivo, nos headers que vamos enviar ao navegador, na tabela do banco de dados, na meta tag do documento html..

Problemas com acentos [ 2 ] – à ã..

Nesse momento é que a galera costuma se enrolar. E fica procurando fazer milagres com os **utf8_encode decode()**. Só ‘precisamos’ disso, qndo temos algo ‘realmente’ em uma codificação diferente. Como é o caso de estarmos trabalhando com banco de dados.

Aqui, não era necessário:

$arr = Array('nome'=>utf8_encode('Jéssicão'), 'blog'=>'wbruno.com.br');

Porém, aqui já é:

<?php
  header ('Content-type: text/html; charset=utf-8');

  $db = new mysqli('localhost','root','123','test');//o php não é o foco
  $query = $db->query( 'SELECT id, nome FROM usuario WHERE id = 2' );
  if( $query->num_rows )
    echo $query->fetch_object()->nome;//echo utf8_encode( $query->fetch_object()->nome );

Pois a nossa tabela:

CREATE TABLE IF NOT EXISTS `usuario` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nome` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

Está em ISO.

Assinatura BOM 

<?php
  header ('Content-type: text/html; charset=iso-8859-1');
  echo 'Beleza, chegou até aqui!';

Se o arquivo estiver em UTF com assinatura BOM:

Se quisermos usar UTF8 mesmo, precisamos codificar os arquivos nesse content type.

No Notepad++

No Dreamweaver

apesar de eu não gostar desse programa, pode ajudar algumas pessoas, deixar aqui como resolver nele

Basta salvar o arquivo, desmarcando esta opção.

jSON é UTF8 por definição

Vale lembrar disso. Então se vamos trabalhar todo o documento html em ISO, e precisamos de jSON, temos que corrigir em algum momento a codificação, para não termos problemas.

<?php
  header ('Content-type: text/html; charset=iso-8859-1');

  $arr = Array('nome'=>'Bruno','site'=>'wbruno.com.br');
  echo json_encode( $arr );

index.html

if (xmlHttp.readyState == 4){
      var json = eval('(' + xmlHttp.responseText + ')');
      id('response').innerHTML = json.nome;
    }

De novo, sem nenhum erro no console, tudo aparentemente correto no xhr, porém ‘não funciona’!!

É aquilo que eu já disse, javascript tem erros silenciosos. Nesse caso, como jSON é utf-8 por definição, e mandamos ele com um cabeçalho ISO, não temos uma ‘saída válida’.

O correto, é forçarmos a saída do json em utf. Note que estamos trabalhando apenas em cima, dos dados recebidos. Para os dados enviados, é outra história.

Ainda é possível fazer uma combinação com oque expus, do tipo header+utf8_encode()+bd.. Mas acho que já deu para entender o conceito. A única coisa que discordo do Micox, é que ‘não precisamos necessariamente’, forçar o cabeçalho ISO sempre. Dá para trabalhar bem com tudo em UTF8, sem quebras nos acentos.

<?php
  header ('Content-type: text/html; charset=utf-8');

  $db = new mysqli('localhost','root','123','test');//o php não é o foco
  $query = $db->query( 'SELECT id, nome FROM usuario WHERE id = 2' );
  if( $query->num_rows )
    echo utf8_encode( $query->fetch_object()->nome );

Eu acho que:

Toda ‘fórmula mágica’ em programação é burra e falha

(Não existem) (Não deveriam existir) fórmulas mágicas, nem ‘soluções definitivas’… procure entender os motivos, pesquise pelas causas.

Acentos em entities – é ã …

Deselegante, porém lógico que funciona!

echo htmlentities( $query->fetch_object()->nome );

Nesse caso, estamos transportanto apenas texto puro:

Não importa como vamos trazer a string, não importam os cabeçalhos que o servidor está nos devolvendo, oque está vindo, é texto puro, sem nenhum caracter especial.

Porém, vamos trafegar mais informações do que das outras formas [strings maiores].

Consulta rápida:

ASP:

<% Response.Charset="ISO-8859-1" %>

PHP:

<?php header("Content-Type: text/html; charset=ISO-8859-1",true); ?>

JSP:

<%@ page contentType="text/html; charset=ISO-8859-1" %>

HTML

<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />

Bom, acho que é isso. Quis escrever sobre, para dar embasamento para os meus demais posts, e porque eu já passei por essas situações, e já bati muito a cabeça para conseguir resolver.

Vamos estudando e entendendo como funcionam as coisas ! Bons estudos a todos nós.