Converter ´#32´ para 32

Delphi

29/08/2005

Olá! Tenho no meu banco de dados em uma determinada tabela (em um campo varchar) o código de um caractere. Por exemplo: a string ´32´.
Existe algum modo de em tempo de execução converter essa string para o caractere 32?

Falows!


Delphi32

Delphi32

Curtidas 0

Respostas

Massuda

Massuda

29/08/2005

Existe algum modo de em tempo de execução converter essa string para o caractere 32?
Retire o caractere da string usando a procedure Delete, converta o que sobrou da string para um valor integer usando StrToInt e use a função Chr para obter o caractere equivalente ao valor integer.


GOSTEI 0
Delphi32

Delphi32

29/08/2005

esqueci de mencionar um detalhe. estou trabalhando com WideStrings. Tem como fazer também?

E também estou tendo problemas para fazer o inverso (converter 32 para ´32´ ou parecido). achei que ia conseguir, mas não estou.

até!


GOSTEI 0
Rjun

Rjun

29/08/2005

esqueci de mencionar um detalhe. estou trabalhando com WideStrings. Tem como fazer também?


Funciona, da mesma forma que o Massuda explicou.

E também estou tendo problemas para fazer o inverso (converter 32 para ´32´ ou parecido). achei que ia conseguir, mas não estou.


De onde você vai obter esse valor, 32?


GOSTEI 0
Massuda

Massuda

29/08/2005

...E também estou tendo problemas para fazer o inverso (converter 32 para ´32´ ou parecido).
Para um valor char C qualquer...
var
  C: Char;
  S: string;
...
  S := ´´ + IntToStr(Ord(C));
...



GOSTEI 0
Delphi32

Delphi32

29/08/2005

Vejam só o que aconteceu:

[url]http://www.geocities.com/delphirj/caracter.jpg[/url]

No projeto tenho (como pode ser visto na foto) um tntEdit (Edit que suporta Unicode - [url]http://www.tntware.com/delphicontrols/unicode[/url]), um botão, um edit comum e outro tntEdit. No primeiro tenho um caractere japonês. Quando pressiono o primeiro botão ele retorna o código correto para aquele caractere, mas quando mando converter o código de volta para caracter fica errado. Como mostrado na figura, ele retorna o caractere ´B´. Para converter a letra no primeiro edit para inteiro e jogar no edit usei o seguinte código:

var c:WideChar;
begin
   c := TntEdit1.Text[1];
   Edit1.Text := IntToStr(Ord(C));
end;


Para converter o inteiro de volta estou usando o seguinte código:

begin
   tntEdit2.Text := Chr(StrToInt(Edit1.Text));
end;


Tentei fazer o seguinte:

var s:widechar;
begin
   s := Chr(StrToInt(Edit1.Text));
   tntEdit2.Text := s;
end;


Mas também não funciona porque Chr retorna Char enquanto a variável é WideChar. Acho que o problema está justamente aí. tntEdit2.Text retorna uma WideString enquanto Chr está retornando Char...

Alguma idéia do que eu possa fazer? Thx pela ajuda!

Até!


GOSTEI 0
Martins

Martins

29/08/2005

Com o código q o [b:a9879a8c85]Massuda[/b:a9879a8c85] postou!!!

proc...  TForm1.ButtonxClick(S... : T...);
var
  C: Char;
  S: string;
begin
  C:=´!´;
  S := ´´ + IntToStr(Ord(C));
  ShowMessage(S);
end;


ou assim

proc.... TForm1.ButtonxClick(S... : T...);
var
  C: Char;
  S: string;
begin
  C:=32;
  S := ´´ + IntToStr(Ord(C));
  ShowMessage(S);
end;



GOSTEI 0
Martins

Martins

29/08/2005

Olha só!!

Talvez esses códigos de ajudem, eles possam te dar uma luz.

{:Converts Unicode string to Ansi string using specified code page.
  @param   ws       Unicode string.
  @param   codePage Code page to be used in conversion.
  @returns Converted ansi string.
}

function WideStringToString(const ws: WideString; codePage: Word): AnsiString;
var
  l: integer;
begin
  if ws = ´ then
    Result := ´
  else 
  begin
    l := WideCharToMultiByte(codePage,
      WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR,
      @ws[1], - 1, nil, 0, nil, nil);
    SetLength(Result, l - 1);
    if l > 1 then
      WideCharToMultiByte(codePage,
        WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR,
        @ws[1], - 1, @Result[1], l - 1, nil, nil);
  end;
end; { WideStringToString }


{:Converts Ansi string to Unicode string using specified code page.
  @param   s        Ansi string.
  @param   codePage Code page to be used in conversion.
  @returns Converted wide string.
}
function StringToWideString(const s: AnsiString; codePage: Word): WideString;
var
  l: integer;
begin
  if s = ´ then
    Result := ´
  else 
  begin
    l := MultiByteToWideChar(codePage, MB_PRECOMPOSED, PChar(@s[1]), - 1, nil, 0);
    SetLength(Result, l - 1);
    if l > 1 then
      MultiByteToWideChar(CodePage, MB_PRECOMPOSED, PChar(@s[1]),
        - 1, PWideChar(@Result[1]), l - 1);
  end;
end; { StringToWideString }


Espero q possa lhe ser útil.


GOSTEI 0
Delphi32

Delphi32

29/08/2005

Seguinte: O código ainda não funciona. O resultado ainda é o mesmo. Ele me retorna a letra ´B´ ao invés do caracter original. Veja na figura o que está acontecendo: [url]http://www.geocities.com/delphirj/caracter.jpg[/url].

Troquei o código que estava usando:

tntEdit2.Text := Chr(StrToInt(Edit1.Text));

pelo mesmo usando a função do post anterior:

tntEdit2.Text := StringToWideString(Chr(StrToInt(Edit1.Text)),0);

mas mesmo assim o resultado ainda é o mesmo. continua retornando a letra ´B´ ao invés do caracter correto. Dois detalhes:

1) Eu posso afirmar que o código inteiro retornado é o código correto para o caractere porque quando vejo o dfm do form é exatamente esse valor que consta ao lado da propriedade Text do TntEdit, logo, certamente o erro acontece na hora de converter o inteiro de volta para caracter.

2) No código acima, quando passei a usar a função StringToWideString eu passei como parâmetro 0 (zero) para CodePage, mas eu testei vários outros valores, mas em todos os testes o resultado foi o mesmo. Retornou o caractere ´B´ ao invés do caractere correto.


GOSTEI 0
Massuda

Massuda

29/08/2005

Talvez seja mais simples...
begin
   tntEdit2.Text := WideChar(StrToInt(Edit1.Text));
end;



GOSTEI 0
Martins

Martins

29/08/2005

Talvez seja mais simples...
begin
   tntEdit2.Text := WideChar(StrToInt(Edit1.Text));
end;


Funciona bem essa solução, blz [b:39c76df8d4]Massuda[/b:39c76df8d4]


GOSTEI 0
Delphi32

Delphi32

29/08/2005

ok!!!! realmente funcionou perfeitamente... valeu mesmo!!!

mas eu queria aproveitar esse tópico para tirar uma outra dúvida. Está ocorrendo um fato curioso:

na verdade o motivo disso tudo é pq eu tinha que gravar no meu banco de dados (FB 1.5) palavras em unicode. Criei o banco de dados com charset UNICODE_FSS. usei os componentes para banco de dados da Tnt (TntDBEdit) para tentar gravar os dados no banco. Na hora de escrever os caracteres no tntDBEdit tudo funciona corretamente, mas quando dou post o texto do edit passa a ser ´??????´. É como se o banco ainda estivesse rejeitando o UNICODE apesar do charset... Por causa disso ao invés de gravar a palavra estou gravando os códigos dos caracteres em um campo varchar (´143541435514675´) e em tenpo de execução converto e jogo em um tntEdit comum, mas eu queria saber se há um modo de inserir isso direto no banco de dados??? já procurei no google por firebird com unicode mas não encontrei nada... e os componentes da tnt não possuem um help ou coisa do tipo. nem no site...

alguém poderia me dar uma luz :?:

até!


GOSTEI 0
POSTAR