Entendendo Unicode para migrar sua aplicação Delphi

Um grande desafio para nossa equipe de R&D foi incorporar o suporte a Unicode em toda a VCL, conseqüentemente no IDE, uma vez que Delphi é feito em Delphi.

Durante todo o desenvolvimento do Delphi 2009, tivemos reuniões com várias empresas desenvolvedoras de componentes e Allen Bauer, Delphi Chief Scientist, através do seu blog comentou sobre o suporte a Unicode. Estas iniciativas foram fundamentais para permitir que componentes de terceiros estejam disponíveis rapidamente para o Delphi 2009 e informar aos desenvolvedores como trabalhar com Unicode.

Unicode é um padrão que permite aos computadores representar e manipular, de forma consistente, texto de qualquer sistema de escrita existente.

The Unicode Standard: Version 5.0. 5. ed. Addison-Wesley Professional, 2006. 1472 p

Diversos conjuntos de caracteres como chineses, japoneses, russos e outros de origem asiáticas são representados através de Unicode, utilizando, na maioria dos casos, sistemas de mapeamento e codificação UTF (Formato de Transformação Unicode) e UCS (Conjunto Universal de Caracteres). Para maiores detalhes sobre Unicode, recomendo o seguinte link: http://pt.wikipedia.org/wiki/Unicode.

O resultado foi um Delphi 100% Unicode, sem exceção. Você deve estar se perguntando, a migração é tranqüila? Podemos dizer que sim, muita coisa foi tratada pela VCL e pelo compilador.

Uma das grandes mudanças foi nos tipos String, que anteriormente era baseado em padrão ANSI. Agora estão baseadas em padrão UNICODE. Os tipos AnsiString e WideString continuam funcionando da mesma forma, exceto para tamanho de dados.

Resumo das mudanças para Unicode:

  • String mapeia UnicodeString e não mais AnsiString
  • Char agora mapeia WideChar (2 bytes e não 1 byte) e é um caractere UTF-16
  • PChar mapeia PWideChar
  • AnsiString mapeia o antigo tipo String

Não ocorreram mudanças:

  • AnsiString
  • WideString
  • AnsiChar, PAnsiChar
  • Short String contém elementos AnsiChar
  • Conversões implícitas continuam funcionando
  • O editor de código controla o modo de gravação (Unicode vs AnsiString), ambos continuam sendo suportados.

Operações que não dependem do tamanho do caractere:

  • Concatenação de Strings
  • Funções padrão para manipulação de Strings, exemplo: Lenght, Copy, Pos e outras.
  • Operadores, exemplos: <string> <op. de comparação> <string>, CompareStr(), CompareText(), etc.
  • FillChar ( <struct or memory> )
  • Windows API

Operações que envolvem tamanho de caractere em bytes, talvez requeiram algumas mudanças, nada complicado, aqui vai uma dica, verifique código onde você:

  1. Assume que o Sizeof (Char) é 1.
  2. Assume que o tamanho de uma string é igual ao número de bytes na string.
  3. Manipula diretamente String ou PChars.
  4. Grava ou lê string de/para um arquivo.

Os itens 1 e 2 não valem para Unicode, porque para Unicode Sizeof (Char) são 2 bytes e o tamanho de uma string é duas vezes o número de bytes. Além disso, o código que lê e grava arquivos precisa entender o número correto de bytes para efetuar estas operações, pois um caractere não é mais representando por 1 byte.

Como vocês podem ver, a migração é muito tranqüila. O benefício de suportar Unicode é permitir que o desenvolvedor Delphi distribua as suas aplicações em todo o mundo. O Brasil hoje é um dos grandes desenvolvedores de software mundiais. Diversas empresas brasileiras distribuem as suas aplicações na China, Japão, Rússia e outros Países onde Unicode é fundamental.

Em 2007, o governo Russo adquiriu 1 milhão de licenças de Delphi, que serão utilizadas para ensinar alunos do 1º e 2º graus a desenvolver software com Delphi. Portanto, o suporte a Unicode é fundamental naquele País.

Para ajudar a conhecer todos os recursos do Delphi 2010 e auxiliar na migração disponibilizamos o RAD Studio Migration Center, onde você encontrará diversos materiais, como artigos e vídeos, divirtam-se.

4 respostas
  1. Ronnei
    Ronnei says:

    Olá Adriano, obrigado pelo POST, me ajudou a entender alguns problemas, eu adquiri o Xe3 e estou migrando minhas aplicações e me deparei com um problema em relação ao Unicode. Eu tem uma função que rotaciona bits de uma string para “embaralhar” alguns dados importantes, esses dados são gravados embaralhados no BD (Firebird), porém quando uso o Delphi Xe3 percebi que quando eu gravo uma informação embaralhada no BD ele “estraga” a informação, acredito que seja porque o BD grava em UTF, a mesma informação que eu consigo embaralhar e desembaralhar apenas com strings e showmessages quando gravada no BD retorna com caracteres errados. Você saberia me dizer o que fazer para que eu possa gravar essa informação no Firebird sem ter essa perda de dados?

    Agradeço desde já sua ajuda e seus post. Parabéns.

    Responder
  2. Fabricio
    Fabricio says:

    O Unicode pode ter sido bom por um lado, mas agora por outro tem várias coisas que não funcionam mais no Delphi, estou utilizando Delphi 2010 + ClientDataset + Oracle 11 para saber uma imagem em campo Blob e simplesmente não funciona mais, e não acho em lugar algum na Net como resolver.

    Você sabe me falar como eu procedo agora neste caso?

    Responder

Trackbacks & Pingbacks

  1. […] This post was mentioned on Twitter by Andreano Lanusse, Adriano Santos. Adriano Santos said: RT @andreanolanusse: Blog post: Entendendo Unicode para migrar sua aplicação Delphi http://bit.ly/8BI5sW #delphi […]

  2. […] o suporte a Unicode em todo o Delphi, caso você não esteja familiarizado com Unicode leia este post. Ao compilar sua aplicação alguns avisos (warning) serão emitidos pelo compilador, neste post […]

Deixe uma resposta

Want to join the discussion?
Feel free to contribute!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *


Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.