0

この問題を特定することはできません。Perl ASP を介して SQLite データベースに保存されている HTML フォーム テキスト入力があります。フォームデータを保存するだけの場合®、または次を使用して文字を置き換える場合:

    $registered = chr(174);
$DESCRIPTION =~ s/$registered/R/g;

データが取得されたときに余分な文字が表示される®ÂR、商標を上記のコードに置き換えて再度保存するとî、再び , が表示されÃÂîます。はどこÃÂから来たのですか??

4

4 に答える 4

1

文字列を操作しているときは、おそらくUTF-8(Perlの文字エンコードの標準)になっています。UTF-8の登録商標記号は2バイトであり、そのうちの1つだけを置き換えています。 その文字のエンコーディングについては、こちらの詳細を参照してください

chr()記号を正規表現に置き換える場合は、適切な文字と一致させる以外の方法を使用してください。あなたはこれを行うことができるはずです:

s/\x{c2ae}/R/g;

\x16進数で指定されたUTF-8文字に一致します。上記のリンク先のページから16進エンコーディングを取得しました。

詳細については、perlreの「エスケープシーケンス」を参照してください。

EncodePerlが文字エンコードを処理する方法の詳細については、コアモジュールも参照してください。

于 2013-01-22T16:00:24.293 に答える
1

接続で sqlite_unicode 属性を 1 に設定します。

$dbh = DBI::connect( "dbi:SQLite:dbname=foo", "", "", { sqlite_unicode => 1 } );

その後、いくつかのバイナリ データ列を設定するときに、それらをバイナリとして明示的に示す必要がある場合があります。

$sth->bind_param(1, $binary_data, SQL_BLOB);
于 2013-01-22T15:57:27.383 に答える
0

実際に文字列内の文字を確認した後、次のようにします。

foreach (split //, $DESCRIPTION) {
     $hold = ord($_);
     %>chr(<%= $hold %>)<br><%
}

®HTML フォームからのテキスト入力が chr(194).chr(174) として処理/受信されていることがわかりました。そう:

    $registered = chr(194).chr(174);
$DESCRIPTION =~ s/$registered/&#174;/g;

問題なくデータベースに保存できます...

于 2013-01-22T19:30:44.020 に答える
0

たぶん、このツアーはあなたがヒットしているものに光を当てるでしょう? 私はchr2あなたの問題がどこにあると推測しています。

use strictures;
use utf8;
use DBI;

my $dbh = DBI->connect("dbi:SQLite::memory:", undef, undef,
                       { sqlite_unicode => 1,
                         PrintError => 1 } );

$dbh->do(<<"");
   CREATE TABLE moo (
    name TEXT
    ,string TEXT )

my $insert = $dbh->prepare("INSERT INTO moo VALUES ( ?, ? )");

my %reg = ( raw => "®", # note "use utf8;"
            "chr" => chr(174) );

while ( my ( $name, $reg ) = each %reg )
{
    $insert->execute($name, $reg);
}

# And a couple without placeholders (which we all know is EVIL, right?)
$dbh->do(<<"");
    INSERT INTO moo VALUES( "raw2", "®" )

my $reg = chr(174);
$dbh->do(<<"");
    INSERT INTO moo VALUES( "chr2", "$reg" )

my $sth = $dbh->prepare("SELECT * FROM moo");

$sth->execute;

binmode STDOUT, ":encoding(UTF-8)";
while ( my $row = $sth->fetchrow_hashref )
{
    print $row->{name}, " -> ", $row->{string}, $/;
}

__DATA__
chr -> ®
raw -> ®
raw2 -> ®
"\x{00ae}" does not map to utf8.
chr2 -> \xAE
于 2013-01-22T18:17:19.663 に答える