Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.12.18;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.013 c
6-1125722250
sunsay
2005-09-03 08:37
2005.12.18
Ограничить кол-во входящих соединений


14-1132869707
TStas
2005-11-25 01:01
2005.12.18
А стоит за С++ браться, если на дельфи всего несколько месяцев ..


2-1133173184
NILLO
2005-11-28 13:19
2005.12.18
SQL запрос


14-1132822312
HabarovSergey
2005-11-24 11:51
2005.12.18
Кто нибуть знает что это за компонеты для Delphi?


14-1132723017
Джо
2005-11-23 08:16
2005.12.18
Google Base





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский