Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.09.2015, 22:15   #1
retroguy
Пользователь
 
Регистрация: 13.04.2012
Сообщений: 11
По умолчанию ISO-8859-1 to WIN1251

Уважаемые помогите!

Третьи сутки сижу в интернете и никак не могу найти решение перекодировки текста.
Есть набор данных JSON
{"searchSpec":{"itemsType":"avl_uni t","propName":"sys_unique_id","prop ValueMask":"*","sortType":"sys_uniq ue_id"},"dataFlags":1,"totalItemsCo unt":14,"indexFrom":0,"indexTo":13, "items":[{"nm":"Scania AA4021KP'#$1D'(CAN)","cls":3,"id":8 031},{"nm":"DAF P'#$10'P'#6'9336P!P%","cls":3,"id": 7231},{"nm":"VW Crafter CA6213AT (CAN)","cls":3,"id":9157},{"nm":"P' #$13'P0P7P5P;Q'#$C' 04544P'#$1C'P'#$15'","cls":3,"id":6 942},{"nm":"P'#$1F'P'#$10'P'#$17' P!P'#$10'5836P'#$10'P'#$1E'","cls": 3,"id":6987},{"nm":"MAN (35.950P<3)","cls":3,"id":11552},{" nm":"Case Puma 225","cls":3,"id":15179},{"nm":"Ope l","cls":3,"id":8090},{"nm":"90-39","cls":3,"id":17987},{"nm":"DA F AE8571ET","cls":3,"id":2718},{"nm": "JohnDeere 8330 (CAN)","cls":3,"id":16046},{"nm":"J ohnDeere 8335R (CAN) 26426P!P'#$10'","cls":3,"id":16049} ,{"nm":"P'#$1E'Q'#5'Q'#0'P0P=P=P8P: ","cls":3,"id":19674},{"nm":"P'#$1A 'P'#$10'P'#$1C'P'#$10'P'#$17' P'#$10'P'#$12'4773P'#$12'P'#$1A'"," cls":3,"id":9084}]}'#$A
полученный с помощью TIdHTTP.Get. Кодировка, как выяснилось путем долгих поисков - ISO-8859-1. Очень много примеров перебрал по перекодировке (WideCharToString, TEncoding, и др библиотеки в том числе сторонние) - ничего не помогает: в лучшем случае вместо имеющихся кракозяблов вылазят другие, а то и совсем эксэпшен. А нужно бы в кирилицу его запихнуть.

Буду благодарен за любую толковую подсказку. Рабочий пример кода по перекодировке обязуюсь выложить.

Чуть не забыл - Delphi XE2. И, пожалуйста, не нужно рассказывать что в этой версии все давно реализовано.

Заранее благодарю не равнодушных )
retroguy вне форума Ответить с цитированием
Старый 09.09.2015, 22:58   #2
ДралсяСошибками
Форумчанин
 
Аватар для ДралсяСошибками
 
Регистрация: 31.05.2011
Сообщений: 301
По умолчанию

Гугал подсказывает, что надо вроде сначала в utf8 перегнать)))
ДралсяСошибками вне форума Ответить с цитированием
Старый 09.09.2015, 23:10   #3
retroguy
Пользователь
 
Регистрация: 13.04.2012
Сообщений: 11
По умолчанию

Цитата:
Сообщение от ДралсяСошибками Посмотреть сообщение
Гугал подсказывает, что надо вроде сначала в utf8 перегнать)))
Если не трудно рабочую ф-цию дай плиз )

А то я это все "вроде" уже перепробовал )

Цитата:
Сообщение от ДралсяСошибками Посмотреть сообщение
Гугал подсказывает, что надо вроде сначала в utf8 перегнать)))
Код:
  function UTF8ToStr(Value: String): String;
  var
    buffer: Pointer;
    BufLen: LongWord;
  begin
    BufLen := Length(Value) + 4;
    GetMem(buffer, BufLen);
    FillChar(buffer^, BufLen, 0);
    MultiByteToWideChar(CP_UTF8, 0, @Value[1], BufLen - 4, buffer, BufLen);
    Result := WideCharToString(buffer);
    FreeMem(buffer, BufLen);
  end;

  {Convert string from UTF-8 format mixed with standart ASCII symbols($00..$7f)}
  function UTF8ToStrSmart(Value: String): String;
  var
    Digit: String;


  //длина текста зависит от переменной i
  //если не хватает integer, то объявляйте, как int64
    i: integer;


    HByte: Byte;
    Len: Byte;
  begin
    Result := '';
    Len := 0;
    if Value = '' then Exit;
    for i := 1 to Length(Value) do
    begin
      if Len > 0 then
      begin
        Digit := Digit + Value[i];
        Dec(Len);
        if Len = 0 then
          Result := Result + UTF8ToStr(Digit);
      end else
      begin
        HByte := Ord(Value[i]);
        if HByte in [$00..$7f] then       //Standart ASCII chars
          Result := Result + Value[i]
        else begin
          //Get length of UTF-8 char
          if HByte and $FC = $FC then
            Len := 6
          else if HByte and $F8 = $F8 then
            Len := 5
          else if HByte and $F0 = $F0 then
            Len := 4
          else if HByte and $E0 = $E0 then
            Len := 3
          else if HByte and $C0 = $C0 then
            Len := 2
          else begin
            Result := Result + Value[i];
            Continue;
          end;
          Dec(Len);
          Digit := Value[i];
        end;
      end;
    end;
  end;
использование:

Код:
res := UTF8ToStrSmart(UTF8Decode(sstream.DataString));
где
Код HTML:
sstream := TStringStream.Create;
получаемая из
Код:
idhttp.Get(URL, sstream);
Спасибо дружище! С меня пивас!

Можно закрывать.

Вот только покажу в доказательство что получилось:
'{"searchSpec":{"itemsType":"avl_un it","propName":"sys_unique_id","pro pValueMask":"*","sortType":"sys_uni que_id"},"dataFlags":1,"totalItemsC ount":14,"indexFrom":0,"indexTo":13 ,"items":[{"nm":"Scania AA4021KН(CAN)","cls":3,"id":8031},{ "nm":"DAF АІ9336СХ","cls":3,"id":7231},{"nm": "VW Crafter CA6213AT (CAN)","cls":3,"id":9157},{"nm":"Га зель 04544МЕ","cls":3,"id":6942},{"nm":" ПАЗ СА5836АО","cls":3,"id":6987},{"nm": "MAN (35.950м3)","cls":3,"id":11552},{"n m":"Case Puma 225","cls":3,"id":15179},{"nm":"Ope l","cls":3,"id":8090},{"nm":"90-39","cls":3,"id":17987},{"nm":"DA F AE8571ET","cls":3,"id":2718},{"nm": "JohnDeere 8330 (CAN)","cls":3,"id":16046},{"nm":"J ohnDeere 8335R (CAN) 26426СА","cls":3,"id":16049},{"nm": "Охранник","cls":3,"id":19674},{"nm ":"КАМАЗ АВ4773ВК","cls":3,"id":9084}]}'#$A

Последний раз редактировалось Stilet; 10.09.2015 в 09:10.
retroguy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перекидка всех данных в DBF с кодировки Dos866 в Win1251 VitProff БД в Delphi 12 29.01.2014 10:41
Перевод из UTF-8 в win1251 Eretictic C# (си шарп) 0 03.02.2013 21:34
D2010 + win1251 Usov Работа с сетью в Delphi 2 21.03.2011 15:01
charset=iso-8859-1 и alert() LevonNikox PHP 5 16.09.2009 23:34
WIN1251 to UTF-8 enRai Помощь студентам 2 01.08.2009 22:33