19

我的delicious-to-wp perl 脚本有效,但为所有“怪异”字符提供了更怪异的输出。所以我尝试了

$description = decode_utf8( $description ); 

但这并没有什么不同。我希望例如“上线”变成“上线”而不是“上线” 我如何在 Perl 中处理 unicode 以使其正常工作?

更新:我发现问题是设置 DBI 的 utf 我必须在 Perl 中设置:

my $sql = qq{SET NAMES 'utf8';};
$dbh->do($sql);

那是我必须设置的部分,很棘手。谢谢!

4

6 回答 6

22

值得注意的是,如果您正在运行一个足够新的 DBD::mysql 版本(3.0008 上),您可以执行以下操作:$dbh->{'mysql_enable_utf8'} = 1;然后在退出/进入的过程中为您完成所有内容的 decode()ed/encode()ed到 DBI。

于 2009-06-12T07:13:11.193 回答
14

启用 UTF8,当您像这样连接到数据库时:

my $dbh = DBI->connect(
    "dbi:mysql:dbname=db_name", 
    "db_user", "db_pass",
     {RaiseError => 0, PrintError => 0, mysql_enable_utf8 => 1}
 ) or die "Connect to database failed.";

这应该会根据需要为您提供带有 UTF8 标志的字符模式字符串。

来自DBI 通用接口规则和注意事项

Perl 支持两种字符串:Unicode(内部为 utf8)和非 Unicode(如果强制采用编码,则默认为 iso-8859-1)。驱动程序应该接受这两种字符串,如果需要,将它们转换为正在使用的数据库的字符集。同样,当从数据库中获取不是 iso-8859-1 的字符数据时,驱动程序应将其转换为 utf8。

以及来自DBD::mysql的 mysql_enable_utf8 的详细信息

此外,打开这个标志告诉 MySQL 传入的数据应该被视为 UTF-8。这只有在作为调用 connect() 的一部分时才会生效。如果在连接后打开标志,则需要发出命令 SET NAMES utf8 才能获得相同的效果。

于 2012-06-20T06:23:46.560 回答
5

术语

$dbh->do(qq{SET NAMES 'utf8';});

绝对可以节省访问 utf-8 声明的数据库的时间,但请注意,如果您要对从 db 获取的任何数据进行任何 perl 处理,明智的做法是将其作为 utf8 字符串存储在 perl var 中,因为这个操作不是隐式的。

$utfstring = decode('utf8',$string_from_db);

当然,为了正确处理 utf8 字符串(读取、打印、写入输出)的 i/o,请记住设置

use open ':utf8';

binmode STDOUT, ":utf8";

后者对于打印 utf8 字符串至关重要。希望这可以帮助。

于 2011-01-06T12:30:57.980 回答
3

它可能与 Perl 无关。检查以确保您在相关的 MySQL 表列中使用 UTF 编码。

于 2009-06-11T21:26:04.207 回答
1

离开这个öne:

binmode STDOUT, ":utf8";

使用时:

$dbh->do(qq{SET NAMES 'utf8';});

否则你的输出将有双 utf8 编码,导致不可读的双字节字符!我花了几个小时才弄清楚这一点..

于 2011-05-12T17:05:36.747 回答
0

默认情况下,驱动程序 Perl/MySQL 处理二进制数据(至少我从 MySQL 5.1 和 5.5 的一些实验中得出了这一结论)。

在没有设置 mysql_enable_utf8 的情况下,我在向/从数据库写入/读取之前对字符串进行了编码/解码到 UTF-8/从 UTF-8 编码/解码。

它不应该依赖于 perl 内部的字符串表示作为字节数组;请注意,内部的“utf8”不保证是标准的 UTF-8;相反,单字节编码不保证是 ISO-8859-1;真的对UTF-8(而不是'utf8')进行编码/解码。

There are also some settings of MySQL (like SET NAMES above, as far as I remember there is a client encoding, a connection encoding, and a server encoding, whose interactions are not quite clear to me if they do not all have the same value) regarding to the encodings; setting all of them to UTF-8, and the recipe above, worked for me.

于 2016-02-11T10:51:58.107 回答