我试图通过perl程序从Mysql数据库中读取越南语地址。但它会显示一些无法识别的特殊字符。当我看到phpMyAdmin中的字符串没问题。并使用PHP来检索和打印字符串也没问题。只使用perl打印出字符串会变得很奇怪。
原文
QL37, Phố Vôi, tt. Vôi, Lạng Giang, Bắc Giang, Vietnam
打印后
QL37, Phoá Voâi, tt. Voâi, Laïng Giang, Baéc Giang, Vietnam
数据库结构
CREATE TABLE `address` (
`Address_Id` int(11) NOT NULL,
`Coordinate_Lat` float(15,6) NOT NULL,
`Coordinate_Long` float(15,6) NOT NULL,
`Address` varchar(300) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Perl代码
my $sql = "SELECT * FROM `address`";
my $sth = $DBIconnect->prepare($sql);
$sth->execute or die "SQL Error: $DBIconnect::errstr\n";
while (my $row = $sth->fetchrow_hashref) {
print $row->{'Address'};
}
打印屏幕
答案 0 :(得分:0)
您需要将-C
添加到cmdline。 perldoc perlrun
或者添加#!/usr/bin/perl -C
作为第一行以启用Unicode输出。
答案 1 :(得分:0)
我尝试使用以下代码设置DBI连接。但结果仍然相同。
my $dsn= "dbi:mysql:database=$database:$host;mysql_connnect_timeout=15;user=$user;password=$password";
my $DBI = DBI->connect($dsn, {mysql_enable_utf8 => 1}) or die "Unable to connect: $DBI::errstr\n";
$DBI->do("SET NAMES utf8");
$DBI->do("SET CHARACTER SET utf8");
之后我复制出字符串并测试而不连接数据库。我正在使用Encode进行打印。只有cp850
和cp437
才能转换为至少符号ô
use utf8;
use Encode 'encode';
$address="QL37, Phố Vôi, tt. Vôi, Lạng Giang, Bắc Giang, Vietnam";
print $address."\n";
# QL37, Ph? V⌠i, tt. V⌠i, L?ng Giang, B?c Giang, Vietnam
print encode cp850 => $address."\n";
# QL37, Ph? Vôi, tt. Vôi, L?ng Giang, B?c Giang, Vietnam
print encode cp1252 => $address."\n";
# QL37, Ph? V⌠i, tt. V⌠i, L?ng Giang, B?c Giang, Vietnam
print encode cp437 => $address."\n";
# QL37, Ph? Vôi, tt. Vôi, L?ng Giang, B?c Giang, Vietnam
print encode cp1258 => $address."\n";
# QL37, Ph? V⌠i, tt. V⌠i, L?ng Giang, B?c Giang, Vietnam
print encode VISCII => $address."\n";
# QL37, Ph? V⌠i, tt. V⌠i, L?ng Giang, B?c Giang, Vietnam
实际上主要问题是我处理数据后需要插回数据库。 print命令仅适用于我的调试。我已经尝试将地址插回msyql,字符串也会变得怪异。