Perl打印越南人物

时间:2017-11-15 15:35:25

标签: mysql perl

我试图通过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'};
}

打印屏幕

LINK1 - PHPMyAdmin look fine

LINK2 - Retrieve and print out error

2 个答案:

答案 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进行打印。只有cp850cp437才能转换为至少符号ô

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,字符串也会变得怪异。