У меня в настоящее время проблема с PhantomJS (версия 2.1.1/Windows 7), не распознающая символы UTF-8. До Задавая этот вопрос, я нашел следующие две статьи, полезные для настройки командной строки:Специальные/акцентированные символы UTF-8, не распознанные PhantomJS
Как было предложено второй статье, я использовал команду
chcp 65001
, чтобы изменить кодовую страницу на UTF-8. Затем я также установил стандартный шрифт командной строки на консоль Lucida.
Чтобы проверить это сработало, я создал следующие UTF-8 текстового файл
---------------------------------------------------------
San José
Cañon City
Przecław Lanckoroński
François Gérard Hollande
El Niño
vis-à-vis
---------------------------------------------------------
, а затем побежал следующую команду, чтобы продемонстрировать, были ли символы распознаются и правильно отображаются в командной строке:
type utf8Test.txt
После этого работал, я обратил внимание на PhantomJS. Следуя инструкциям here, я создал приведенные ниже настройки json-файла, чтобы гарантировать, что UTF-8 является кодировкой ввода и вывода (хотя это, по-видимому, по умолчанию соответствует официальной документации).
{
"outputEncoding: "utf8",
"scriptEncoding": "utf8"
}
Я побежал следующий JavaScript через PhantomJS использованием вышеупомянутых параметров JSON файл в том же окне командной строки:
console.log("---------------------------------------------------------");
console.log("San José");
console.log("Cañon City");
console.log("Przecław Lanckoroński");
console.log("François Gérard Hollande");
console.log("El Niño");
console.log("vis-à-vis");
console.log("---------------------------------------------------------");
page = require('webpage').create();
// Display the initial requested URL
page.onResourceRequested = function(requestData, request) {
if(requestData.id === 1){
console.log(requestData.url);
}
};
// Display any initial requested URL response error
page.onResourceError = function(resourceError) {
if(resourceError.id === 1){
console.log(resourceError.status + " : " + resourceError.statusText);
}
};
page.open("https://en.wikipedia.org/wiki/San_José", function(status) {
console.log("---------------------------------------------------------");
phantom.exit();
});
Вывод выполнения этого сценария показан ниже:
Из этого я вижу, что PhantomJS не может понять специальные символы UTF-8, и, кроме того, он проходит «Неизвестный» символ сайтов при условии специальной или ударением характера, как показано ниже:
URL passed to PhantomJS:
https://en.wikipedia.org/wiki/San_José
URL passed to remote host:
https://en.wikipedia.org/wiki/San_Jos%EF%BF%BD
----------------------------------------------
%EF%BF%BD
�
instead of:
%C3%A9
é
Это приводит к веб-сайтам ответить «400: Bad Request» ошибки, и в случае Википедии конкретно, запрашивающий URL https://en.wikipedia.org/wiki/San_Jos%EF%BF%BD приводит к ошибке:
Плохой заголовок - запрашиваемая заголовок страницы содержит недопустимую последовательность UTF-8.
Итак, со всем этим, кто-нибудь знает, как исправить это? В наши дни существует множество веб-сайтов, которые используют специальные/акцентированные символы UTF-8 в своих URL-адресах страниц, и было бы замечательно, если бы PhantomJS можно было использовать для доступа к ним.
Я очень ценю любую помощь или предложения, которые вы можете мне предоставить.
Неправильный URL-адрес для вики-страницы на самом деле https://en.wikipedia.org/wiki/San_Jos%C3%A9? Он открывается PhantomJS без проблем. – Vaviloff
Спасибо, что вернулись ко мне. Вы правы, это URL-адрес, который я пытаюсь получить в этом примере. Однако, в отличие от хром и, как показано в конце второго снимка экрана, PhantomJS не переводит 'é' в% C3% A9, потому что он не распознает символ в скрипте. Вместо этого он переводит его в « » или% EF% BF% BD (символ неизвестен). Основная проблема для меня заключается в том, что чтение набора URL-адресов из текстового файла или непосредственно из сценария невозможно, если присутствуют специальные/акцентированные символы UTF8. И в общем, я хотел бы знать, как заставить PhantomJS читать такие персонажи. –