Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.18;
Скачать: CL | DM;

Вниз

StrToUTF8 и региональные установки   Найти похожие ветки 

 
Esenin   (2005-11-10 14:10) [0]

Помогите люди добрые. Устал уже бороться с виндой =)
Значит написал безобидный 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


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


 
jack128 ©   (2005-11-10 14:20) [1]

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


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

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


 
Anatoly Podgoretsky ©   (2005-11-10 14:50) [3]

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

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

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


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

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


 
Anatoly Podgoretsky ©   (2005-11-10 15:01) [5]

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


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

блин такая же трабла!!!!!!
фишка в чем-то другом, я использую юникодовские 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 везде один, почему его по разному системы декодируют? куда копать?


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

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

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;



Страницы: 1 вся ветка

Текущий архив: 2005.12.18;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.039 c
2-1133717060
SergP
2005-12-04 20:24
2005.12.18
Tmemo и TListView на TNotebook = Страшные Глюки


1-1132221617
Максим
2005-11-17 13:00
2005.12.18
Как узнать, какие модули из проекта войдут в приложение?


14-1132490094
AlexShm
2005-11-20 15:34
2005.12.18
7-я или 8-я?


14-1132996973
Антон773
2005-11-26 12:22
2005.12.18
новости мира компонент


2-1133213003
Fl@sh
2005-11-29 00:23
2005.12.18
Связь между двумя таблицами программно, как??