Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Неверное отображение кириллицы 
:(
    Опции темы
serzhb
Дата 13.1.2009, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 20.5.2007

Репутация: нет
Всего: нет



Получаю исходный код сайта, через Indy, в кодировке Windows-1251.
Когда записываю этот код в Memo, получаю "кривозябры" вместо кириллических символов, вроде таких "Ìîè Ãðóïïû" (вроде бы это ISO-8859 или Windows-1252).
В Delphi 7 таких проблем не было, только на CodeGear RAD Studio Delphi 2009.
помогите разобраться, что к чему.
PM MAIL   Вверх
Frees
Дата 13.1.2009, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



может эти функций помогут
AnsiToUtf8
Utf8ToAnsi



--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
serzhb
Дата 13.1.2009, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 20.5.2007

Репутация: нет
Всего: нет



Цитата(Frees @ 13.1.2009,  12:09)
может эти функций помогут
AnsiToUtf8
Utf8ToAnsi

не помогло
PM MAIL   Вверх
Alexeis
Дата 13.1.2009, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



serzhb, если используется кодировка Windows-1251 то значит мы имеет дело с ANSI, в 2009й основная строка юникодная. Преобразование осуществляется автоматически, значит вопрос состоит в том чтобы указать правильный чарсет для преобразования ANSI->Unicode. Напрмер при помощи SetThreadLocale. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
serzhb
Дата 13.1.2009, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 20.5.2007

Репутация: нет
Всего: нет



Alexeis, можно подробнее. Не совсем понял, куда SetThreadLocale ставить.
PM MAIL   Вверх
Frees
Дата 13.1.2009, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



Код

program Project1;

uses
Windows, Forms,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
SetThreadLocale(1049); // !!!!!!!!!!!!!!
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.



--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
serzhb
Дата 13.1.2009, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 20.5.2007

Репутация: нет
Всего: нет



Frees, я собственно так сделал, не помогло, поэтому переспросил. Есть ещё мысли?
PM MAIL   Вверх
Alexeis
Дата 13.1.2009, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



  А почему 1049, а не 1251 ? 
Найти то преобразование где происходит порча. Смотреть под дебагом что куда передается. String это UnicodeString нужно искать присваивания String - AnsiString и наоборот.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
serzhb
Дата 13.1.2009, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 20.5.2007

Репутация: нет
Всего: нет



Цитата

А почему 1049, а не 1251 ? 

потому что это не номер кодировки, а ID локали.

Цитата

Найти то преобразование где происходит порча. Смотреть под дебагом что куда передается. String это UnicodeString нужно искать присваивания String - AnsiString и наоборот.

Не такой профессионал в делфи, к сожалению.
Приложение на самом деле простое, но вот с кодировкой проблема.
PM MAIL   Вверх
Alexeis
Дата 13.1.2009, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Ну делфи тут ни при чем. Можно сделать простую тестовую страницу в кирилице, заранее посмотреть коды используемых символов в ANSI и UTF16, а затем смотреть какой код символов от места получения до места отображения. Или сделать простую тестовую програмку чтобы другие могли проверить. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Rrader
  Дата 13.1.2009, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 70
Всего: 191



Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Label1: TLabel;
    Label2: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses
  IdHTTP, IdGlobal, IdIOHandler;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
  LClient: TIdHTTP;
  S: TStringStream;
begin
  LCLient := TIdHTTP.Create(nil);
  try
    //LCLient.IOHandler := TIdIOHandler.MakeDefaultIOHandler(LCLient);
    //LCLient.IOHandler.DefStringEncoding := en8Bit;
    { Параметры можно опустить }
    S := TStringStream.Create('', TEncoding.Default);
    try
      LClient.Get('http://www.ya.ru', S);
      Memo1.Text := S.DataString;
    finally
      S.Free;
    end;
  finally
    LCLient.Free;
  end;
end;

end.


Это сообщение отредактировал(а) Rrader - 13.1.2009, 18:53


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
serzhb
Дата 13.1.2009, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 20.5.2007

Репутация: нет
Всего: нет



Rrader, огромное спасибо. Помогло!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0952 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.