Здравствуйте. Не смог найти нигде.
С помощью idHTTP получаю страничку в кодировке UTF-8, естественно если вставить этот текст к примеру в memo то там будут одни кракозябры. Как можно перевести текст из кодировки UTF-8 в WIN-1251? Или может надо копатся в настройка idHTTP?
Заранее спасибо!
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
03-11-2014 12:30
А если писать обратную, то, видимо будет что-то такое, исходя из принципа преобразования:
$C0..$DF,$E0..$FF:pR^:=Wrd+$0350;
значит, обратный процесс - все двухбайтные значения
($0350+$C0)..($0350+$DF),($0350+$E0)..($0350+$FF)
преобразовать, вычтя из них $0350. Но могут быть нюансы
Понял, Вы не о той функции...
Вот эти посмотрите:
WideCharToMultiByte
MultiByteToWideChar
- перевод между юникодом и Ansi, а в дополнение - функции преобразования с UTF8
>>>А как наоборот преобразовать, то есть обратную функцию сделать?
1. Глянуть в справку. Если нет, то:
2. Подумать, а как могла бы называть обратная функция
3. Открыть исходники VCL и за 2 секунды найти обе функции, лежащие
в соседних строках
4. Прочитать данную ветку с самого начала
Ничего нормального и внятного не нашел, разобрался в сути проблемы, оказывается инди 10 на делфи 2009 не переводит в юникод, а только к тому что получает, второй байт каждого символа добивает нулями чтобы выровнять под 2 байта юникода. Для английского языка это нормально, а для всех остальных - смерть.
покопался и в итоге нашел элегантное решение замены испорченых русских символов в юникодовскую кодировку. (String- подразумевается UnicodeString, работает только для символов русского алфавита)
function RussianToUnicode(S: String): String;
var Wrd:Word;
pW,pR:PWord;
len:Integer;
begin
pW:=@S[1];
len:=Length(S);
SetLength(Result,len);
pR:=@Result[1];
while Len<>0 do begin
Wrd:=pW^;
case Wrd of
$C0..$DF,$E0..$FF:pR^:=Wrd+$0350;
else pR^:=Wrd;
end;
inc(pW);
inc(pR);
dec(Len);
end;
end;
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.