0

我正在解析一些html:

use Modern::Perl;
use Mojo::DOM;
use strict;
use DBI;
use DBD::mysql;
use utf8::all;

my $dbh = DBI->connect("DBI:mysql:db_name", "db_username") or die ("Error:  
$DBI::errstr");

my $html = do { local $/; <DATA> };
my $dom = Mojo::DOM->new($html);
my $text = $dom->all_text;
say $text;

my ($var1, $var2, $var3);  #normally have values assigned, but not relevant to example

#write $text to MySQL database 
$dbh->do("INSERT INTO table_name VALUES (?,?,?,?)",
                            undef,
$var1, $var2, $var3, $text
);


__DATA__
<div class="field-content"><p>&nbsp;</p>
<p>Here is some data with a trademark html symbol SUPER PRODUCT&trade;, featuring curved
LCD screen.</p></div>

将解析后的文本写入标准输出会产生以下结果:

Here is some data with a trademark html symbol SUPER PRODUCT™, featuring curved LCD 
screen.

一切都很好,这是写入 MySQL 的。但是,在 MySQL 中以及从 MySQL 中提取数据时,我们会得到:

Here is some data with a trademark html symbol SUPER PRODUCTâ„¢, featuring curved LCD
screen.

我怀疑这与 Unicode 有关,所以尝试更改 MySQL 状态设置,但仍然没有乐趣。如何正确解决这个问题?

4

1 回答 1

2

这个说法

#write $text to MySQL database 

掩盖了许多重要的细节,并且您没有包含描述如何从数据库中读取文本的代码,这也可能很难做到正确。

让我有根据地猜测您数据库中的文本是 UTF-8 编码的。然后,您将要解码来自该数据库列的所有内容:

use Encode;
$decoded_text = Encode::decode("utf-8", $raw_text);

# since you 'use utf8::all', this will get re-encoded to UTF-8 when you write
# it to standard output ...
print "decoded text is $decoded_text\n";
于 2013-02-04T19:19:10.470 回答