2012-01-20 2 views
2

У меня есть действительно дерьмовый файл, полный байтов юникода, который я пытаюсь очистить. Некоторые примеры из файла являются следующими:Как заставить Perl правильно интерпретировать байты Unicode?

ブラック 
roler coaster 
digital social party 
big bellie 
cornacopia 
\xd0\xb7\xd1\x83\xd0\xb1\xd0\xbd\xd0\xb0\xd1\x8f \xd1\x89\xd0\xb5\xd1\x82\xd0\xba\xd0\xb0 

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

ブラック 
roler coaster 
digital social party 
big bellie 
cornacopia 
зубная щетка 

Я стучал головой о том, как сделать это в Perl монетой часа теперь, и я из хороших идей. Если у вас есть, я бы хотел это услышать.

+1

Что вы имеете в виду под "Юникод байт"? Ли линия, следующая за «cornacopia» (она написана «рог изобилия», BTW) на самом деле содержит символы обратной косой черты? Какой текст «реального текста Юникода» вы хотите создать (UTF-8? UTF-16? Что-то еще?) –

+0

Да, он имеет обратную косую черту. Я дал вставить именно то, что находится в файле. Вот почему «cornacopia» ошибочно написана. Я просто хочу преобразовать его в utf8. – Eli

+0

[Encode :: Escape] (http://p3rl.org/Encode::Escape), [String :: Escape] (http://p3rl.org/String::Escape) - http://stackoverflow.com/questions/8740106/оценка-escape-последовательности-in-perl http://stackoverflow.com/questions/2660123/how-can-i-manually-interpolate-string-escapes-in-a-perl-string – daxim

ответ

9

Это UTF-8

$ perl -E' 
    use open ":std", ":locale"; 
    use Encode qw(decode); 
    $_ = q{\xd0\xb7\xd1\x83\xd0\xb1\xd0\xbd\xd0\xb0\xd1\x8f }. 
     q{\xd1\x89\xd0\xb5\xd1\x82\xd0\xba\xd0\xb0}; 
    s/\\x(..)/chr hex $1/seg; 
    $_ = decode("UTF-8", $_); 
    say; 
' 
зубная щетка 
Смежные вопросы