perl解码字符串在西里尔文

Mea*_*roM 0 mysql perl logging encoding utf-8

我遇到以下字符串的问题:

$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";
Run Code Online (Sandbox Code Playgroud)

此字符串位于ascii文本文件中,我想存储在Mysql数据库(utf8)中.\ 321\231 ...是西里尔符号.

我怎样才能使\ 321\213看起来像Mysql db中的西里尔字符

这应该在RFC2047中描述,结束看起来就像utf7到utf8的转换..不要兴奋地知道.它的"unicode逃脱"

工作变种:

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});
Run Code Online (Sandbox Code Playgroud)

dax*_*xim 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";
#                                                     ????                                                 ????
Run Code Online (Sandbox Code Playgroud)

这在UTF-8中无效,但可以修复.我们把Unicode替换字符.

use Encode qw(decode);
my $characters = decode 'UTF-8', $octets, Encode::FB_DEFAULT | Encode::LEAVE_SRC;
# this is ????? ???????
Run Code Online (Sandbox Code Playgroud)

现在可以像往常一样将此字符串简单地插入到数据库中.connect调用DBI或DBIx :: Class时的DSN 必须包含该属性mysql_enable_utf8.

connect('DBI:mysql:foobar;mysql_enable_utf8=1', …, …);
Run Code Online (Sandbox Code Playgroud)