Я играю вокруг pplog, одного блога с файловой базой.
Запись в код файла:
open(FILE, ">$config_postsDatabaseFolder/$i.$config_dbFilesExtension");
my $date = getdate($config_gmt);
print FILE $title.'"'.$content.'"'.$date.'"'.$category.'"'.$i; # 0: Title, 1: Content, 2: Date, 3: Category, 4: FileName
print 'Your post '. $title.' has been saved. <a href="?page=1">Go to Index</a>';
close FILE;
Вводимый текст:
春眠不覺曉,處處聞啼鳥. 夜來風雨聲,花落知多小.
После сохранения в файл он становится:
春眠不覺�›�,處處聞啼鳥. 夜來風�›�聲,花落知多小.
Я могу использовать Eclipse, чтобы отредактировать файл и сделать его нормальным.Проблема существует во время печати в файл.
Некоторая базовая информация: Strawberry Perl 5.12 без использования utf8;попробовал использовать utf8 ;, не имеет эффекта.
Спасибо.
--- EDIT --- Спасибо за комментарии.Я проследил код:
Коды добавления нового контента:
# Blog Add New Entry Page
my $pass = r('pass');
#BK 7JUL09 patch from fedekun, fix post with no title that caused zero-byte message...
my $title = r('title');
my $content = '';
if($config_useHtmlOnEntries == 0)
{
$content = bbcode(r('content'));
}
else
{
$content = basic_r('content');
}
my $category = r('category');
my $isPage = r('isPage');
sub r
{
escapeHTML(param($_[0]));
}
sub r перенаправляет команду в функцию CGI.pm.
В CGI.pm
sub escapeHTML {
# hack to work around earlier hacks
push @_,$_[0] if @_==1 && $_[0] eq 'CGI';
my ($self,$toencode,$newlinestoo) = CGI::self_or_default(@_);
return undef unless defined($toencode);
$toencode =~ s{&}{&}gso;
$toencode =~ s{<}{<}gso;
$toencode =~ s{>}{>}gso;
if ($DTD_PUBLIC_IDENTIFIER =~ /[^X]HTML 3\.2/i) {
# $quot; was accidentally omitted from the HTML 3.2 DTD -- see
# <http://validator.w3.org/docs/errors.html#bad-entity> /
# <http://lists.w3.org/Archives/Public/www-html/1997Mar/0003.html>.
$toencode =~ s{"}{"}gso;
}
else {
$toencode =~ s{"}{"}gso;
}
# Handle bug in some browsers with Latin charsets
if ($self->{'.charset'}
&& (uc($self->{'.charset'}) eq 'ISO-8859-1' # This line cause trouble. it treats Chinese chars as ISO-8859-1
|| uc($self->{'.charset'}) eq 'WINDOWS-1252')) {
$toencode =~ s{'}{'}gso;
$toencode =~ s{\x8b}{‹}gso;
$toencode =~ s{\x9b}{›}gso;
if (defined $newlinestoo && $newlinestoo) {
$toencode =~ s{\012}{ }gso;
$toencode =~ s{\015}{ }gso;
}
}
return $toencode;
}
Далее проследить проблему, обнаружив в браузере значение по умолчанию iso-8859-1, даже вручную установив utf-8, отправляет строку обратно всервер как iso-8859-1.
Наконец,
print header(-charset => qw(utf-8)), '<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
добавить параметр -charset => qw (utf-8) в заголовок.Китайское стихотворение - это все еще китайское стихотворение.
Спасибо за комментарии Шверна, это вдохновило меня на то, чтобы отследить проблему и выучить leeson.