У меня проблема со следующей строкой:
$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 db (utf8).\321\231... являются кириллическими символами.
Это должно быть описано в 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});
Это вообще не кавычка. Это строковое представление, указанное в 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', …, …);
"…\321\213…"
, затем после вашего редактирования она превратилась в не интерполирующую строку '\321\213'
. Знаешь, есть большая разница.
Вам нужно явно преобразовать коды в символы. Для этого вам нужно знать, что такое кодировка ввода. Я предполагаю, что это 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);
Проблема в том, что perl не знает, что строка UTF-8, поэтому вы должны явно указывать флаг.
Encode::_utf8_on($str);