На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Кодировка строки: UTF-8,ANSI,Windows-1251 , мистика полная :) 2 дня борюсь
    Добрый день! Кто-то может мистику развеять? Буду благодарен очень.

    У меня Delphi 2010. Значит строки в unicode.

    загружаю google.ru в string (idHttp.Get), вывожу строку в showmessage - русские символы отображаются.
    Сохраняю страницу google.ru на диск, загружаю на хостинг, и опять загружаю в string - русские символы НЕ отображаются.

    В заголовке Гугла вообще пишется charset=UTF-8, а когда сохранил страницу - уже Windows-1251.

    В string русские символы отображаются нормально, если на сайтах кодировки Windows 1251,UTF-8.

    Сохраняю текстовые файлы в Total Commander с кодировками Windows-1251 и UTF-8, загружаю на сайт, получаю (idHttp.Get) обратно в string - русские символы НЕ отображаются.

    Прочитал статью СТАТЬЯ, по словам автора нужно с UTF-8 на Windows-1251 менять? Тогда почему сайты с UTF-8 и Windows-1251 нормально уже отображаются.

    Yandex - UTF-8 и отображается нормально в string.

    Сохраняю дерево TreeView и загружаю обратно, все ок. Беру этот же файл, загружаю на сервер - русские символы НЕ отображаются.

    Мне только одно помогает: сохранить в блокноте в ANSI, загрузить на сервер и сделать это:

    ExpandedWrap disabled
      function W1252To1251(const AData: String): String;
        var
          S: RawByteString;
          X: Integer;
        begin
          SetLength(S, Length(AData));
          for X := 1 to Length(AData) do
            S[X] := AnsiChar(AData[X]);
          SetCodePage(S, 1251, False);
          Result := S;
      end;


    В браузере: если сохранил в 1251 и в браузере то же стоит 1251 - все отображается, UTF-8 так же. То есть сервер ничего не подменяет. Экспериментировал с иным хостингом - так же ерунда.

    Я уже запутался, ничего понять не могу, прошу Вашей помоши.
      1)
      Цитата maxefficiently @
      - русские символы НЕ отображаются.

      Что в место их? знаки вопросов или корокозяблы?

      2) какая кодировка в заголовке от обеих серверов? (имеется ввиду не заголовок в html теле)
      подсмотреть можно в IdHTTP1.Response.CharSet (или с помощью FF + FireBug)

      Добавлено
      пс. попробуй указать желаемую кодировку (IdHTTP1.Request.AcceptCharSet)
        Посмотрите: Парсинг - проблема с кодировками

        ExpandedWrap disabled
          uses
            HtmlCPConvert;
           
          procedure TForm1.Button1Click(Sender: TObject);
          var
            Str: TMemoryStream;
            RawContent: RawByteString;
            Content: String;
          begin
            Str := TMemoryStream.Create;
            try
              IdHTTP1.Get(Edit1.Text, Str);
           
              SetLength(RawContent, Str.Size);
              Move(Str.Memory^, Pointer(RawContent)^, Str.Size);
            finally
              FreeAndNil(Str);
            end;
           
            Content := RawHTMLToHTML(RawContent);
           
            Memo1.Lines.Text := Content;
          end;


        Если на сервере кодировка указана верно, то это будет работать с любой кодировкой. Модули можно взять тут.

        Цитата maxefficiently @
        В заголовке Гугла вообще пишется charset=UTF-8, а когда сохранил страницу - уже Windows-1251


        Как сохраняешь-то? Если через SaveToFile у TStrings, то там по-умолчанию ANSI - что и есть Windows-1251.

        Цитата maxefficiently @
        Прочитал статью СТАТЬЯ, по словам автора нужно с UTF-8 на Windows-1251 менять?


        Не нужно. Зачем?
          Сохраняй UTF-8, а то все равно получишь крякозябры.
          Д2010 работает с Юинкодом и поддерживает его преобразование в UTF-8 автоматически.

          Добавлено
          ИНДИ, в зависимсоти от версии не работает с Юникод, да и версии 10.х это бета версии, не бета Инди 9.
            Indy 10.5.5
            Вот сайт, можете попробовать:

            Сохранил в разных кодировках:

            Windows 1251
            UTF-8 Без ВОМ
            UTF-8 c BOM

            Использовал:
            idHttp, AcceptCharSet: 'windows-1251,utf-8;q=0.7,*;q=0.7';
            Language: ru-RU,ru;q=0.9,en;q=0.8
            так и оставлял поля пустыми.

            HTTP Analyzer ничего особенного не показал.

            Добавлено
            ViktorXP, обычно крякозябры.

            CodeMonkey, сохраняю дерево TreeView и загружаю обратно, все ок. Беру этот же файл, загружаю на сервер, качаю с сервера в стринг, - русские символы НЕ отображаются. За статью: зачем автор тогда из UTF-8 в 1251 конвертирует, типа надо так, проблемы возникают.
            Сообщение отредактировано: maxefficiently -
              Все три страницы показываются нормально. С BOM лучше всего.
              Но бардак в том, что у всех трех файлов отсутствует заголовок страницы.
                Anatoly Podgoretsky, это вы говорите, что в браузере показываются? Там да! Если в Delphi, какой код используете? Я просто: s:=form1.idhttp1.Get('http://xxx.com/UT8-BOM.v');

                Добавлено
                Вот типа такого постоянно получаю:user posted image
                  У TStringList есть параметр Encoding в методе SaveToFile, если, конечно, сохранение идет через него. А по дефолту метод сохраняет в UTF-16.
                    Мне так надо было потом:
                    StrStream:=TStringStream.Create(s,tencoding.UT8); //перепробовал Unicode,Default,UTF7
                    form2.TreeView1.LoadFromStream(strstream);
                    StrStream.Free;

                    Добавлено
                    Вот работает (TIdHTTPRequest оставил стандартным):
                    s:=idhttp1.Get('http://www.google.com.ua/');
                    showmessage(s);
                    а с моим сайтом значит нет...

                    Добавлено
                    И как говорил, работает один способ только: сохранить в ANSI, а потом после скачивания с сервера в 1251 конвертировать - тогда все ок.

                    Добавлено
                    Fr0sT, я и в UTF-16 то же сохранял, во что только я не сохранял... :)
                    Сообщение отредактировано: maxefficiently -
                      Я для кого ссылку давал?

                      Там показано, как получить страницу в виде "как есть".

                      Если делать:

                      ExpandedWrap disabled
                        s:=idhttp1.Get('http://www.google.com.ua/');


                      То здесь Indy нахимичит с кодировками, как указано здесь: http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=68134
                        CodeMonkey, так вывод, что Indy так хитро работает? Почему она то нормально работает, то хитрит...
                          Я вам говорю, что вы с Indy неправильно работаете.
                            CodeMonkey, понял-понял, спасибо большое, я там все читал, только не применял, думал проще есть способ и я туплю. Вам +1

                            Добавлено
                            Товарищи, все ещё проще :) вот тут мне овтетил человек: ОТВЕТ
                            Сообщение отредактировано: maxefficiently -
                              подобный прикол с String + Utf8 + Indy тоже наблюдал. но лечится банально загрузкой данный напрямую в TStringList минуя переменную String. и без доп. перекодировки
                              ExpandedWrap disabled
                                ///  Strings: TStringList;  
                                  idhttp1.Get('http://xxx.com/UT8-BOM.v', Strings);
                                так что сохраняйте полученное idHTTP в TMemoryStream и все будет ОК.

                                Добавлено
                                ViktorXP, во-во!
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0488 ]   [ 16 queries used ]   [ Generated: 22.02.25, 17:10 GMT ]