forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Основной форум (http://forum.boolean.name/forumdisplay.php?f=49)
-   -   Непонятки с кодировкой... (http://forum.boolean.name/showthread.php?t=5202)

inlanger 06.12.2007 00:39

Непонятки с кодировкой...
 
Написал программу, которая берёт новости с моего сайта. Сайт отдаёт данные в кодировке UTF-8. MP, как я понял, принимает их именно в этом формате.
Но вот только принимаю я крякозябры. Кракозябры вида, как будто я просматриваю страницу через кодировку WESTERN.
Вот ссылка на страницу http://sportmobile.net/news_p.php?type=world&num=1&t=1
прога тут: http://sport.inlanger.org.ua/104038_sportmobile.zip

Bruteo 06.12.2007 02:43

Re: Непонятки с кодировкой...
 
Попробуй отправлять с сервера заголовок с указанием кодировки

Kurdt 06.12.2007 16:51

Re: Непонятки с кодировкой...
 
пробуй
Код:

function Str2UTF8(s: string):string;

var i: integer; a : string;

begin

a:='';

for i:= 0 to Length(s) do

if GetChar(s, i) > '~' then a:= a + Chr(Ord(GetChar(s, i)) - 64432)

else a:= a + GetChar(s, i);

Str2UTF8:= Copy(a, 0, Length(a)-1);

end;


inlanger 06.12.2007 21:04

Re: Непонятки с кодировкой...
 
хм...теперь выдаёт одни квадраты.

Kurdt 06.12.2007 22:31

Re: Непонятки с кодировкой...
 
1251 юзай

inlanger 07.12.2007 00:27

Re: Непонятки с кодировкой...
 
в программе или на сайте?

Kurdt 07.12.2007 03:20

Re: Непонятки с кодировкой...
 
Цитата:

Сообщение от inlanger
в программе или на сайте?

*** чувак эксперементируй децыл глянь какие коды символов отдает. дело 5 минут.

давай без мата, а?

inlanger 08.12.2007 18:45

Re: Непонятки с кодировкой...
 
ппц...вроде форум для того, чтобы помогать, а не наезжать и флудить...

jkeks 26.06.2008 13:32

Ответ: Непонятки с кодировкой...
 
Отправляю и в Win и в utf, принимаю без перекодировок - крокозябли, ставлю указанную функцию выше, получаю квадратики, когда UTF - вроде их в 2 раза больше, но английские буквы отображаются нормально, а русские никак не хотят показываться.Есть единственный вариант который я вижу - передавать все в Encoded виде %E3.. а на мобиле конвертить обратно, можно и из UTF конвертить. Может кто подскажет, это вендь неправильно, как сделать ПРАВИЛЬНО ?
У кого есть примеры ?

ViNT 26.06.2008 20:06

Ответ: Непонятки с кодировкой...
 
Что касается декодера, я бы сделал так:
Код:

uses hexdec;

function DecodeText(Src:string):string;
var
 T,B:String;
 I,SC:integer;
 C:Char;
 L:Integer;
begin
 L:=Length(Src);
 I:=0;
 T:='';
 while I < L do
 begin
  C:=GetChar(Src,I);
  if C<>'%' then
  begin
  T:=T+C;
  I:=I+1;
  end
  else
  begin
  B:='';
  B:=B+GetChar(Src,I+1);
  B:=B+GetChar(Src,I+2);
  SC:=hex2dec(B);
    T:=T+Chr(SC+848);
  I:=I+3;
  end;
 end;
 DecodeText:=T; 
end;

Исходный текст до кодирования должен быть в win-1251.

jkeks 27.06.2008 07:26

Ответ: Непонятки с кодировкой...
 
Вот все правильно, короче чтобы читать русские данные из интернета нужно сделать так:
1.Отправлять в Win-1251
2. Перед отправкой весь текст за URLEncode-ить (простые буквы не будут правильно отображаться, видимо потому что принимается только 7 бит, незнаю точно почему)
3. Приняв, нужно сделать URLDecode полученный текст
Последнее можно сделать с помощью библиотеки http://forum.boolean.name/showthread...ghlight=hexdec и указанной выше функцией.

Спасибо всем. Вижу русский текст на мобиле с интернета, Ура !

mizantrop 05.10.2008 16:47

Ответ: Непонятки с кодировкой...
 
а у меня вот такой исходник сработал:
Код:

function DecodeText(text:string) : string;
var i, len, cid, tilda:integer;
result,substr:string;
c:char;
work:boolean;
begin
        tilda := ord('~');
        len := length(text);
        result := text;
        for i := 0 to len - 1 do begin
                c := GetChar(text, i);
                cid := ord(c);
                if cid > tilda then begin
                        cid := cid + 848;
                        result := SetChar(result, chr(cid), i);
                end;
        end;
        DecodeText := result;
end;


Phantom 05.10.2008 17:39

Ответ: Непонятки с кодировкой...
 
Объясняю. В utf-8 символы кодируются от 1 до 4 байт. Принимает программа побайтно, а при присваивании байтов типу String приводит к автоматическому преобразования данного байта к utf-8, то есть КАЖДЫЙ из байтов (а не из символов) становится от 1 до 4 байтов. То есть внешне получается, что вы utf-8 считываете в кодировке ASCII. Выход из этого вижу один. Парсить принимаемые данные в программе. Нужно отлавливать каждый байт более 192, после этого прибавлять к нему ВСЕ байты, идущие за ним, ПОКА не встретится байт менее 128 или более 192. Все эти байты в той же последовательности берём как int и конкатенируем к строке (или через буфер) с приставкой (char). Это я говорю, как бы я на Java сделал бы. Хотел я либу написать даже, гг. Но мне кажется, что способ весьма тормозной. Но зато полная интернациональность - возможность передавать текст на любом языке, а не только на русском. Но если использовать utf-8 для передачи через интернет, то нужно помнить, что траффик будет больше.


Часовой пояс GMT +4, время: 19:14.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot