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 ...是西里尔符号.
这应该在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)
这根本不是可引用的.这是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)
| 归档时间: |
|
| 查看次数: |
1104 次 |
| 最近记录: |