2016-06-10 3 views
3

Я очищаю веб-страницу и извлекаю из нее определенный раздел. В этот раздел включены кавычки (, символ 146). Я пытаюсь распечатать извлеченные данные в текстовый файл, но он дает мне ’ вместо перевернутой запятой. Я попробовал следующее:Кодирующий модуль и перевернутые запятые

  • $content =~ s/’/'/g;
  • my $invComma = chr 146; $content =~ s/$invComma/'/g;
  • $content =~ s/\x{0092}/'/g;

Ни один из них не работал. Я не могу decode('UTF-8', $content), потому что он имеет широкие символы. Когда я пытаюсь сделать encode('UTF-8', $content), ’ вместо этого изменяется на ’. Я уже пробовал use utf8, а также не имел никакого эффекта.

Я знаю, что мой просмотрщик текстовых файлов может отображать инвертированные запятые, потому что я напечатал его в тестовом файле и открыл его. Поэтому проблема заключается в моем скрипте.

Что я делаю неправильно и как его исправить?

UPDATE: Я могу сделать $content =~ s/’/'/g заменить его простой апостроф, но я до сих пор не знаю, почему ничего не работает. Я также хотел бы исправить, что на самом деле решает проблему, а не просто решить один из симптомов.

UPDATE 2: Я был проинформирован hobbs, что персонаж на самом деле U+2019 RIGHT SINGLE QUOTATION MARK и изменил мое регулярное выражение, чтобы использовать chr 0x2019 который теперь работает.

+1

Однако вы извлекаете содержимое веб-страницы, это неверно интерпретирует кодировку, но вы не указали эту часть кода в своем вопросе. – hobbs

+0

Я использую метод LWP :: Simple (_URL_). Что бы вы рекомендовали вместо этого? – Lilith

+0

Вы уверены, что _инвертированная запятая составляет 146? Я просто копировал и вставлял его из своего OP в свой редактор, сохранял его, делал 'hexdump -C' и получил' e2 80 99'. – PerlDuck

ответ

1

Проблема не в моем скрипте, это было в моем редакторе. Скрипт работает правильно, и вопрос основан на ложных предлогах. Я использовал gVim для Windows, который не играл хорошо с Unicode. Мой скрипт правильно декодировал контент, но когда я открыл выходной файл в gVim, он исказил текст и отобразил его неправильно. Мои попытки использовать регулярные выражения для изменения символов не удались, потому что я использовал неправильный код - это не было 0x92, это было 0x2019. Это был очередной провал gVim. Спасибо hobbs и ikegami за то, что помогли мне понять это.

5

Символ, который вы пытаетесь заменить, только 0x92/146 в кодировке Windows-1252. Perl использует Unicode, где этот символ U+2019 RIGHT SINGLE QUOTATION MARK, aka "\x{2019}", chr(0x2019), или chr(8217).

+0

Итак, я должен искать подходящий кодовый сайт _unicode_ онлайн и делать замены таким образом? Могу ли я использовать модуль Encode на моем входе? Если да, то как? – Lilith

+0

@Lilith вам не нужен модуль Encode, ваш вход уже был правильно декодирован (с использованием модуля Encode) LWP. LWP :: Simple использует метод decoded_content для HTTP :: Response. – hobbs

+0

Итак, как мне сделать свой сценарий правильно напечатанным? Я пометил выходной файл как utf8, используя IO :: All, а затем распечатал вывод напрямую. Вместо этого он появился как «â € ™».Я мог бы просто добавить замены для трех символов (открытые/закрытые двойные кавычки и правая одиночная кавычка), но я скорее решил бы проблему, чем симптом. – Lilith

4

Начинающий узнает, что такое $content. Вы можете использовать следующее:

use Data::Dumper; 
local $Data::Dumper::Useqq = 1; 
warn(Dumper($content)); 

Если вы получаете следующее, $content декодируется

$VAR1 = "...\x{2019}..."; 

Любой из следующих будет работать.

use utf8; # Source code is encoded using UTF-8. 
$content =~ s/’/'/g; 

$content =~ s/\x{2019}/'/g; 

$content =~ s/\N{U+2019}/'/g; 

$content =~ s/\N{RIGHT SINGLE QUOTATION MARK}/'/g; 

Если вы получаете следующее, $content кодируется с использованием UTF-8.

$VAR1 = "...\342\200\231..."; 

Старт путем декодирования значения $content, используя одно из следующих действий:

utf8::decode($content) or die; 

use Encode qw(decode_utf8); 
$content = decode_utf8($content); 

Затем с помощью любого из решений для декодированного содержимого (выше).


Если вы получаете следующее, $content кодируется с использованием CP1252.

$VAR1 = "...\222..."; 

Начало, расшифровка значения $content.

use Encode qw(decode); 
$content = decode("cp1252", $content); 

Затем используйте любое из решений для декодированного контента (см. Выше).


Кстати, ’ является то, что кодировка UTF-8 из (E2 80 99) будет выглядеть, если декодируется как cp1252.

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