problema com UNICODE

Programação C em geral

Moderadores: 51, guest2003

problema com UNICODE

Mensagempor joao » 19 Jul 2009 16:12

Ola Pessoal

Mais uma vez eu to aqui pedindo ajuda. :)

O problema é que eu estou tendo problemas em usar UNICODE no meu código. Entenda como UNICODE o UCS-2.

Estou tentando fazer o meu programa aceitar qualquer linguagem. E neste caso, preciso transformar o que eu tenho em um simples ASCII para UNICODE.

O que eu estou usando é o wxwidgets, que roda em Windows e em Linux, por isso, para complicar um pouco mais, precisaria de uma ajuda para ambas as plataformas.

Entao, o que eu tentei fazer é começando tudo que é CHAR para WCHAR_T, já que UNICODE é 16 bits. Certo?

Mas estou tendo problemas em usar isso no Banco de Dados. Em dois deles:
- MYSQL: eu usava a função mysql_fetch_row(); para pegar o resultado em um define do tipo: MYSQL_ROW, mas isso está ainda retornando CHAR * ao invés de WCHAR_T. Pelo o que eu li na internet. não se pode usar UNICODE no MYSQL e é preciso fazer algumas conversões antes. Alguém poderia me explicar mais sobre isso?

- SQLITE: O SQLITE tem funções para suporte ao UNICODE, mas tanto para gravar como para ler, eu estou recebendo ? no lugar do acento. Por exemplo: João é salvo como Jo?o e mesmo que eu mude na mão usando um executável do SQLITE, ele retorna como Jo?o. Alguém pode me ajudar neste também?

Agradeço bastante a ajuda de vocês!

Falta agora apenas mais duas etapas para conseguir terminar a primeira versão aqui da empresa e essa é uma etapa inteira que está me tirando o sono a um bom tempo! :(

[]'s
Como já diria um grande amigo: Só sei que nada sei!!!
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor ivan » 19 Jul 2009 19:12

O link a seguir serve para a versão 5.0:

http://dev.mysql.com/doc/refman/5.0/en/ ... icode.html

Ajuda em algo?
Qual a versão q vc usa? Como está definida a coluna q vc está armazenando os dados em UNICODE?
"A mente que se abre a uma nova idéia jamais volta ao seu tamanho original." (Albert Einstein).
Avatar do usuário
ivan
Word
 
Mensagens: 618
Registrado em: 12 Out 2006 21:27

Mensagempor polesapart » 19 Jul 2009 21:59

Do manual do mysql, acima:
UCS-2 cannot be used as a client character set, which means that SET NAMES 'ucs2' does not work. (See Section 9.1.4, “Connection Character Sets and Collations”.)

Acho que ele até armazena em UCS-2, mas aparentemente o cliente precisa usar outro encoding pra conversar com o myqsl ...

http://forums.mysql.com/read.php?103,64167,66887#msg-66887

[]s!
Warning: time of day goes back (-163479us), taking countermeasures. :)
Avatar do usuário
polesapart
Byte
 
Mensagens: 477
Registrado em: 19 Nov 2007 12:56
Localização: Curitiba

Mensagempor joao » 20 Jul 2009 06:00

Ola a todos!

Olha, eu acabei de ver no manual do MySQL5.0 que ele tem suporte ao UCS-2
http://dev.mysql.com/doc/refman/5.0/en/ ... icode.html

Ainda não testei, mas o meu amigo disse que para ler o valor em UCS-2(Já que ele consegue salvar em UCS-2), o resultado do row = mysql_fetch_row(m_Res);, que é do tipo MYSQL_ROW row; precisa apenas ser feito um cast para wchar_t, já que ele retorna na verdade um tipo void *.
Vou testar aqui e comento mais para vocês depois.

E sobre o SQLITE? ALguém já trabalhou com ele antes? Fez algo em UNICODE com ele?

[]'s
Como já diria um grande amigo: Só sei que nada sei!!!
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor ivan » 20 Jul 2009 09:24

MYSQL_ROW row;
unsigned int num_fields;
unsigned int i;

num_fields = mysql_num_fields(result);
while ((row = mysql_fetch_row(result)))
{
unsigned long *lengths;
lengths = mysql_fetch_lengths(result);
for(i = 0; i < num_fields; i++)
{
printf("[%.*s] ", (int) lengths[i],
row[i] ? row[i] : "NULL");
}
printf("\n");
}

extraido de:
http://dev.mysql.com/doc/refman/5.1/en/ ... h-row.html



O cast será feito somente na coluna que guarda UCS2! A menos q vc tenha uma única coluna(campo de registro) no seu registro de BD, o q eu não acredito.
Pq vc não cria uma struct como um ponteiro e aponta direto, pegando o campo desejado?
"A mente que se abre a uma nova idéia jamais volta ao seu tamanho original." (Albert Einstein).
Avatar do usuário
ivan
Word
 
Mensagens: 618
Registrado em: 12 Out 2006 21:27

Mensagempor joao » 20 Jul 2009 10:15

Ola Ivan,

Esse exemplo não seria para um char? Porque eu to usando printf ao invés de um wprintf?
Não entendi direito a linha:
Código: Selecionar todos
printf("[%.*s] ", (int) lengths[i], row[i] ? row[i] : "NULL");


Porque para mim parece que está faltando uma porcentagem(%d), já que são dois parametros passados para o printf(na verdade 3, sendo que o primeiro é o "...", o segundo um int e o terceiro um void*).

Se o que eu disse ali em cima está certo, então, na verdade eu to usando assim, mas o meu erro foi que eu achava que o row retornava um char, mas na verdade ele retorna um void*, logo eu posso ter um wchar_t*, desde que eu tenha salvo como tal.
Como já diria um grande amigo: Só sei que nada sei!!!
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor ivan » 20 Jul 2009 11:31

Sim, os campos são char. Mas em um BD, não sei se é o seu caso, podem ter vários tipos dados:
VARCHAR, DATE, IDs sequenciais, INTs, LONG, etc...

Posta a definição da tabela, pois os tipos descritos na tabela são tipos a serem impressos. Uma linha(row) é registro e os campos do registro são as colunas descritas na tabela.
Por isso que costumo fazer um typedef de uma struct e crio um ponteiro com ela para acesso direto aos campos já nos tipos certos.
"A mente que se abre a uma nova idéia jamais volta ao seu tamanho original." (Albert Einstein).
Avatar do usuário
ivan
Word
 
Mensagens: 618
Registrado em: 12 Out 2006 21:27

Mensagempor joao » 20 Jul 2009 11:55

Então,

EU acho que o único que eu posso usar é o VARCHAR. é um nome, então eu to criando usando:
name VARCHAR(50) NOT NULL,

Na verdade, no link que eu passei antes, está escrito quemesmo para UCS-2 deve-se usar CHAR ou VARCHAR, sendo que char armazena 4 bytes e VARCHAR armazena até 4bytes, o que significa que eu sei passar apenas 2bytes, vai ser apenas 2bytes, e não 4bytes que nem no char.

Ta certo isso? Esse é o tipo que eu deveria usar?

[]'s
Como já diria um grande amigo: Só sei que nada sei!!!
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor ivan » 20 Jul 2009 14:59

CREATE TABLE t
(
c1 VARCHAR(20) CHARACTER SET utf8,
c2 TEXT CHARACTER SET latin1 COLLATE latin1_general_cs
);


A tabela acima para armazenar UNICODE no campo c1 teria que ser criada ou alterada como abaixo:

CREATE TABLE t
(
c1 VARCHAR(20) CHARACTER SET ucs2,
c2 TEXT CHARACTER SET latin1 COLLATE latin1_general_cs
);


Pois o default é utf8, segundo:
http://dev.mysql.com/doc/refman/5.1/en/ ... rview.html
"A mente que se abre a uma nova idéia jamais volta ao seu tamanho original." (Albert Einstein).
Avatar do usuário
ivan
Word
 
Mensagens: 618
Registrado em: 12 Out 2006 21:27

Mensagempor joao » 20 Jul 2009 15:53

Valeu Ivan,

Agora entendi o que eu preciso fazer...

Muito obrigado pela ajuda,
Joao
Como já diria um grande amigo: Só sei que nada sei!!!
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21


Voltar para Visual C++/C/C++/C#

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x