
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.117.184.57] |
![]() |
|
Страницы: (2) [1] 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, загрузить на сервер и сделать это: ![]() ![]() 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 так же. То есть сервер ничего не подменяет. Экспериментировал с иным хостингом - так же ерунда. Я уже запутался, ничего понять не могу, прошу Вашей помоши. |
![]() |
Сообщ.
#2
,
|
|
1)
Цитата maxefficiently @ - русские символы НЕ отображаются. Что в место их? знаки вопросов или корокозяблы? 2) какая кодировка в заголовке от обеих серверов? (имеется ввиду не заголовок в html теле) подсмотреть можно в IdHTTP1.Response.CharSet (или с помощью FF + FireBug) Добавлено пс. попробуй указать желаемую кодировку (IdHTTP1.Request.AcceptCharSet) |
Сообщ.
#3
,
|
|
|
Посмотрите: Парсинг - проблема с кодировками
![]() ![]() 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 менять? Не нужно. Зачем? |
Сообщ.
#4
,
|
|
|
Сохраняй UTF-8, а то все равно получишь крякозябры.
Д2010 работает с Юинкодом и поддерживает его преобразование в UTF-8 автоматически. Добавлено ИНДИ, в зависимсоти от версии не работает с Юникод, да и версии 10.х это бета версии, не бета Инди 9. |
Сообщ.
#5
,
|
|
|
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 конвертирует, типа надо так, проблемы возникают. |
Сообщ.
#6
,
|
|
|
Все три страницы показываются нормально. С BOM лучше всего.
Но бардак в том, что у всех трех файлов отсутствует заголовок страницы. |
Сообщ.
#7
,
|
|
|
Сообщ.
#8
,
|
|
|
У TStringList есть параметр Encoding в методе SaveToFile, если, конечно, сохранение идет через него. А по дефолту метод сохраняет в UTF-16.
|
Сообщ.
#9
,
|
|
|
Мне так надо было потом:
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 то же сохранял, во что только я не сохранял... ![]() |
Сообщ.
#10
,
|
|
|
Я для кого ссылку давал?
Там показано, как получить страницу в виде "как есть". Если делать: ![]() ![]() s:=idhttp1.Get('http://www.google.com.ua/'); То здесь Indy нахимичит с кодировками, как указано здесь: http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=68134 |
Сообщ.
#11
,
|
|
|
CodeMonkey, так вывод, что Indy так хитро работает? Почему она то нормально работает, то хитрит...
|
Сообщ.
#12
,
|
|
|
Я вам говорю, что вы с Indy неправильно работаете.
|
Сообщ.
#13
,
|
|
|
CodeMonkey, понял-понял, спасибо большое, я там все читал, только не применял, думал проще есть способ и я туплю. Вам +1
Добавлено Товарищи, все ещё проще ![]() |
![]() |
Сообщ.
#14
,
|
|
подобный прикол с String + Utf8 + Indy тоже наблюдал. но лечится банально загрузкой данный напрямую в TStringList минуя переменную String. и без доп. перекодировки
![]() ![]() /// Strings: TStringList; idhttp1.Get('http://xxx.com/UT8-BOM.v', Strings); |
Сообщ.
#15
,
|
|
|
так что сохраняйте полученное idHTTP в TMemoryStream и все будет ОК.
Добавлено ViktorXP, во-во! |