Главная Новые темы Список тем Задать вопрос Поиск  

Форум "Delphi"


Паскаль, Делфи


 #0 ID © 27.07.06 15:50:18 - 02.08.06 15:11:33

UNICODE -> ANSI



Как, имея код символа в 16-ти ричной перевести в читаемую букву (ShowMessage(Chr(b)) - выдает крякозябрик)

Например


function HexToDec(const HexStr: string): integer;
var v, i: integer;
begin
     Result := 0;
     for i := 1 to Length(HexStr) do
     begin
       if HexStr[i] in ['0'..'9'] then v := Ord(HexStr[i]) - Ord('0') else
        if UpCase(HexStr[i]) in ['A'..'F'] then
         v := ord(UpCase(HexStr[i])) - Ord('A') - 10 else
        begin
          Result := 0;
          exit;
        end;
       Result := Result + v * Round(Power(16, Length(HexStr) - i));
     end;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
 b: integer;
begin
b:=HexToDec('0410');
ShowMessage(Chr(b));
end;



Функция HexToDec отрабатывает нормально ( на калькуляторе проверял :)  ) а вот буквы А нет.
На сколько я понимаю, необходимо конвертировать символ из UNICODE в ANSI
Подскажите, пожалуйста, как это сделать. Цитата

 #1 Deep © 27.07.06 16:41:57

{Convert string from UTF-8 format into ASCII}
function UTF8ToStr(Value: String): String;
var
  buffer: Pointer;
  BufLen: LongWord;
begin
  BufLen := Length(Value) + 4;
  GetMem(buffer, BufLen);
  FillChar(buffer^, BufLen, 0);
  MultiByteToWideChar(CP_UTF8, 0, (собачка)Value[1], BufLen - 4, buffer, BufLen);
  Result := WideCharToString(buffer);
  FreeMem(buffer, BufLen);
end;

{Convert string from UTF-8 format mixed with standart ASCII symbols($00..$7f)}
function UTF8ToStrSmart(Value: String): String;
var
  Digit: String;
  i: Word;
  HByte: Byte;
  Len: Byte;
begin
  Result := '';
  Len := 0;
  if Value = '' then Exit;
  for i := 1 to Length(Value) do
  begin
    if Len > 0 then
    begin
      Digit := Digit + Value[i];
      Dec(Len);
      if Len = 0 then
        Result := Result + UTF8ToStr(Digit);
    end else
    begin
      HByte := Ord(Value[i]);
      if HByte in [$00..$7f] then       //Standart ASCII chars
        Result := Result + Value[i]
      else begin
        //Get length of UTF-8 char
        if HByte and $FC = $FC then
          Len := 6
        else if HByte and $F8 = $F8 then
          Len := 5
        else if HByte and $F0 = $F0 then
          Len := 4
        else if HByte and $E0 = $E0 then
          Len := 3
        else if HByte and $C0 = $C0 then
          Len := 2
        else begin
          Result := Result + Value[i];
          Continue;
        end;
        Dec(Len);
        Digit := Value[i];
      end;
    end;
  end;
end;
 #2 ID © 27.07.06 17:37:54

a UTF-16 в String?
Пробовал через WidestringToString - не получилось
 #3 Ketmar © 27.07.06 17:43:09

а с какого испугу unicode-функция должна работать с UFT16? нет в Delphi стандартной для этого. есть для UTF8.
 #4 ID © 27.07.06 18:02:08

я предполагал что
WideChar - Unicode character set, размером 2 байта
Есть функция WideCharToString.
Но не работает. Наверное так оно и есть :)

Может у кого есть готовая функция по переаоду UTF-16 в String, сбросьте, пожалуйста I_D(собачка)mail.ru
 #5 Deep © 27.07.06 18:12:58

> #2   ID ©
гм.... копать нужно где-то здесь...
 #6 Ketmar © 27.07.06 21:52:20

а погуглить лениво?
 #7 Deep © 28.07.06 10:06:51

> #6   Ketmar ©
гы... и зачем задавать себе риторические вропросы?    
 #8 ID © 28.07.06 12:11:10

а с какого испугу unicode-функция должна работать с UFT16? нет в Delphi стандартной для этого. есть для UTF8.

ЛЕНЬ - ДВИГАТЕЛЬ ПРОГРЕССА!!!
Лень писать свою функцию. Нашел с Делфях.
Правда сделано "в лоб", но работает.

...
function KOI8_RToUTF16Str(const S: string):wideString;
и др...

Найдено в модуле C:\Program Files\Borland\Delphi7\Source\Xml\xdom.p­as
 #9 ID © 28.07.06 16:33:29

в конечном результате обошелся без юнита xdom.
Решил вопрос таким образом:

procedure TForm1.BitBtn1Click(Sender: TObject);
var
 b: integer;
 a : PWideString;
 c: Char;
 d: string;
 e: PWideChar;
begin
b:=HexToDec('0410'); // 0410H код буквы А
New(e);
e^:=WideChar(b);
d:=WideCharToString(e);
ShowMessage(d); // на екран выводится буква А
...
 #10 maximus © 01.08.06 08:12:56

У меня так реализованно:

s1 := '$0410';
s := StrToInt(s1);
x := WideCharToString((собачка)s);

ShowMessage(x);
 #11 ID © 02.08.06 15:11:33

#10  maximus
Согласен, так лучше. У сбея переделал на этот вариант.




  • Написать ответ

    Имя: Регистрация HTML?
    smiles смайлики
    Потом перейти в:    
    паутина



      ©  webest.net, 2002-2007  

    top.mail.ru
    » Бесплатный счетчик посещений
    » Рейтинг сайтов