В Perl v5.10.1 я пытаюсь прочитать файл и сохранить строки в базе данных.
Проблемы возникают, когда строки содержат акценты и экзотические символы.
В моем CentOS 6 команда locale указывает:
LANG = en_US.UTF-8
Моя БД - MySQL , поле, на котором я пишу, - varchar (64) utf8_unicode_ci .
Я запускаю свой тест через консоль Putty, выбрав «Окно»> «Перевод»> «Удаленный набор символов»: UTF8, хотя напечатанные символы искажены, но это не главная проблема.
Вот мой сценарий:
#!/usr/bin/perl
use warnings;
use strict;
use utf8;
use open ':std', ':encoding(UTF-8)';
use DBI;
# A test string
my $test = 'é';
print "- 1: $test\n";
# First string in my file, containing a single 'é'
my $string = '';
open(my $fh, '<', 'myFile');
while(my $line = <$fh>) {
chomp $line;
$string = $line;
last;
}
close $fh;
print "- 2: $string\n";
# Writing test string and first string in DB
my $dbistring = 'DBI:mysql:database=xxxx;host=xxxx;port=xxxx';
my $socket = DBI->connect($dbistring, 'xxxx', 'xxxx');
my $cmd = 'UPDATE Strings SET string="'.$test.'" WHERE id=1';
my $request = $socket->prepare($cmd);
$request->execute();
$cmd = 'UPDATE Strings SET string="'.$string.'" WHERE id=2';
$request = $socket->prepare($cmd);
$request->execute();
Отпечатки следующие:
В моей таблице БД поля заканчиваются как:
id 1: © 1036 *
id 2: © 1040 *
Чтобы избежать возможного двойного кодирования при конкатенации строк Perl, я попытался:
$string = Encode::decode('UTF-8', $string);
дает мне тот же результат.
То же самое, если при открытии файла указать «<: encoding (UTF-8)». </p>
Я очень запутался, поскольку моя цепочка процессов, кажется, полностью настроена в UTF8. Предложения с благодарностью.