если то, что вы говорите, действительно верно, то это проблема с сервером, а не с curl.но, скорее всего, это не проблема с сервером, это, вероятно, проблема с тем, как вы видите результат.Вот мои теории, от наиболее вероятных до наименее вероятных:
1: вы просматриваете результат в веб-браузере, вы не предоставляете параметр encoding
в заголовке Content-Type:
и браузеридентифицируйте содержимое как HTML4, где кодировка по умолчанию - ISO-8859-1
, и, таким образом, отображает его как ISO-8859-1
, который не поддерживает ś
, а браузер превращает недопустимые символы в ?
.исправление состоит в том, чтобы изменить заголовок Content-Type на Content-Type: text/html;charset=utf8
2: то же самое, что и выше, но ваш сервер фактически предоставляет неправильный заголовок типа содержимого, например Content-Type: text/html;charset=ISO-8859-1
, исправление такое же, каквыше.
3: сервер хранит данные в базе данных sql (например, mysql) с набором символов сохранения, установленным на ISO-8859-1
(или что-то близкое к нему), и затем база данных заменяет недопустимые символы на * 1016.* (Я видел это много раз в прошлом, но не в последние годы), и в этом случае код сервера должен быть исправлен.проверьте этот ответ https://stackoverflow.com/a/279279/1067003
4: вы запускаете PHP в терминале, который не поддерживает символы Юникода.решение состоит в том, чтобы переключиться на лучший терминал.(маловероятно, но эй, xterm все еще существует, и все еще имеет версию без юникода, возможно, вы используете обычный xterm)
5: на сервере действительно работает какая-то версия $response=str_replace($response,'ś','?');echo $response;
..крайне маловероятно, но не невозможно, что также должно быть исправлено на стороне сервера.проверьте этот ответ https://stackoverflow.com/a/279279/1067003
и, наконец, protip, вы в замешательстве, CURLOPT_HTTPHEADER - заголовок curl, отправляемый на целевой URL-адрес в запросе, когда вы устанавливаете Content-Type
с помощью CURLOPT_HTTPHEADER, вы устанавливаете Content-Type длятело запроса curl.но поскольку вы не используете CURLOPT_INFILE и не используете CURLOPT_POSTFIELDS, тело запроса вообще не существует, и, следовательно, в запросе не должно быть заголовка типа содержимого, избавьтесь от него.Возможно, вы искали функцию header()
, например, header('Content-Type: text/html; charset=utf-8');
, которая отправит этот заголовок в браузер.