我遇到以下字符串的问题:
$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 ...是西里尔符号。
这应该在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});
答案 0 :(得分: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 replacement character。
use Encode qw(decode);
my $characters = decode 'UTF-8', $octets, Encode::FB_DEFAULT | Encode::LEAVE_SRC;
# this is ыыыы� спарта�
此字符串现在可以像往常一样简单地插入到数据库中。 connect
调用DBI或DBIx :: Class的DSN必须包含属性mysql_enable_utf8
。
connect('DBI:mysql:foobar;mysql_enable_utf8=1', …, …);
答案 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);
答案 2 :(得分:-2)
问题是:perl不知道字符串是UTF-8,所以你必须明确地打开标志。
Encode::_utf8_on($str);