Главная страница
    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.46 MB
Время: 0.012 c
4-1129578335
Rianon
2005-10-17 23:45
2005.12.18
Dll и использование немодальных форм в них


2-1132911245
Рафик
2005-11-25 12:34
2005.12.18
Дерево


4-1129707209
kolos_rus
2005-10-19 11:33
2005.12.18
Блокировка клавиатуры и мыши


2-1133377141
kraim
2005-11-30 21:59
2005.12.18
ID жесткого


2-1133602150
kop
2005-12-03 12:29
2005.12.18
Свойство





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский