Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

StrToUTF8 и региональные установки [D7, Win2k, WinXP]


Esenin ©   (2005-11-10 14:10:00) 

Помогите люди добрые. Устал уже бороться с виндой =)
Значит написал безобидный peer2peer чатик, весь отправляемый текст пакую в utf8 и далее отправляю по сети. Использую функцию AnsiToUTF8. С другой стороны его получаю и все замечательно преобразую обратно. Но если у пользователя установлены региональные настройки не русские, то utf8 на той стороне распаковывается в иероглифы и точно также я получаю оттуда иероглифы. Что за зависимость такая и как уладить этот вопрос? Я уже нашел другую функцию, которая строку в utf8 преобразует и все ТОЖЕ самое. Бешуся уже =). Как избавится от этой зависимости региональных установок? Вот функция:
function StrToUTF8(Value: string): string;
var
 buffer: Pointer;
 BufLen: LongWord;
 lpBuf: Pointer;
begin
 BufLen := Length(Value) * 2 + 4;
 GetMem(buffer, BufLen); FillChar(buffer^, BufLen, 0);
 GetMem(lpBuf, BufLen); FillChar(lpBuf^, BufLen, 0);
 StringToWideChar(Value, buffer, BufLen);
 WideCharToMultiByte(CP_UTF8, 0, buffer, -1, lpBuf, BufLen, nil, nil);
 FreeMem(buffer, BufLen);
 Result := PChar(lpBuf);
 FreeMem(lpBuf, BufLen);
end;


А вот дамп пакетов:
- от меня при региональных установках слово "Привет" запаковано как надо:
d0 9f d1 80 d0 b8 d0 b2 d0 b5 d1 82


- а вот при не российских региональных установках то же самое слово "Привет" фиг знает во что запаковано:
c3 8f c3 b0 c3 a8 c3 a2 c3 a5 c3 b2


Помогите пожалуйста. Уже стало делом принципа =)


Vlad1m1r   (2005-11-25 20:50:00) [1]

всё, сам разобрался в своей ошибке.

var str : string
....
procedure TForm1.Button1Click(Sender: TObject);
begin
  str := UTF8Encode(TNTMemo2.Text);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
TNTMemo2.Text := UTF8Decode(str);
end;


Vlad1m1r   (2005-11-25 20:02:00) [2]

блин такая же трабла!!!!!!
фишка в чем-то другом, я использую юникодовские tnt контролы, где весь текст это WideString, и смотрите какая собака,
procedure TForm1.Button1Click(Sender: TObject);
begin
 TNTMemo1.Text := UTF8Encode(TNTMemo2.Text);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 TNTMemo2.Text := UTF8Decode(TNTMemo1.Text);
end;

Итак когда региональные установки русские. В tntmemo2 написал по русски, далее жму на Button1. В Tntmemo1 записалось отображение текста в utf8, жму Button2 и все обратно перекодировалось без глюков в русское слово. Но если до того как нажать на Button2 указать региональные установки другой страны, то после нажатия на Button2 вместо русских букв ничего не видно, дебагер показывает мусор какойто за место русских букв. В чем же проблема? Какая тут связка? utf8 везде один, почему его по разному системы декодируют? куда копать?


Anatoly Podgoretsky   (2005-11-10 15:01:00) [3]

Да проблема именно в (ANSI <-> Unicode) -> VCL Controls


Esenin   (2005-11-10 14:55:00) [4]

Понял, значит проблема намного глубже, хммм. Да, надо будет один из предложенных способов попробовать. Спасибо.


Anatoly Podgoretsky   (2005-11-10 14:50:00) [5]

Esenin   (10.11.05 14:26) [2]
В UTF преобразовывается правильно, но что ты будешь делать на уровне ANSI, например в английском нет русских. Работать надо с Юникод, а не АНСИ, но Дельфи VCL не поддерживает Юникод, надо использовать постороннии компоненты. Кроме того и Win9x тоже не поддерживает Юникод.

Другой вариант перейти на HTML там Юникод поддержан во всех ОС и нет нужды связываться с VCL компонентами

Третий вариан переход на Delphi.NET/Delphi.C# там Юникод поддержан.


Esenin   (2005-11-10 14:26:00) [6]

так мне бы вначале хотя бы добиться того чтобы запаковать правильно в utf8 можно было бы и понять при чем здесь региональные установки вообще. ведь с обоих сторон текст русский, но функция пакует по разному. =(


jack128   (2005-11-10 14:20:00) [7]

а что хочешь??  Даже если ты сумеешь нормально преобразовать из/в Ansi но в любом случае ты не сможешь нормально ОТОБРАЗИТЬ эти строки используя стандартные VCL контролы.


Наверх

Титульная страница Поиск, карта сайта Написать письмо