saída PHP mostrando pequenos diamantes negros com um ponto de interrogação

votos
58

Eu estou escrevendo um programa php que puxa a partir de uma fonte de banco de dados. Alguns dos varchars tem citações que estão exibindo como diamantes pretos com um ponto de interrogação neles (, caractere de substituição , eu assumo a partir de texto Microsoft Word).

Como posso usar php para retirar esses personagens fora?

Publicado 09/11/2008 em 01:21
fonte usuário
Em outras línguas...                            


21 respostas

votos
1

Isso pode ser causado por unicode ou outra incompatibilidade charset. Tente mudar charset no seu navegador, em uma das definições do texto ficará OK. Então é questão de como converter os seus conteúdos de banco de dados para charset você usa para exibir. (Que pode realmente ser apenas adicionando declaração utf-8 charset para sua saída.)

Respondeu 09/11/2008 em 01:26
fonte usuário

votos
59

Se você ver que o personagem (U + FFFD "substituição de caracteres") isso normalmente significa que o próprio texto é codificado em alguma forma de codificação de byte único, mas interpretado em uma das codificações Unicode (UTF8 ou UTF16).

Se fosse o contrário seria (geralmente) algo parecido com isto: å¤.

Provavelmente, a codificação original é ISO-8859-1, também conhecido como 1-Latina. Você pode verificar isso sem ter que mudar seu script: Browsers dar-lhe a opção de re-interpretar uma página em uma codificação diferente - no Firefox usar "View" -> "Codificação de caracteres".

Para fazer com que o navegador utilize a codificação correta, adicionar um cabeçalho HTTP como este:

header("Content-Type: text/html; charset=ISO-8859-1");

ou colocar a codificação em uma meta tag:

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

Alternativamente, você pode tentar ler a partir do banco de dados em outra codificação (UTF-8, de preferência) ou converter o texto com iconv().

Respondeu 09/11/2008 em 01:51
fonte usuário

votos
40

Esta é uma questão charset. Como tal, pode ter dado errado em muitos níveis diferentes, mas o mais provável, as cordas em seu banco de dados são UTF-8 codificado, e você está apresentando-os como iso-8859-1. Ou o contrário.

A maneira correta de corrigir esse problema, é fazer com que seu personagem-sets. A estratégia mais simples, desde que você está usando PHP, é a utilização de iso-8859-1 em sua aplicação. Para fazer isso, você deve garantir que:

  • Todas-fonte arquivos PHP são salvos como iso-8859-1 (Não deve ser confundida com cp-1252).
  • O seu web-servidor está configurado para servir arquivos com charset=iso-8859-1
  • Alternativamente, você pode substituir as configurações de servidores web de dentro do PHP-documento, utilizando header.
  • Além disso, você pode inserir uma meta-tag em você HTML, que especifica a mesma coisa, mas isso não é estritamente necessário.
  • Você pode também especificar o accept-charsetatributo em seus <form>elementos.
  • tabelas de banco de dados são definidos com a codificação como latin1
  • A conexão de dados entre o PHP e banco de dados está definido para latin1

Se você já tem dados em seu banco de dados, você deve estar ciente de que eles são, provavelmente errei já. Se você não está já em fase de produção, apenas limpe tudo e começar de novo. Caso contrário, você vai ter que fazer alguma limpeza de dados.

Uma nota sobre meta-tags, já que todo mundo entende mal o que são:

Quando um servidor web serve um arquivo (A HTML-documento), ele envia algumas informações, que não é apresentada diretamente no navegador. Isto é conhecido como http-cabeçalhos. Um tal cabeçalho, é o Content-Typecabeçalho, que especifica o tipo MIME do arquivo (Ex. text/html), Bem como a codificação (também conhecido por conjunto de caracteres). Enquanto a maioria dos servidores web irá enviar um Content-Typecabeçalho com charsetinformação, que é opcional. Se ele não estiver presente, o navegador em vez interpretar quaisquer meta-tags com http-equiv="Content-Type". É importante perceber que a meta-tag é única interpretada se o servidor não envia o cabeçalho. Na prática, isso significa que ele só é usado se a página é salva no disco e, em seguida, abriu a partir daí.

Esta página tem uma boa explicação dessas coisas.

Respondeu 09/11/2008 em 01:52
fonte usuário

votos
6

Com base na sua descrição do problema, os dados em seu banco de dados é quase certamente codificado como Windows 1252 , e sua página está quase certamente ser servido como ISO-8859-1 . Estes dois conjuntos de caracteres são equivalentes, exceto que o Windows-1252 tem 16 caracteres extras que não estão presentes em ISO-8859-1, incluindo aspas curvas esquerda e direita.

Assumindo a minha análise estiver correta, a solução mais simples é a de servir sua página como o Windows-1252. Isto irá funcionar porque todos os caracteres que estão em ISO-8859-1 também estão no Windows-1252. No PHP, você pode alterar a codificação da seguinte forma:

header('Content-Type: text/html; charset=Windows-1252');

No entanto, você realmente deve verificar o que codificação de caracteres que você está usando em seus arquivos HTML e o conteúdo do seu banco de dados, e cuidar para ser consistente, ou converter corretamente onde isso não é possível.

Respondeu 09/11/2008 em 02:19
fonte usuário

votos
0

Você também pode alterar o caracter definido no seu browser. Apenas por razões de depuração.

Respondeu 09/11/2008 em 12:05
fonte usuário

votos
7

Para verificar se a conexão MySQL é definida como UTF-8 (ou latin1, dependendo do que você estiver usando), você pode fazer isso:

$con = mysql_connect("localhost","username","password");    
mysql_set_charset('utf8',$con);

ou usar isto para verificar o charset que você está usando:

$con = mysql_connect("localhost","username","password");   
$charset = mysql_client_encoding($con);
echo "The current character set is: $charset\n"; 

Mais informações aqui: http://php.net/manual/en/function.mysql-set-charset.php

Respondeu 05/04/2012 em 07:28
fonte usuário

votos
23

Eu também enfrentou esta questão. Enquanto isso eu corri em três casos em que isso aconteceu:

  1. substr ()

    Eu estava usando substr()em uma corda UTF8 que cortou UTF8 personagens, assim os caracteres corte não pode ser exibida corretamente. Use mb_substr($utfstring, 0, 10, 'utf-8');em seu lugar. créditos

  2. htmlspecialchars ()

    Outro problema estava usando htmlspecialchars()em uma corda UTF8. A correção é usar:htmlspecialchars($utfstring, ENT_QUOTES, 'UTF-8');

  3. preg_replace ()

    Finalmente eu descobri que preg_replace()pode levar a problemas com UTF. O código $string = preg_replace('/[^A-Za-z0-9ÄäÜüÖöß]/', ' ', $string);por exemplo transformado a cadeia UTF "F (x) = 2 × -3" a "F 2". A correção é usar mb_ereg_replace()em seu lugar.

Espero que esta informação adicional vai ajudar a se livrar de tais problemas.

Respondeu 28/02/2013 em 15:35
fonte usuário

votos
0

Usando o mesmo charset (como sugerido aqui), tanto no banco de dados e o HTML não tem funcionado para mim ... Então, lembrando que o código é gerado como HTML, eu escolhi para usar o &quot;(código HTML) ou o &#34;(ISO Latin-1 código) no meu texto banco de dados onde foram utilizadas as cotações. Isso resolveu o problema, proporcionando-me uma aspa. É estranho notar que antes a esta solução, apenas algumas das aspas e apóstrofos não são exibidos corretamente, enquanto outros fizeram, no entanto, o código especial operavam em todas as instâncias.

Respondeu 22/06/2014 em 16:12
fonte usuário

votos
2

Eu escolhi para tirar esses personagens fora da corda, fazendo isso -

ini_set('mbstring.substitute_character', "none"); 
$text= mb_convert_encoding($text, 'UTF-8', 'UTF-8');
Respondeu 29/07/2015 em 02:41
fonte usuário

votos
6

Como mencionado em respostas anteriores, isso está acontecendo porque o seu texto foi escrito para o banco de dados iso-8859-1de codificação, ou qualquer outro formato.

Então você só precisa converter os dados para utf8antes de emitir-lo.

$text = “string from database”;
$text = utf8_encode($text);
echo $text;
Respondeu 16/08/2015 em 16:28
fonte usuário

votos
0

Eu corri o código "detectar codificação" depois da minha mudança de colações no phpmyadmin e agora surge como Latin_1.

mas aqui é algo que eu me deparei olhando uma anomalia de dados diferente no meu aplicativo e como eu fixa-lo:

Eu só importou uma tabela que tem misturado codificação (com interrogação diamante marcas em algumas linhas, e todos estavam na mesma coluna.) Então aqui está o meu código de correção. Eu costumava utf8_decode processo que leva o espaço reservado indefinido e atribui um ponto de interrogação simples no lugar do "ponto de interrogação diamante", então eu usei str_replace para substituir o ponto de interrogação com um espaço entre aspas. aqui é o [code]

    include 'dbconnectfile.php';

  //// the variable $db comes from my db connect file
   /// inx is my auto increment column
   /// broke_column is the column I need to fix

      $qwy = "select inx,broke_column from Table ";
      $res = $db->query($qwy); 

      while ($data = $res->fetch_row()) {
      for ($m=0; $m<$res->field_count; $m++) {
           if ($m==0){ 
           $id=0;
           $id=$data[$m];
       echo $id;
           }else if ($m==1){ 
             $fix=0;
             $fix=$data[$m];


             $fix = utf8_decode($fix);
             $fixx =str_replace("?"," ",$fix);

        echo $fixx;

        ////I echoed the data to the screen because I like to see something as I execute it :)
            }
            }
         $insert= "UPDATE Table SET broke_column='".$fixx."'  where inx='".$id."'";
          $insresult= $db->query($insert);
      echo"<br>";
        }

        ?>        
Respondeu 05/09/2016 em 22:26
fonte usuário

votos
1

o que eu acabei fazendo no final depois que eu fixo meus quadros foi para apoiá-la e mudar de volta as configurações para UTF8, então eu alterei o meu arquivo de despejo para que default Caráter SET utf8 COLLATE utf8_general_ci são minhas entradas do conjunto de caracteres

agora eu não tenho problemas CharacterSet mais porque o banco de dados e navegador são utf8.

Eu descobri o que causou isso. Era os efeitos + navegador web page no DB. Nos terminais que são linux (ubuntu + firefox) foi codifica a banco de dados em latin1 que é o que os tabes estão definidos. Mas nas janelas 10 terminais + ponta, as entradas eram vigor codificado em UTF-8. Também notei que as janelas 10 tem problemas de ficar com latin1 então eu decidi dobrar com o vento e converter tudo para utf8.

Achei que era um problema do Windows 10 porque nós começamos a usar ganhar 10 terminais. por isso, mais uma vez microsoft erros causa problemas. Eu ainda não sei porque a codificação mudanças nos formulários porque o navegador no Windows 10 mostra o conjunto de caracteres latin1 mas quando ele vai em seu utf8 codificado e fico com a anomalia de dados. mas em linux + firefox ele não faz isso.

Respondeu 07/09/2016 em 15:30
fonte usuário

votos
3

Tente isso por favor

mb_substr ($ descrição, 0, 490, "UTF-8");

Respondeu 06/10/2016 em 07:58
fonte usuário

votos
0

Isso aconteceu para trabalhar no meu caso:

$text = utf8_decode($text)

Eu vira o personagem diamante negro em um ponto de interrogação que você possa:

$text = str_replace('?', '', utf8_decode($text));
Respondeu 03/01/2017 em 20:03
fonte usuário

votos
1

Adicione esta função ao seu variáveis ​​utf8_encode ($ variável);

Respondeu 17/01/2017 em 11:16
fonte usuário

votos
0

Basta adicionar estas linhas antes de cabeçalhos.

Formato exato de .doc/docxarquivos serão recuperadas:

 if(ini_get('zlib.output_compression'))

   ini_set('zlib.output_compression', 'Off');
 ob_clean();
Respondeu 15/03/2017 em 05:13
fonte usuário

votos
1

Para fins globais.

Em vez de converter, codificar, decodifying cada texto eu prefiro deixá-los como eles são e, em vez alterar as configurações do usuário de PHP. Assim,

  1. Deixe os diamantes
  2. A partir do navegador, no menu vista selecione "codificação de texto" e encontrar o que lhe permite ver seu texto corretamente.
  3. Editar o seu php.ini e adicione:

    default_charset = "ISO-8859-1"

ou em vez de ISO-8859 aquele que se adapta à sua codificação de texto.

Respondeu 24/03/2017 em 13:42
fonte usuário

votos
0

Quando você extrair dados de qualquer lugar que você deve usar funções com o prefixo md_FUNC_NAME.

Teve o mesmo problema que me ajudou.

Ou você pode encontrar o código desse símbolo e usar expressão regular para excluir esses símbolos.

Respondeu 07/06/2017 em 10:25
fonte usuário

votos
-1

Vá para o seu phpmyadmin e selecione seu banco de dados e apenas aumentar o valor / comprimento do campo que da tabela para 500 ou 1000 ele vai resolver o seu problema.

Respondeu 26/08/2017 em 16:31
fonte usuário

votos
0

Isso irá ajudá-lo. Coloque isso dentro de <head>tag

<meta charset="iso-8859-1">
Respondeu 08/10/2017 em 17:21
fonte usuário

votos
0

Basta colar esse código em Iniciando para o topo da página.

<?php
header("Content-Type: text/html; charset=ISO-8859-1");
?>
Respondeu 06/05/2019 em 19:47
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more