Если вы вводите кодированный в UTF8 текст в SQLite, он должен вернуть его вам в той же форме.Например, для базы данных SQLite с именем test.db, содержащей следующую схему:
CREATE TABLE things
(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR(64) NOT NULL
);
Запустите этот код в сценарии в том же каталоге, что и база данных test.db:
package My::DB;
use base qw(Rose::DB);
__PACKAGE__->use_private_registry;
__PACKAGE__->register_db
(
driver => 'sqlite',
database => 'test.db',
);
package My::Thing;
use base qw(Rose::DB::Object);
__PACKAGE__->meta->setup
(
table => 'things',
columns =>
[
id => { type => 'serial', primary_key => 1, not_null => 1 },
name => { type => 'text', length => 64, not_null => 1 },
],
);
sub init_db { My::DB->new }
package main;
# Set the name to a UTF8-encoded smiley: Unicode 0x263A
my $thing = My::Thing->new(name => "\x{e2}\x{98}\x{ba}")->save;
$thing = My::Thing->new(id => $thing->id)->load;
# This will print the UTF8-encoded smiley; make sure your
# terminal can handle UTF8 output.
print $thing->name, "\n";
Если это не работает для вас, то, возможно, ваши вызовы для получения параметров формы (например, $self->param('type')
) возвращают символьные строки вместо строк в кодировке UTF8.То есть в случае строки смайлика, возможно, $self->param('foo')
возвращает «\ x {263a}», а не «\ x {e2} \ x {98} \ x {ba}».В этом случае решением было бы закодировать строки как UTF8 перед установкой атрибутов объекта:
Motorcycle->new(
type => utf8::encode($self->param('type')),
brand => utf8::encode($self->param('brand')),
color => utf8::encode($self->param('color')),
)->save;