Перейти к содержанию
Fire Monkey от А до Я
  • 0

Скачать курс валют через THTTPClient


Rusland

Вопрос

Пытаюсь скачать XML с курсами валют с cbr.ru. Получаю ошибку Project raised exception class EEncodingError with message 'No mapping for the Unicode character exists in the target multi-byte code page'. Как исправить?

//aUrl = http://www.cbr.ru/scripts/XML_daily.asp

function GetXML(aURL: string): String;
var
  Http: THTTPClient;
  Ss: TStringStream;
begin
  Result:='';
  Http:=THTTPClient.Create;
  try
    Ss:=TStringStream.Create('', TEncoding.UTF8);
    Http.Get(aURL,ss);
    Result:=Ss.DataString; // тут ошибка
  except    
  end;
  Http.Free;
end;
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Проблема решена.

Оказалось что там кодировка Win1251, а я указал 

TStringStream.Create('', TEncoding.UTF8);

вместо

TStringStream.Create('');

И парсер на всякий случай:

uses msxml;

procedure GetKursValutAndDate(XML:String; var KDollar,KEuro:Double);
var
  XMLDoc: IXMLDOMDocument;
  Subnodes: IXMLDOMNodeList;
  AttributeNode: IXMLDOMNode;
  OperationNode: IXMLDOMNode;
  i:integer;  
begin
  KDollar:=0; KEuro:=0;
  try
    XMLDoc:=CoDOMDocument.Create;
    if Assigned(XMLDoc) and XMLDoc.loadXML(XML) then
    begin
      Subnodes:=XMLDoc.selectNodes('//ValCurs/node()');
      if Assigned(Subnodes) then
      begin
        for I := 0 to Subnodes.length - 1 do
        begin
          AttributeNode := Subnodes[I].attributes.getNamedItem('ID');
          if Assigned(AttributeNode) then
            if (AttributeNode.nodeValue='R01235') then 
            begin // доллар
              OperationNode:=Subnodes[I].selectSingleNode('.//Value');
              if Assigned(OperationNode) then
                KDollar:=StrToFloat(OperationNode.text);
            end
            else if (AttributeNode.nodeValue='R01239') then
            begin // евро
              OperationNode:=Subnodes[I].selectSingleNode('.//Value');
              if Assigned(OperationNode) then
                KEuro:=StrToFloat(OperationNode.text);
            end
        end;
      end;
    end;
  except
    Raise Exception.Create('Не удалось получить курс валют');
  end;
end;

 

Изменено пользователем Rusland
Ссылка на комментарий
  • 0

Привет.

Озадачился этой же темой но в обход XML, забираю курсы непосредственно из html. В HTML charset=utf-8 я создаю стрим как и ты в кодировке UTF-8 кидаю его в memo а русские буквы не распознаются, как быть?

Код такой:

procedure TForm2.Button1Click(Sender: TObject);
var
url:string;
Ss: TStringStream;
begin
  url:='http://www.cbr.ru/';
  Ss:=TStringStream.Create('', TEncoding.UTF8);
  NetHTTPClient1.Get(url,ss);

to_rorum.jpg.1ee882a6c2e2eaa6ada5b0b181f70bc8.jpg

Ссылка на комментарий
  • 0
  • Модераторы

нет такой проблемы, ваш код у меня отработал так

2017-04-19_18-47-23.png.fec011928579990685d2c690def096b8.png

 

uses
  System.Net.HTTPClient;

procedure TForm2.Button1Click(Sender: TObject);
var
  aHttp: THTTPClient;
  aStr: TStringStream;
begin
  aHttp := THTTPClient.Create;
  aStr := TStringStream.Create('', TEncoding.UTF8);
  try
    aHttp.Get('http://www.cbr.ru/', aStr);
    Memo1.text := aStr.DataString;
  finally
    aHttp.Free;
    aStr.Free;
  end;
end;

 

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...