Получение í вместо í при уборке / очистке с использованием сценария Perl - PullRequest
2 голосов
/ 02 апреля 2012

Я собрал сайт, используя Perl, но я что-то упустил в начале.Теперь, когда я начинаю загружать данные, я вижу некоторые странные символы, такие как í и многие другие.Строка Líder de Projetos, но я получил Líder de Projetos.У меня 40 текстовых файлов размером около 50 ГБ.

Как я могу исправить их, не собирая урожай снова?

Ответы [ 3 ]

3 голосов
/ 02 апреля 2012

Строки символов, которые вы видите, называются символьными ссылками на сущности или чаще в этом контексте. Это способ использовать символы, которые они представляют, в ограниченной кодировке символов, которая не поддерживает символы. Вы видите это вместо акцентированного «i», потому что, когда вы собирали контент, вы явно не говорили «харвестеру», что делать с такими персонажами. Возможно, на исходной странице использовались эти ссылки на сущности, или, возможно, «харвестер» предположил, что это именно то, что вам нужно, и превратил символы в ссылки на сущности.

Чтобы "исправить" их, вам нужно решить, что именно вы хотите делать с этим контентом. Т.е .: что собираются использовать эти данные. Как только вы это поймете, у вас есть хотя бы пара вариантов.

  1. Ничего не делать: если вы отправляете этот контент чему-то, что использует ограниченный набор символов, такой как ASCII, и знает, как использовать эти ссылки на сущности, то вы, вероятно, в порядке, просто оставив их там. Например, если вы просто используете их для создания большего количества веб-страниц, вы можете оставить их как есть, и они должны правильно отображаться при просмотре веб-страницы.

  2. Расшифруйте их, используя модуль perl, такой как HTML :: Entities : Если вы знаете, что объект, на который вы отправляете, может поддерживать представление Unicode (например, UTF-8), тогда Вы можете использовать функцию decode_entities () из этого модуля, чтобы превратить эти строки в символы Юникода. Если вы сделаете это, помните, что некоторые вещи, которые вам могут понадобиться для представления представлений, будут декодированы, и вам может понадобиться перекодировать их или каким-то образом не допустить их декодирования.

2 голосов
/ 02 апреля 2012

í - это экранирование объекта для символа с шестнадцатеричным порядковым значением ED.Вы уверены, что это не так в исходном коде?

Если вы хотите заменить их на значения символов, используйте модуль для их декодирования:

use v5.10.1;

binmode STDOUT, ':utf8';

use XML::Entities;

my $encoded = "Líder de Projetos";
my $decoded = XML::Entities::decode('all', $encoded);

say $decoded;

Теперь вывод неесть объекты:

Líder de Projetos
0 голосов
/ 02 апреля 2012
#!/usr/bin/perl

use strict;
use warnings;

$/ = undef;
my $file = 'test.txt';

open  FILE, "<$file" or die;
$_ = <FILE>;
close FILE;

s/&#x(..);/{chr(hex($1))}/ige;

open  FILE, ">$file" or die;
print FILE $_;
close FILE;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...