我的美味到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.
小智 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标志.
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字符串至关重要。希望这可以帮助。