Perl декодировать строку в кириллице - PullRequest
0 голосов
/ 17 мая 2011

У меня проблема со следующей строкой:

$str="this is \321\213\321\213\321\213\321\213\321\213 \321\201\320\277\320\260\321\200\321\202\320\260\321\200";

Эта строка находится в текстовом файле ascii, и я хочу сохранить ее в базе данных MySQL (utf8).\ 321 \ 231 ... являются символами кириллицы.

Что я могу сделать, чтобы \ 321 \ 213 выглядел как кириллические символы в Mysql db

Это должно быть описано в RFC2047, в конце похоже, что преобразование utf7 в utf8 ...,"Unicode Escape"

рабочий вариант:

use Encode::Escape;
$var1='\321\213';
         print decode 'unicode-escape', $var1;
#correct mysql view in phpmyadmin
$dbh = DBI->connect('DBI:mysql:database=test', 'testuser', 'testpass', { mysql_enable_utf8 => 1});

Ответы [ 3 ]

5 голосов
/ 17 мая 2011

Это не для цитирования вообще.Это строковое представление в кавычках Perl, также известное как PERLQQ, из серии октетов.Числа восьмеричные.

Эти байты по большей части кодируют UTF-8, но данные содержат две ошибки.Похоже, одна половина персонажа каждый так или иначе отвалился.Я пометил его стрелками чуть ниже.

my $octets = "this is \321\213\321\213\321\213\321\213\321 \321\201\320\277\320\260\321\200\321\202\320\260\321";
#                                                     ↑↑↑↑                                                 ↑↑↑↑

Это недействительно в UTF-8, но может быть исправлено.Мы помещаем символ замены Unicode .

use Encode qw(decode);
my $characters = decode 'UTF-8', $octets, Encode::FB_DEFAULT | Encode::LEAVE_SRC;
# this is ыыыы� спарта�

Теперь эту строку символов можно просто вставить в базу данных, как обычно.DSN в вызове connect для DBI или DBIx :: Class должен включать атрибут mysql_enable_utf8.

connect('DBI:mysql:foobar;mysql_enable_utf8=1', …, …);
1 голос
/ 17 мая 2011

Вам необходимо явно преобразовать коды в символы. Для этого вам нужно знать, что такое входная кодировка. Я полагаю, это iso-8859-5, но это может быть Windows-1252 или что-то еще.

use Encode qw( decode );

my $str="this is \321\213\321\213\321\213\321\213\321 \321\201\320\277\320\260\321\200\321\202\320\260\321";
my $out .= from_to( "iso-8859-5","utf-8", $str );

Я только что видел, что ваша исходная строка действительно QP, поэтому вам нужно преобразовать QP в байты; это просто, просто используйте MIME :: QuotedPrint :

use MIME::QuotedPrint ();

my $out = MIME::QuotedPrint::decode($str);
0 голосов
/ 17 мая 2011

Проблема в том, что perl не знает, что это строка UTF-8, поэтому вы должны явно включить флаг.

Encode::_utf8_on($str);

...