Linux curl utf 8

Утилита командной строки CURL

CURL — утилита командной строки для Linux или Windows, поддерживает работу с протоколами: FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, LDAP, POP3, IMAP и SMTP. Она отлично подходит для имитации действий пользователя на страницах сайтов и других операций с URL адресами. Поддержка CURL добавлена в множество различных языков программирования и платформ.

Для начала скачаем саму утилиту, для этого переходим на официальный сайт утилиты, в раздел Download. После скачивания архива для своей платформы (у меня это Windows 64 bit), распаковываем архив. Чтобы иметь возможность работать с HTTPS и FTPS, устанавливаем сертификат безопасности url-ca-bundle.crt , который находится в папке curl/bin .

Запускаем командную строку, переходим в директорию curl/bin и пытаемся скачать главную страницу Google:

Опция -X позволяет задать тип HTTP-запроса вместо используемого по умолчанию GET. Дополнительные запросы могут быть POST, PUT и DELETE или связанные с WebDAV — PROPFIND, COPY, MOVE и т.п.

Следовать за редиректами

Сервер Google сообщил нам, что страница google.com перемещена (301 Moved Permanently), и теперь надо запрашивать страницу www.google.com . С помощью опции -L укажем CURL следовать редиректам:

Сохранить вывод в файл

Чтобы сохранить вывод в файл, надо использовать опции -o или -O :

  • -o ( o нижнего регистра) — результат будет сохранён в файле, заданном в командной строке;
  • -O ( O верхнего регистра) — имя файла будет взято из URL и будет использовано для сохранения полученных данных.

Сохраняем страницу Google в файл google.html :

Сохраняем документ gettext.html в файл gettext.html :

Загрузить файл, только если он изменён

Опция -z позволяет получить файлы, только если они были изменены после определённого времени. Это будет работать и для FTP и для HTTP. Например, файл archive.zip будет получен, если он изменялся после 20 августа 2018 года:

Команда ниже загрузит файл archive.zip , если он изменялся до 20 августа 2018 года:

Прохождение аутентификации HTTP

Опция -u позволяет указать данные пользователя (имя и пароль) для прохождения базовой аутентификаци (Basic HTTP Authentication):

Cookie используются сайтами для хранения некой информации на стороне пользователя. Сервер сохраняет cookie на стороне клиента (т.е. в браузере), отправляя заголовки:

А браузер, в свою очередь, отправляет полученные cookie обратно на сервер при каждом запросе. Разумеется, тоже в заголовках:

Читайте также:  Самый популярный браузер для windows

Передать cookie на сервер, как будто они были ранее получены от сервера:

Чтобы сохранить полученные сookie в файл:

Затем можно отправить сохраненные в файле cookie обратно:

Файл cookie.txt имеет вид:

Получение и отправка заголовков

По умолчанию, заголовки ответа сервера не показываются. Но это можно исправить:

Если содержимое страницы не нужно, а интересны только заголовки (будет отправлен HEAD запрос):

Посмотреть, какие заголовки отправляет CURL при запросе, можно с помощью опции -v , которая выводит более подробную информацию:

  • Строка, начинающаяся с > означает заголовок, отправленный серверу
  • Строка, начинающаяся с означает заголовок, полученный от сервера
  • Строка, начинающаяся с * означает дополнительные данные от CURL

А вот так можно отправить свой заголовок:

Отправка данных методом POST

Команда ниже отправляет POST запрос на сервер аналогично тому, как пользователь, заполнив HTML форму, нажал бы кнопку «Отправить». Данные будут отправлены в формате application/x-www-form-urlencoded .

Параметр —data аналогичен —data-ascii , для отправки двоичных данных необходимо использовать параметр —data-binary . Для URL-кодирования полей формы нужно использовать —data-urlencode .

Если значение опции —data начинается с @ , то после него должно быть имя файла с данными (или дефис — тогда будут использованы данные из стандартного ввода). Пример получения данных из файла для отправки POST-запроса:

Содержимое файла data.txt :

Массив $_POST , который будет содержать данные этого запроса:

Пример URL-кодирования данных из файла перед отправкой POST-запроса:

Содержимое файла username.txt :

Массив $_POST , который будет содержать данные этого запроса:

Загрузка файлов методом POST

Для HTTP запроса типа POST существует два варианта передачи полей из HTML форм, а именно, используя алгоритм application/x-www-form-urlencoded и multipart/form-data . Алгоритм первого типа создавался давным-давно, когда в языке HTML еще не предусматривали возможность передачи файлов через HTML формы.

Со временем возникла необходимость через формы отсылать еще и файлы. Тогда консорциум W3C взялся за доработку формата POST запроса, в результате чего появился документ RFC 1867. Форма, которая позволяет пользователю загрузить файл, используя алгоритм multipart/form-data , выглядит примерно так:

Чтобы отправить на сервер данные такой формы:

Скрипт upload.php , который принимает данные формы:

Работа по протоколу FTP

Скачать файл с FTP-сервера:

Если заданный FTP путь является директорией, то по умолчанию будет выведен список файлов в ней:

Источник

cURL и кириллица!

Почему, когда при помощи curl запрашиваю html-код какой-нибудь страницы, кириллические символы возвращаются вопросиками?

Пишу на с++. Результат выводится в терминал. Введи в терминале curl www.nix.ru и увидишь их.

Эти быдлокодеры не указали в html кодировку.

Там кодировка windows 1251, а в linux обычно utf8.

Пишу на с++. Результат выводится в терминал. Введи в терминале curl http://www.nix.ru и увидишь их.

Всё правильно. У тебя в терминале кодировка utf-8, а сервер выдаёт страничку в кодировке cp1251. Попробуй так (в терминале):

Читайте также:  Переустановка линукс без потери данных

Эти быдлокодеры не указали в html кодировку.

Они её указали в HTTP-заголовках:

char c[] = «www.nix.ru»; string s = download_page(c); cout ( 14.02.10 20:27:39 )

Так чтоб в s уже приходил нормальный кириллический текст.

Могу ли я как-нибудь в curl задать нужную кодировку?

Нет, это просто вне компетенции libcurl.

Помогите написать входные параметры для iconv(). string s — входная строка, string ss — выходная.

Источник

CURL doesn’t encode UTF-8

I’m using Windows 10 and curl 7.52.1. When I try to POST data to a WEBSERVICE, curl isn’t encoding the characters to UTF-8 (I need to display pt-BR characters, like àáçÇãõ etc)

Yes, I have already checked this, no success.

If I set the encoding page to chcp 65001 , the error persists. Changing to chcp 1252 solved the problem partially.

Look, if I prompt echo Administração >> test.txt without any chcp change, I get an Administra‡Æo.

After change to chcp 65001 I get Administração.

After change to chcp 1252 I finally get Administração.

But using curl, nothing change.

I’ve tried setting a header content-type, no lucky:

I get the following output:

I have also checked the WS it’s accepting the characters encoding, when I run (in JQuery ):

I get the output expected:

I don’t know what else can I try to solve this. Please, could you guys help me?

Thanks in advance.

UPDATE

As suggested by @Dekel, I tried also using an external file as data-bynary (the content inside test.txt is name=Administração):

I still get this unusual output:

UPDATE 2

@Phylogenesis suggested to use charset=ISO-8859-1 . I noticed that even returning Administração as result, checking narrowly in the server-side, the WS is receiving the exact letter, in this case ç .

Источник

Curl JSON encoded in UTF-8

Important note: I’m using Cygwin

I retrieve JSON from a file that I alter before sending it to a server using curl . By now everything is ok except one thing, when the server receive the JSON, every special characters (with accents, etc) aren’t well encoded. I suppose this was due to the fact that my JSON wasn’t encoded in UTF-8 before being sent but I don’t manage to convert it.

Here is the code:

My bash script and my JSON files are both encoded in UTF-8. My LANG variable seems to be UTF-8. I checked with this: [[ $LANG =

UTF-8$ ]] && echo «Uses UTF-8 encoding..»

Update

Here is the full script:

This script aims to upsert documents inside a NoSQL database. If first try to insert and if if fails it retrieves a property (the revision) of the document, append to it and then retry once.

Читайте также:  Учимся работать с windows

I know this script could be improved but this is my first bash script and it won’t be used in production (only for testing, etc.).

2 Answers 2

You can use this in Bash on Cygwin, as long as you at least have Python 2.7 installed:

According to man curl , -d or —data does a POST using the content-type application/x-www-form-urlencoded , and is equivalent to —data-ascii . I don’t think the attempts to override the header will change this. As the standard says, the charset for urlencoding depends on form elements, which are missing completely here.

If I understand your script correctly, $result is UTF-8, and not urlencoded. So you probably should use —data-urlencode (see man curl for details), and hope that it does encode UTF-8 correctly, or you should use —form instead, which is more flexible, and where you can include a charset field.

So the main problem seems to be in how the standard prescribes the encoding, which is sufficiently difficult to understand (at least for me). Maybe you can get a better answer on stackoverflow.

Источник

PHP Curl UTF-8 Charset

I have an php script which calls another web page and writes all the html of the page and everything goes ok however there is a charset problem. My php file encoding is utf-8 and all other php files work ok (that means there is no problem with server). What is the missing thing in that code and all spanish letters look weird. PS. When I wrote these weird characters original versions into php, they all look accurate.

6 Answers 6

Simple: When you use curl it encodes the string to utf-8 you just need to decode them..

This function decodes data , assumed to be UTF-8 encoded, to ISO-8859-1 .

You Can use this header

and after decoding the string

It worked for me

I was fetching a windows-1252 encoded file via cURL and the mb_detect_encoding(curl_exec($ch)); returned UTF-8. Tried utf8_encode(curl_exec($ch)); and the characters were correct.

First method (internal function)

The best way I have tried before is to use urlencode() . Keep in mind, don’t use it for the whole url; instead, use it only for the needed parts. For example, a request that has two ‘text-fa’ and ‘text-en’ fields and they contain a Persian and an English text, respectively, you might only need to encode the Persian text, not the English one.

Second Method (using cURL function)

However, there are better ways if the range of characters have to be encoded is more limited. One of these ways is using CURLOPT_ENCODING , by passing it to curl_setopt() :

Источник

Оцените статью