我无法隔离这个问题。我有一个HTML表单文本输入,通过Perl ASP保存到SQLite数据库中。如果我只保存表单数据®
或者使用以下内容替换字符:
$registered = chr(174);
$DESCRIPTION =~ s/$registered/R/g;
如果我使用上面的代码替换商标,我会在收到®
或ÂR
数据时获得额外的字符,再次保存并再次获得î
{{1} }}。 ÃÂî
来自哪里?
答案 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/®/g;
允许我将其保存到数据库而不会出现问题......