Pergunta

Sim, nós estamos falando sobre códigos ASCII. Meus appologies eu não sou o dev Delphi aqui.

Foi útil?

Solução

Para Delphi 7, eu ia ficar o Unicode Biblioteca livre por Mike Lischke que é o autor de Virtual Treeview.

O libary inclui uma série de funções de conversão para ir de e para Unicode, assim você pode usar as que fazem mais sentido em sua aplicação.

Ou você pode atualizar para Delphi 2009 que foi construído com codificação de rotinas, e sua própria biblioteca de funções de conversão.

Outras dicas

Vamos pegar algumas coisas em linha reta. conjunto de caracteres (charset) e caracteres codificações são dois conceitos relacionados, mas diferentes. Um conjunto de caracteres é uma lista abstrata de personagens com algum tipo de código de caracteres inteiro associado. Depois, há codificações de caracteres, que é basicamente um algoritmo que descreve como os caracteres são representados em bytes.

ASCII atua tanto como o conjunto de caracteres e codificação. Ele usa 7 bits para expressar 128 caracteres (94) para impressão. Unicode por outro lado, é um conjunto de caracteres, expressando 1,114,112 pontos de código. Existem várias codificações para representar cadeias de caracteres Unicode, mas a maioria também notáveis ??são UTF-8, UTF-16, UTF-16LE e UTF-32. Em outras palavras, um único caractere Unicode pode ser representado de diferentes maneiras, dependendo das codificações.

Como posso converter caracteres Unicode para códigos ASCII em Delphi 7?

Eu acho que a questão poderia ser interpretado de duas maneiras.

  1. Eu tenho uma seqüência de caracteres Unicode em alguns codificação que inclui apenas caracteres ASCII imprimíveis. Como posso converter a string em um array de bytes de codificação ASCII?

  2. Eu tenho uma seqüência de caracteres Unicode em alguns codificação que também inclui não-ASCII caracteres imprimíveis, tais como caracteres chineses. Como posso codificar a string em uma codificação ASCII sem perder informações, e depois decodificá-lo de volta para a cadeia Unicode original?

Se você quer dizer a primeira, você pode carregar a seqüência de caracteres Unicode em WideString como Osman está dizendo e fazer

var
  original: WideString;
  s: AnsiString;
begin
  s := AnsiString(original);

Se você quer dizer a segunda, você precisaria de um algoritmo de codificação genérico como Base64 codificação. Você pode usar DCPBase64.pas incluído no de David Barton DCPcrypt v2 Beta 3 .

Depende do que a sua definição de conversão é. Se você deseja mapear os 127 mais caracteres para o equivalente Unicode, você pode usar uma conversão explícita. Mas isso cria lixo se a cadeia contém caracteres superiores.

Se você quiser mapeamentos como E -> E e U -> u, você pode escrever seu próprio código. Mas esteja ciente de que sempre há personagens que não podem ser convertidos.

"ASCII" é o nome de um mapeamento específico de caracteres para números, mas algumas pessoas dizem "código ASCII" quando não o fazem ASCII realmente significa em absoluto; eles só querem o valor numérico de um personagem, seja qual for o mapeamento está em vigor no momento. Será que essa descrição se aplica a você?

Se sim, então você pode usar a função padrão Ord para obter o valor ponto de código Unicode de qualquer de caracteres Unicode que você tem.

var
  wc: WideChar;
  ws: WideString;
  x: Word;

x := Ord(wc);
x := Ord(ws[1]);

Se você realmente significava ASCII, porém, então você vai ter que ser mais específico sobre o tipo de conversão que você tem em mente.

Como exemplo, a letra A é representado em Unicode como U + 0041 e em ansi como apenas 41. Então converter que seria bastante simples, mas você deve saber como o personagem unicode é codificada. Os mais comuns são UTF-16 e UTF-8. UTF 16, é, basicamente, dois bytes por caracter, mas mesmo que é uma simplificação excessiva, como um personagem pode ter mais bytes. UTF-8 sons como se significa 1 byte por caractere, mas pode ser 2 ou 3. Para mais havendo complicar, UTF-16 pode ser pouco endian ou big endian. (L + 0041 + 4100 ou L).

Onde a sua pergunta não faz sentido é se você queria, por exemplo, converter a letra árabe ain U + 0639 como ansi em uma localidade Inglês. Você não pode.

ver questões sobre a conversão de Unicode para ASCII:

Em geral, o conjunto de caracteres de centenas de milhares de entradas não pode ser convertido para o conjunto de caracteres de 127 entradas sem alguma perda de informações ou esquema de codificação.

Você pode usar a função no http://swissdelphicenter.ch/en/showcode php? id = 1692
Converte seqüência de caracteres Unicode para ANSI cadeia usando página de código especificada.
Se você deseja converter usando página de código padrão do sistema (definido nas opções regionais como página de códigos não-unicode), você pode fazê-lo simplesmente como seguir:

var
  ws: widestring;
  s: string;
begin
  s:=string(ws)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top