在perlv5.10.1中,我尝试读取文件并将字符串存储在数据库中。当字符串包含重音和外来字符时会出现问题。
在centos 6上,“locale”命令指示:lang=en\u us.utf-8
我的数据库是mysql,我正在写的字段是varchar(64)utf8\u unicode\u ci。
我通过putty控制台运行我的测试,设置为window>translation>remotecharacterset:utf8,虽然打印的字符是乱码,但这不是主要问题。
这是我的剧本:
# !/usr/bin/perl
use warnings;
use strict;
use utf8;
use open ':std', ':encoding(UTF-8)';
use DBI;
# A test string
my $test = 'é';
print "- 1: $test\n";
# First string in my file, containing a single 'é'
my $string = '';
open(my $fh, '<', 'myFile');
while(my $line = <$fh>) {
chomp $line;
$string = $line;
last;
}
close $fh;
print "- 2: $string\n";
# Writing test string and first string in DB
my $dbistring = 'DBI:mysql:database=xxxx;host=xxxx;port=xxxx';
my $socket = DBI->connect($dbistring, 'xxxx', 'xxxx');
my $cmd = 'UPDATE Strings SET string="'.$test.'" WHERE id=1';
my $request = $socket->prepare($cmd);
$request->execute();
$cmd = 'UPDATE Strings SET string="'.$string.'" WHERE id=2';
$request = $socket->prepare($cmd);
$request->execute();
照片如下:
1: ▒
2: ▒
在my db表中,字段的结尾为:
id 1:ã©
id 2:ã©
为了避免perl字符串串联可能产生的双重编码,我尝试了:
$string = Encode::decode('UTF-8', $string);
给我同样的结果。如果我在打开文件时指示“<:编码(utf-8)”,则相同。
我很困惑,因为我的进程链似乎都设置在utf8中。非常感谢您的建议。
2条答案
按热度按时间huwehgph1#
perl中的几个问题
乱码
用utf-8字符查看“mojibake”故障;我所看到的并不是我为检查其他问题而存储的内容。
8nuwlpux2#
这篇有价值的文章提供了解决方案:
dbi与db通信时出现问题,连接时添加mysql\u enable\u utf8标志解决: