Caracteres especiais em PHP / MySQL
-
10-07-2019 - |
Pergunta
Eu tenho nas palavras de banco de dados que incluem caracteres especiais (em espanhol na sua maioria, como tiles). No banco de dados tudo é salvo e exibido corretamente com o phpMyAdmin, mas quando eu obter os dados (usando PHP) e exibi-lo em um navegador, recebo um personagem estranho, como um "?" com um quadrado ... Eu preciso de uma correção geral então eu não precisa escapar cada personagem o tempo todo, e eu também seria capaz de inserir caracteres especiais espanhóis a partir de um formulário PHP para o banco de dados ...
O HTML está correto:
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
Todas as tabelas e databas estão definidas para utf8_spanish
O personagem que eu recebo:
Todas as sugestões ???
Thanks !!!
Solução 4
Mudou o charset HTML para ISO-8859-1 resolveu o problema! Parva
Outras dicas
Eu apenas gostaria de fornecer mais alguns detalhes sobre a solução proposta pela vartec que é (dependendo da sua instalação MySQL) a solução mais correta para o seu problema. Primeiro de tudo o conjunto de caracteres / codificação problema no MySQL é um assunto um tanto complexa, que é amplamente coberta no manual do MySQL Capítulo 9.1 "Character Set Suporte" . No seu caso, especialmente 9.1.4. "Define Connection Caracteres e Collations" será mais relevante.
Para ser breve: MySQL deve saber qual conjunto de caracteres / codificação de seu aplicativo cliente (falando do persoective banco de dados que é o seu script PHP) está esperando como ele vai transcodificar todos os dados de cadeia do conjunto de caracteres interna / codificação definida pelo servidor-, database-, tabelas ou em nível de coluna para o carácter conexão conjunto / codificação. Você está usando UTF-8 no lado do cliente para que deve dizer ao MySQL que você use UTF-8. Isso é feito pelo comando SET NAMES 'utf8'
MySQL, que deve ser enviado como a primeira consulta sobre a abertura de uma conexão. Dependendo da sua instalação e sobre a biblioteca cliente do MySQL você usar no script PHP isto pode ser feito automaticamente em cada conexão.
Se você usar DOP é apenas uma questão de definir um parâmetro de configuração
$db = new PDO($dsn, $user, $password);
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");
Usando mysqli alterar o conjunto de caracteres do cliente / codificação é ainda mais simples:
$mysqli = new mysqli("localhost", "user", "password", "db");
$mysqli->set_charset("utf8");
Espero que vai ajudar a tornar a coisa toda mais compreensível.
Issue SET NAMES 'utf8'
direita após a conexão:
$mysqli = new mysqli("localhost", "user", "password", "database");
$mysqli->query("SET NAMES 'utf8'");
Tem MySQL traduzi-lo automaticamente
$conn = mysql_connect('host', 'user', 'password');
mysql_set_charset('utf8',$conn);
http://es.php.net/manual/ en / function.mysql-set-charset.php
EDIT: desde o seu comentário percebo, que este é realmente codificado em modo latin1
mysql_set_charset('latin1_spanish_ci',$conn);
Eu encontrei este de algum lugar e desde então têm sido usá-lo como um todo, sem pensar muito.
mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");
santa porcaria .. isso estava me deixando louco. eu estava tentando fazer a mesma coisa. Eu adicionei uma codificação UTF-8 HTML cabeçalho .. mysqli_set_charset () me salvou, horas mais tarde, mas estou feliz que eu tenho que trabalhar agora
outra função para tentar para a codificação de caracteres especiais e acentos é htmlentities ()
Você pode simplesmente fazer:
$link = mysql_connect("host", "user", "password");
mysql_select_db("database", $link); mysql_query("SET NAMES 'utf8';", $link);
Ligue codificação unicode em seu HTML.
Ao lidar com caracteres especiais Eu sempre cuidar do seguinte:
- banco de dados, tabelas e caracteres campo sets está tudo pronto para utf8_general_ * ou utf8_unicode _ *
- eu ter certeza que meu editor salva arquivos PHP com o conjunto de caracteres direito
- I definir default_charset no php.ini para UTF-8 ou
- I enviar um Content-Type: text / html; charset = UTF-8 cabeçalho
- O charset na tag META é UTF-8 (isto é anulado pelo Content-Type cabeçalho HTTP)
- Quando ligar a questão MySQL I as seguintes consultas:
- SET NAMES utf8
- SET CHARACTER SET utf8
- SET collation = "utf8_general_ci" / "utf8_general_ci"
Você tem certeza que temos dados UTF8 em seu banco de dados para começar?
A resposta que funcionou para mim é o que Stefan Gehrig postou:
$ mysqli-> set_charset ( "utf8");
Eu só precisava para adicionar essa linha depois de ter definido a conexão e meus problemas, onde resolvido! :)
(estou postando uma resposta desde que eu não posso comentário ...).
minha solução é: fazer todo o oferecidas acima mas também estou trabalhando com bloco de notas ++ e o arquivo deve ser salvo como este: ir para a codificação na aba manu e salve o arquivo -> codificação em utf8
interessadamente, este código não funcionou para mim:
$link = mysqli_connect('localhost', 'my_user', 'my_password', 'test');
mysqli_set_charset($link, "utf8");
printf("Current character set: %s\n", mysqli_character_set_name($link));
//shows latin1
No entanto, definir o conjunto de caracteres dentro de uma condição funciona:
if (!mysqli_set_charset($link, "utf8")) {
printf("Error loading character set utf8: %s\n", mysqli_error($link));
exit();
} else {
printf("Current character set: %s\n", mysqli_character_set_name($link));
//shows utf8
}
Minha configuração:
$ rpm -qa|grep -E "php|maria"
mariadb-5.5.56-2.el7.x86_64
mariadb-server-5.5.56-2.el7.x86_64
mariadb-libs-5.5.56-2.el7.x86_64
php-pdo-5.4.16-45.el7.x86_64
php-cli-5.4.16-45.el7.x86_64
php-5.4.16-45.el7.x86_64
php-common-5.4.16-45.el7.x86_64
php-mysql-5.4.16-45.el7.x86_64