Сценарий очистки Perl не распознает определенные символы

У меня есть скрипт, который отлично работает локально, но не работает на сервере.

Он отображает символ неразрывного пробела

   

as

?

при печати на стандартный вывод.

При разборе страницы, если я попытаюсь избавиться от неразрывного символа пробела с помощью

s/\&nbsp\;//g

ничего не происходит, ни избавления от вопросительного знака

s/\?//g

Вроде держится несмотря ни на что.

Как ни странно, это не проблема при локальном запуске скрипта.

Однако проблема как на локальном компьютере, так и на сервере заключается в том, что апострофы (представленные в HTML, который я очищаю, как острый символ

´

всегда представлены в виде вопросительного знака

?

даже при явной попытке

s/´/'/g

Запутался, помогите плиз.


person user1849286    schedule 24.11.2012    source источник
comment
Довольно сложно понять, что вы делаете. Разместите соответствующий код (сокращенный пример проблемы)   -  person Matteo    schedule 24.11.2012
comment
Также добавьте вывод locale с сервера и локальной машины.   -  person titanofold    schedule 24.11.2012
comment
Вам не нужно экранировать & и ;, только метасимволы.   -  person Tim    schedule 24.11.2012


Ответы (2)


Попробую удалить так:

Непрерывный пробел

my $non_break_space = "\x{A0}";
$non_break_space =~ s/\xA0/ /g;

Острый акцент

my $acute = "\x{B4}";
$acute =~ s/\xB4/ /g;

Вы можете использовать этот сайт fileformat.info для получения дополнительной информации о символы Юникода и их различные значения.

person Pavel Vlasov    schedule 24.11.2012
comment
Отлично, это работает, чтобы устранить проблему неразрывного пространства. Однако проблема с апострофом - представлена ​​​​остается (исходный вопрос выше был отредактирован, чтобы включить это). - person user1849286; 24.11.2012
comment
Это решило проблему - спасибо. Не уверен, что понимаю, что происходит с юникодом, придется прочитать об этом. - person user1849286; 25.11.2012

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

#!/usr/bin/env perl

use utf8;
use Mojolicious::Lite;
use Test::More tests => 3;
use Test::Mojo;

get '/test_html' => {text => "<p>Hello&nbsp;&nbsp;World&acute;!</p>"};
my $t = Test::Mojo->new;

$t->get_ok('/test_html')->status_is(200)->text_is('p', 'Hello World´!');

Отлично работает здесь:

1..3
ok 1 - get /test_html
ok 2 - 200 OK
ok 3 - exact match for selector "p"
person memowe    schedule 24.11.2012
comment
Привет, я получаю правильный вывод из теста следующим образом: 1..4 ok 1 - получить /test_html ok 2 - 200 OK ok 3 - точное совпадение для селектора p ok 4 - правильный пробел. - person user1849286; 24.11.2012
comment
Однако проблема по-прежнему остается со скриптом, который по какой-то причине не подхватывает апострофы. - person user1849286; 24.11.2012
comment
Исправление проблемы с апострофом: в HTML есть апостроф. Это представлено в виде вопросительного знака, а не апострофа. - person user1849286; 24.11.2012
comment
Привет! Если я изменю текст вашего примера, включив в него апостроф проблемы (я понимаю, что это символ «острого угла», но он представляет имя, например O'Reilly), я получу следующее: # Изменить текстовую строку ‹p›HelloWorlds!‹/ p> Теперь запустите скрипт и распечатайте результат теста: 1..4 ok 1 - get /test_html ok 2 - 200 OK not ok 3 - точное совпадение для селектора p # Неудачный тест 'точное совпадение для селектора p' # at тестовая строка 10. # got: 'Hello World?s!' # ожидается: 'Привет, мир!' ok 4 - правый пробел # Похоже, вы провалили 1 тест из 4. Это подводит итог проблеме - World?s not World's - person user1849286; 24.11.2012
comment
Я обновил ответ - отлично работает и с &acute;. Обратите внимание, что мне пришлось use utf8 сообщить Perl, что код закодирован в UTF-8. - person memowe; 24.11.2012
comment
Спасибо, тест работает. Интересно, что сайт использует вместо апострофа, поэтому ответ выше - это то, что нужно в этом случае - т.е. $acute =~ s/\xB4/'/g; - person user1849286; 25.11.2012