Форум: "Основная";
Текущий архив: 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.46 MB
Время: 0.014 c