如何在Perl ASP SQLite数据库中保存®(注册商标)

时间:2013-01-22 15:50:19

标签: html perl sqlite asp-classic

我无法隔离这个问题。我有一个HTML表单文本输入,通过Perl ASP保存到SQLite数据库中。如果我只保存表单数据®或者使用以下内容替换字符:

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

如果我使用上面的代码替换商标,我会在收到®ÂR数据时获得额外的字符,再次保存并再次获得î {{1} }}。 ÃÂî来自哪里?

4 个答案:

答案 0 :(得分:1)

在connect:

中将sqlite_unicode属性设置为1
$dbh = DBI::connect( "dbi:SQLite:dbname=foo", "", "", { sqlite_unicode => 1 } );

之后,在设置一些二进制数据列时,您可能需要明确地将它们表示为二进制数据:

$sth->bind_param(1, $binary_data, SQL_BLOB);

答案 1 :(得分:1)

使用它时,字符串可能是UTF-8(Perl的字符编码标准)。 UTF-8中的注册商标符号是两个字节,您只能替换其中一个。 See more information here for the encoding of that character

如果要用正则表达式替换符号,请使用chr()以外的方法匹配相应的字符。你应该能够做到这一点:

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

\x匹配以十六进制给出的UTF-8字符。我从上面链接的页面中获得了十六进制编码。

有关详细信息,请参阅perlre中的“转义序列”。

另请参阅Encode核心模块,以获取有关Perl如何处理字符编码的更多信息。

答案 2 :(得分: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

答案 3 :(得分:0)

用以下内容查看字符串中的字符后:

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

我发现来自html表单文本输入的®正在被处理/接收为chr(194).chr(174)。所以:

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

允许我将其保存到数据库而不会出现问题......