【发布时间】:2012-07-06 12:19:40
【问题描述】:
软件正在生成 UTF-8 文件,但将内容写入非 unicode 文件。我无法更改该软件,必须按现在的样子获取输出。不知道这是否会正确显示在此处,但德语变音符号“ä”在文件中显示为“ä”。
如果我在 Notepad++ 中打开文件,它会告诉我该文件是 UTF-8(无 BOM)编码的。现在,如果我在记事本中说“转换为 ANSI”,然后将文件编码切换回 UTF-8(不转换),则文件中的德语变音符号是正确的。如何在 Perl 中实现完全相同的行为?无论我到现在为止尝试过什么,变音符号都变得更糟了。
要重现,请为自己创建一个 UTF-8 编码文件并向其中写入内容:
好的,我试试。自己创建一个 UTF-8 文件并将其写入: Männer Schüle Vöogel SüÃ
然后,在 UTF-8 mysql 数据库上,创建一个表,其中 varchar 字段采用 UTF8_unicode 编码。现在,使用这个脚本:
use utf8;
use DBI;
use Encode;
if (open FILE, "test.csv") {
my $db = DBI->connect(
'DBI:mysql:your_db;host=127.0.0.1;mysql_compression=1', 'root', 'Yourpass',
{ PrintError => 1 }
);
my $sql="";
my $sql = qq{SET NAMES 'utf8';};
$db->do($sql);
while (my $line = <FILE>) {
my $sth = $db->prepare("INSERT IGNORE INTO testtable (testline) VALUES (?);");
$sth->execute($line);
}
}
文件的确切内容将被写入数据库。但是,我期望在数据库中的输出是德语变音符号:
Männer Schüler Vögel Süß
那么,我怎样才能正确转换呢?
【问题讨论】:
-
没有“非 unicode 文件”之类的东西。请提供您的输入示例、有效的脚本、当前输出和预期输出,以便人们知道您的问题出在哪里。
-
我用一些代码和示例数据扩展了我的文本。
-
离题:您应该将
prepare放在while循环之外。按照您的方式,prepare很昂贵,并且将为您文件的每一行完成。请参阅the DBI doc outline section 了解更多信息。 -
尝试添加
$line = utf8::decode($line);行作为while循环的第一条语句。 -
关于准备的好建议,谢谢:)