如何使用Perl的DBI处理unicode?

ede*_*ter 18 unicode perl dbi

我的美味到wp perl脚本可以工作但是给所有"怪异"字符甚至更奇怪的输出.所以我试过了

$description = decode_utf8( $description ); 
Run Code Online (Sandbox Code Playgroud)

但这并没有什么不同.我希望例如"go live"成为"go live"而不是"live live"我如何在Perl中处理unicode以便这样做?

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

my $sql = qq{SET NAMES 'utf8';};
$dbh->do($sql);
Run Code Online (Sandbox Code Playgroud)

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

Pen*_*old 20

值得注意的是,如果您运行的DBD :: mysql版本足够新(3.0008开启),您可以执行以下操作:$dbh->{'mysql_enable_utf8'} = 1;然后在从/向出的路上为您编写所有解码()ed/encode()到DBI.

  • 对于像我这样的懒人,这是dbic变体:Schema-> connect("dbi:mysql:".$ db {db},$ db {user},$ db {pass},{mysql_enable_utf8 => 1}); (6认同)

小智 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.";
Run Code Online (Sandbox Code Playgroud)

这应该为您提供字符模式字符串,并根据需要设置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以获得相同的效果.


小智 5

术语

$dbh->do(qq{SET NAMES 'utf8';});
Run Code Online (Sandbox Code Playgroud)

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

$utfstring = decode('utf8',$string_from_db);
Run Code Online (Sandbox Code Playgroud)

当然,对于utf8字符串的正确I / O处理(读取,打印,写入输出),请记住设置

use open ':utf8';
Run Code Online (Sandbox Code Playgroud)

binmode STDOUT, ":utf8";
Run Code Online (Sandbox Code Playgroud)

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


Ric*_*ões 3

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