XML :: Codeを使用して、CGIモジュールを介して受信したGETパラメーターからXMLデータを作成しています。Webサーバーは文字セットがUTF-8に設定されたApacheであり、送信フォームは
<!DOCTYPE html>
<html lang="en-GB">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
ヘッダ。CGIは次のようになります。
use CGI;
use Encode;
use XML::Code;
binmode(STDOUT, ":utf8");
binmode(STDIN, ":utf8");
my $cgi = CGI->new();
print $cgi->header(-type => "text/xml", -charset => "utf-8");
my $object = $cgi->param("object");
$object = decode("utf-8", utf8::upgrade($object));
my $content = XML::Code->new("formdata");
$content->version ("1.0");
$content->encoding ("UTF-8");
my $sub_content = XML::Code->new("object");
$sub_content->set_text($object);
$content->add_child($sub_content);
$sub_content = XML::Code->new("isutf");
$sub_content->set_text(utf8::is_utf8($object));
$content->add_child($sub_content);
print $content->code();
http://mydomain.com/cgi-bin/formdata.pl?object =öでcgiを呼び出すと、出力(firebugからコピーされたもの)は次のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<formdata>
<object>ö</object>
<isutf>1</isutf>
</formdata>
CGIからbinmode(STDOUT、 ":utf8")を削除すると、探しているものが得られます
<?xml version="1.0" encoding="UTF-8"?>
<formdata>
<object>ö</object>
<isutf>1</isutf>
</formdata>
これでこの問題を解決する方法がわかりましたが、すべてをUTF-8に設定する場合は安全だと思いました。そうでなければ、もっと多くのテストを意味するでしょう。それはperlライブラリまたは私の考えのバグですか?
最高、マーカス