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 !!!

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top