0

私はRose::DB :: ObjectSQLite、および中国語のテキストを使用しています。私のクラスは次のようになります。

package My::DB;

use base qw(Rose::DB);

__PACKAGE__->use_private_registry;

__PACKAGE__->register_db(
  driver   => 'sqlite',
  database => 'data/sqmple.db',
);

package Motorcycle;

use My::DB;

use base qw(Rose::DB::Object); 
...
sub init_db { My::DB->new() };

レコードの保存に使用されるコード:

Motorcycle->new(
  type  => $self->param('type'),
  brand => $self->param('brand'),
  color => $self->param('color'),
)->save;

(Mojoliciousアプリ内から)データを表示するために使用されるコード:

<td><%= Mojo::ByteStream->new($cycle->type)->decode("utf-8") %></td>
<td><%= Mojo::ByteStream->new($cycle->brand)->decode("utf-8") %></td>
<td><%= Mojo::ByteStream->new($cycle->color)->decode("utf-8") %></td>

デコード手順を削除するにはどうすればよいですか?代わりに、表示コードを次のようにしたいと思います。

<td><%= $cycle->type %></td>
<td><%= $cycle->brand %></td>
<td><%= $cycle->color %></td>
4

2 に答える 2

0

sqlite_unicode => 1構成値をSQLiteに下げる必要があると思います.UTF-8とSQLiteについて同様の質問sqlite_unicodeがありました.設定はそこでトリックを行いました.

Rose::DB::SQLiteがこの設定パラメータをサポートしているとは思いません。この MySQL と同様の問題に基づいて、Rose::DB::SQLite にパッチを適用sqlite_unicodeして、これをドライバーに追加することでサポートを追加できる場合があります。

sub sqlite_unicode {
{
  shift->dbh_attribute_boolean('sqlite_unicode', @_)
}

ジョンの答えにコメントを残して、彼がこれを正気でチェックできるようにします。

それが機能する場合は、パッチを John Siracusa に送信することをお勧めします (彼は既にこの質問に回答しているだけでなく、Rose::DB のメンテナーでもあります)。

于 2011-02-15T23:05:59.107 に答える
0

UTF8 でエンコードされたテキストを SQLite にフィードすると、同じ形式で返されるはずです。たとえば、次のスキーマを含む test.db という名前の SQLite データベースがあるとします。

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{e2}\x{98}\x{ba}」ではなく「\x{263a}」が返されます。その場合の解決策は、オブジェクト属性を設定する前に文字列を UTF8 としてエンコードすることです。

Motorcycle->new(
  type  => utf8::encode($self->param('type')),
  brand => utf8::encode($self->param('brand')),
  color => utf8::encode($self->param('color')),
)->save;
于 2011-02-15T16:33:08.047 に答える