Jump to content
Sign in to follow this  
ruimcosta

Codificação caracteres não latinos

Recommended Posts

ruimcosta

Biba,

Cá vai uma pergunta para 1 euro:

Estou a desenvolver um site em 10 idiomas, desde o Português ao chinês.  ATé aqui quase tudo bem. Tenho a tabela de mysql em utf8_general_ci e o site até funciona bem...ou quase.

A questão é que tenho uma tabela de conteúdos em que por enquanto não há o texto de apresentação traduzido e por isso o meu boss teima em querer que o texto apareça, mesmo nos outros idiomas, em português.

Como tenho de alterar o collation da tabela quando faço o select e como altero o charset quando carrego os textos do respectivo idioma, o texto em português passa-se nas letras com acentos. Ja testei com o utg8_encode e decode, já tentei alterar o charset apenas para aquele bloco de código, alterar o collation antes de seleccionar o texto...e nada.

Alguma ideia?


Abraços e beijinhos,Rui Costa

Share this post


Link to post
Share on other sites
Lfscoutinho

Boas,

Porque tem vários collections? Porque não usas tudo igual (utf8)?

Depois, os ficheiros codificas como UTF8 também e pronto... Ou então não percebi nada da tua dúvida :s

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

Cá vai uma pergunta para 1 euro:

Olha alguém armado em Manzarra ;)

Estou a desenvolver um site em 10 idiomas, desde o Português ao chinês.  ATé aqui quase tudo bem. Tenho a tabela de mysql em utf8_general_ci e o site até funciona bem...ou quase.

Começaste bem :) UTF8 para multilingua é o melhor...

A questão é que tenho uma tabela de conteúdos em que por enquanto não há o texto de apresentação traduzido e por isso o meu boss teima em querer que o texto apareça, mesmo nos outros idiomas, em português.

Certo... isso não é uma questão de tradução nem de collations... É uma questão de verificares na aplicação "Se não tiver o texto na língua definida (chinês, árabe, inglês, criolo) mostra o da Tuga".

Como tenho de alterar o collation da tabela quando faço o select e como altero o charset quando carrego os textos do respectivo idioma, o

O QUÊ!?!?!?!? Tu alteras a collation sempre que fazes o select ?!?! Diz-me que isso tem uma razão sem ser o suporte para 'várias línguas'.

texto em português passa-se nas letras com acentos. Ja testei com o utg8_encode e decode, já tentei alterar o charset apenas para aquele bloco de código, alterar o collation antes de seleccionar o texto...e nada.

As funções utf8_encode e utf8_decode serve, como o próprio nome indica, para codificar e/ou descodificar de ou para utf8. No teu caso, de mudares a collation, certos dados ficaram da última collation (sendo lixo electrónico desnecessário) que não são convertíveis em caracteres válidos :)

Pensa bem no que estás a fazer... alterar a collation antes (ou depois) de um select, por norma, não é NADA prático.

Share this post


Link to post
Share on other sites
isapinhal

texto em português passa-se nas letras com acentos.

Para qualquer letra vinda da BD com acentos, till ou caracteres especiais, seja em que lingua for usa html_entity_decode('String')

Eu ja tentei todos as outras funçoes mas ésta é sem problemas, eu ja nunca mais tive nenhum.

Cumprimentos

IsaPinhal

Share this post


Link to post
Share on other sites
ruimcosta

Bom,

Antes de mais, obrigado.

Bem começo do zero com um teste:

DROP TABLE IF EXISTS `idiomas`;
CREATE TABLE IF NOT EXISTS `idiomas` (
  `id` int(100) NOT NULL auto_increment,
  `idioma` varchar(50) NOT NULL,
  `abrev` varchar(50) NOT NULL,
  `codif` varchar(80) NOT NULL,
  `c` varchar(80) default NULL COMMENT 'character',
  `n` varchar(80) default NULL COMMENT 'names',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=445 DEFAULT CHARSET=utf8;

# Dumping data for table net1810_comercio.idiomas: 10 rows
DELETE FROM `idiomas`;
/*!40000 ALTER TABLE `idiomas` DISABLE KEYS */;
INSERT INTO `idiomas` (`id`, `idioma`, `abrev`, `codif`, `c`, `n`) VALUES
(1, 'Português', 'PT', 'iso-8859-1', 'SET CHARACTER SET iso-8859-1', 'SET NAMES latin1'),
(2, 'French', 'FR', 'iso-8859-1', 'SET CHARACTER SET iso-8859-1', 'SET NAMES latin1'),
(4, 'English', 'EN', 'iso-8859-1', 'SET CHARACTER SET iso-8859-1', 'SET NAMES latin1'),
(8, 'Español', 'ES', 'iso-8859-1', 'SET CHARACTER SET iso-8859-1', 'SET NAMES latin1'),
(3, 'Deutsch', 'AL', 'iso-8859-1', 'SET CHARACTER SET iso-8859-1', 'SET NAMES latin1'),
(9, 'Italiano', 'IT', 'iso-8859-1', 'SET CHARACTER SET iso-8859-1', 'SET NAMES latin1'),
(10, 'Română', 'RO', 'iso-8859-2', 'SET CHARACTER SET iso-8859-2', 'SET NAMES latin2'),
(5, 'русски', 'RU', 'windows-1251', 'SET CHARACTER SET CP1251', 'SET NAMES CP1251'),
(7, '葡语', 'CH', 'gb2312', 'SET CHARACTER SET gb2312', 'SET NAMES gb2312'),
(6, 'في اللغة الإنجليزية', 'AR', 'windows-1256', 'SET CHARACTER SET CP1256', 'SET NAMES CP1256');

Esta seria uma tabela para o teste:

O codigo poderá ser este:

<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

</head>
<body>
<?php
require_once "admin/connect.php";

$sql = "select idioma from idiomas";
$rs  = mysql_query($sql);

while( $row = mysql_fetch_array($rs) ){
    echo $row['idioma']."<br />";
}
?>
</body>
</html>

o connect apenas faz a ligação à bd.

Ao correr isto, não alterando charset nem collations como tinha ldio algures por aí, retorna isto:

Portugu�s

French

English

Espa�ol

Deutsch

Italiano

Rom�n?

??????

??

?? ????? ??????????

O que sugerem?


Abraços e beijinhos,Rui Costa

Share this post


Link to post
Share on other sites
Lfscoutinho

Boas,

O que eu disse, metes tudo como utf8, não precisas de alterar nada.

E, a página do PHP deve ter codificação UTF8. Não sei que programa usas, mas no Notepad++: Codificação - Converter para UTF-8. Caso uses outro e não souberes como se faz isso, podes fazê-lo simplesmente utilizando o bloco de notas: abre o ficheiro - guardar como - na codificação metes utf8.

Share this post


Link to post
Share on other sites
ruimcosta

Biba Luís,

Obrigado. A bd é a que mostrei em cima.

http://www.18-10.net/utf8/

Utilizo o phpdesigner e sim, já tinha colocado em utf8. Pelo sim e pelo não, como não sou casmurro, abrio o index.php e até o connect.php e gravei-os alterando a codificação para utf8.

Como podes ver no link acima, continua igual.

;)

Adicionei a imagem da estrutura da tabela. O que faltará?


Abraços e beijinhos,Rui Costa

Share this post


Link to post
Share on other sites
Lfscoutinho

Boas,

Muito estranho teres a BD em utf8 e a codificação dos ficheiros também e não funcionar.

Penso que te deves ter enganado em alguma coisa, mas tenta utilizar o utf8_encode() e vê o que te imprime... Se imprimir como devia, então enganaste-te em alguma coisa de certeza...

Share this post


Link to post
Share on other sites
ruimcosta

Apenas corrige os acentos nos idiomas latinos. OS restantes estão iguais como podes confirmar.

while( $row = mysql_fetch_array($rs) ){
    echo $row['abrev']." - ".utf8_encode($row['idioma'])."<br />";
}

Pegando nessa tabela, podes confirmar a teoria do utf8?

P.S. O testo em chinês, arabe, russo e romeno não estão guardados em formato unicode, mas tal e qual como sai do google translator.

Obrigado


Abraços e beijinhos,Rui Costa

Share this post


Link to post
Share on other sites
Lfscoutinho

Boas,

Tal como previ ! Tens aí alguma coisa mal, provavelmente não convertes-te o ficheiro para UTF8 correctamente.

Relativamente às outras línguas, sem certeza, talvez seja por não as teres instaladas no teu PC, não sei. Nisso já não te posso ajudar :s

Share this post


Link to post
Share on other sites
ruimcosta

Biba

Tal como previ ! Tens aí alguma coisa mal, provavelmente não convertes-te o ficheiro para UTF8 correctamente.

Notepad > Guardar Como > Codificação > UTF-8. Outra forma?

Relativamente às outras línguas, sem certeza, talvez seja por não as teres instaladas no teu PC, não sei. Nisso já não te posso ajudar :s

Utilizando a questão do collation correspondente ao idioma, antes de seleccionar o conteúdo e aplicando quando carrega a página o charset da página, consigo ver os caracateres no idioma correcto. Agora isto causa-me transtornos em algumas situações (utilizo jquery/ajax), além da repetição de código e queria saber se conseguir contornar isto com um método mais eficaz e simples.


Abraços e beijinhos,Rui Costa

Share this post


Link to post
Share on other sites
isapinhal

Experimenta isto...

while( $row = mysql_fetch_array($rs) ){
    echo $row['abrev']." - ".html_entity_decode($row['idioma'])."<br />";
}

Cumpz

Share this post


Link to post
Share on other sites
ruimcosta

Obrigado Isa,

Já tinha experimentado e está igual... :wallbash:


Abraços e beijinhos,Rui Costa

Share this post


Link to post
Share on other sites
isapinhal

Estranho a mim funciona na boa...

Se me lembrar de mais algo que te possa ajudar ca estarei para ajudar.

Cumprimentos

IsaPinhal ;)

Share this post


Link to post
Share on other sites
ruimcosta

Consegues preparar um exemplo o mais simples possível para testar deste lado?

Obrigado e bom fim de semana. Amanha volto. Vou descansar.


Abraços e beijinhos,Rui Costa

Share this post


Link to post
Share on other sites
Lfscoutinho

Boas,

O exemplo mais simples é abrires a página como o bloco de notas, gravar como e na codificação escolhes UTF8.

Pois, se a tua página tivesse codificada em utf8, ao utilizares a função utf8_encode(), por exemplo Português devia imprimir: Português. E, o que aconteceu foi que imprimiu correctamente, por isso, não está com codificação utf8.

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

Eu sugiro uma coisa antes de fazeres isso...

Onde tens:

require_once "admin/connect.php";

$sql = "select idioma from idiomas";
$rs  = mysql_query($sql);

Faz:

require_once "admin/connect.php";

mysql_query("SET NAMES 'utf8'");

$sql = "select idioma from idiomas";
$rs  = mysql_query($sql);

Testa e diz-me qualquer coisa ;)

Share this post


Link to post
Share on other sites
ruimcosta

Biba,

Após um fim de semana de descanso resolvi testar este tópico de raiz para que nada pudesse falhar.

Refiz a base de dados em utf8, inserção dos dados, os ficheiros em utf8, mas sem sucesso, visto que os caracteres não latinos apareciam como ?????.

Depois adicionei a dica do mAiN_iNfEcTiOn

mysql_query("SET NAMES 'utf8'");

e funcionou direito.

Obrigado a todo(a)s pela ajuda.


Abraços e beijinhos,Rui Costa

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.