Tantas coisas podem dar errado aqui, porque banco de dados, envios de formulários e literais de string de código-fonte estão todos envolvidos. Presumo que você queira usar UTF-8, porque com qualquer outra codificação típica (CP1252, Latin1) você vai se ferrar quando quiser usar
json_
ou aceite mais de ~200 caracteres diferentes. A primeira coisa a fazer é remover qualquer tipo de código de conversão etc que foi escrito com a intenção de tentar corrigir problemas de codificação. Como
utf8_encode
, htmlentitites
, *_replace
.. qualquer que seja. Codificação de origem.
$str = "· Close up the server";
Ao escrever o acima, o arquivo de origem PHP precisa ser fisicamente codificado em UTF-8. Se você estiver no Windows, deverá fazer ou configurar isso explicitamente. UTF-8 não acontece magicamente no Windows.
Formulários enviados
Quando o usuário envia um formulário, a carga útil estará em qualquer codificação que você tenha declarado a página. Você pode declarar assim:
header("Content-Type: text/html; charset=utf-8");
Mas qualquer um pode enviar bytes arbitrários para o seu servidor, então você deve validar a entrada em UTF-8 antes de continuar.
mb_check_encoding
é bom. Base de dados
Como neste momento seus dados estão chegando como UTF-8, suas strings de entrada estão em UTF-8. Você deve especificar isso após conectar-se ao banco de dados, especificando uma codificação de conexão.
mysql_set_charset("utf8"); //After making the connection, and before any queries
//or $mysqli->set_charset( "utf8");
Isso faz com que o banco de dados leia sua entrada em UTF-8 e codifique sua saída em UTF-8. Você também gostaria de definir suas colunas/tabelas/bancos de dados para UTF-8 também.
Sequências de escape Unicode
\uxxxx
ou \uhhhh\ullll
ou \Uxxxxxxxx
não são suportados em PHP.