2017-02-05 1 views
1

У меня в настоящее время проблема с 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 

UTF-8 accented recognised and correctly displayed by the command prompt

После этого работал, я обратил внимание на 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(); 
}); 

Вывод выполнения этого сценария показан ниже:

UTF-8 accented characters not displayed by PhantomJS

Из этого я вижу, что 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 можно было использовать для доступа к ним.

Я очень ценю любую помощь или предложения, которые вы можете мне предоставить.

+1

Неправильный URL-адрес для вики-страницы на самом деле https://en.wikipedia.org/wiki/San_Jos%C3%A9? Он открывается PhantomJS без проблем. – Vaviloff

+0

Спасибо, что вернулись ко мне. Вы правы, это URL-адрес, который я пытаюсь получить в этом примере. Однако, в отличие от хром и, как показано в конце второго снимка экрана, PhantomJS не переводит 'é' в% C3% A9, потому что он не распознает символ в скрипте. Вместо этого он переводит его в « » или% EF% BF% BD (символ неизвестен). Основная проблема для меня заключается в том, что чтение набора URL-адресов из текстового файла или непосредственно из сценария невозможно, если присутствуют специальные/акцентированные символы UTF8. И в общем, я хотел бы знать, как заставить PhantomJS читать такие персонажи. –

ответ

1
var url = 'https://en.wikipedia.org/wiki/San_José'; 

page.open(encodeURI(url), function(status) { 
    console.log("---------------------------------------------------------"); 
    console.log(page.evaluate(function(){ return document.title })); 
    phantom.exit(); 
}); 

enter image description here

Да, это подтасовки эти символы на ОС Windows (на Linux работает beautifully), но по крайней мере, вы будете иметь возможность открывать страницы и обрабатывать их.

+0

Спасибо, я забыл про encodeURI(), который работает очень хорошо :-) Так что, чтобы ответить на одну половину моего вопроса наверняка, но мне все еще интересно, как сделать PhantomJS такими символами в Windows. Из теста, описанного в начальной части моего вопроса выше, мне кажется, что командная строка Windows теперь может отображать их. Поэтому мне интересно, есть ли что-то, что мне не хватает в настройке кодировки PhantomJS, чтобы он распознавал и правильно отображал такие символы. –

+0

Также я только что понял, что на вашем скриншоте отображается «Przecław Lanckoroński» без каких-либо неизвестных персонажей, хотя персонажи, о которых идет речь в этом примере (а именно «ł» и «ń»), похоже, были преобразованы в «l» и 'n' соответственно. Вы изменили этот текст во время теста? Любопытно, как остальные 5 выглядят так же, как и в моей настройке. И да, действительно, в Linux это работает прекрасно! :-) –

+1

Что касается Przecław Lanckoroński - по какой-то причине имя было скопировано без польских символов. Что касается остальных, то действительно кажется, что у PhantomJS есть проблемы с работой с UTF-8 в консоли, так как всегда есть два пустых поля вместо символа. – Vaviloff

Смежные вопросы