Perl декодировать строку в кириллице

0

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

$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... являются кириллическими символами.

Что я могу сделать, чтобы сделать \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});
  • 2
    В какой кодировке находятся эти символы?
  • 0
    они имеют кодировку «Quoted-Printable» utf8 \ 320 \ 263 \ 320 \ 270 - это 2 буквы \ 321 \ 263 первая \ 320 \ 270 секунда.
Показать ещё 5 комментариев
Теги:
logging
utf-8
encoding

3 ответа

5
Лучший ответ

Это вообще не кавычка. Это строковое представление, указанное в 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', …, …);
  • 0
    Это не помогло. Ответьте с помощью $ var = decode 'unicode escape', $ var; было правильно. или нет. но работает и $ dbh = DBI-> connect ($ config -> {sql} -> {DBI}, $ config -> {sql} -> {user}, $ config -> {sql} -> {pass}, {mysql_enable_utf8 => 1}); помог мне с правильным просмотром веб MySQL. почему это не работает для меня?
  • 0
    Вы изменили проблему! Сначала у вас была интерполирующая строка "…\321\213…" , затем после вашего редактирования она превратилась в не интерполирующую строку '\321\213' . Знаешь, есть большая разница.
Показать ещё 1 комментарий
1

Вам нужно явно преобразовать коды в символы. Для этого вам нужно знать, что такое кодировка ввода. Я предполагаю, что это 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
    это строка в формате unicode. найдено в документе
  • 0
    Ответ не подходит к вопросу. Почему ты просто не попробовал свой код? Это производит mojibake.
Показать ещё 1 комментарий
-3

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

Encode::_utf8_on($str);

  • 0
    -1 Это неправильный способ обработки закодированных данных. Смотрите p3rl.org/UNI для правильного API.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню