質問を再定式化するのは
- @optionalは私に尋ねました
- 1つのHTML::Masonベースのソリューションが明確でリンクされていなかったため、Apache、mod_perl、およびDBIを使用してMason UTF-8 Unicodeをクリーンにする4つの簡単な手順により、混乱が生じました。
- オリジナルは4歳で、その間に(2012年に)「詩人」が作成されます
コメント:この質問はすでに「人気の質問バッジ」を獲得しているので、おそらく私だけが絶望的な人ではありません。:)
残念ながら、完全な問題スタックを示すことは非常に長い質問につながり、それは非常にメイソン特有です。
まず、意見のみの部分:)
私はHTML::Masonを長年使用しており、現在はMason2を使用しようとしています。詩人とメイソンは 、CPANで最も先進的なフレームワークです。何も比較できるものは見つかりませんでした。すぐに使えるもので、非常にクリーンな書き込みが可能です/しかし非常にハッキング可能です:)/多くのバッテリーが含まれているWebアプリ(ロギング、キャッシュ、構成管理、ネイティブPGSIベースなど...)
残念ながら、作者は残りの単語を気にしません。たとえば、デフォルトでは、ASCIIベースのみであり、 マニュアル、FAQ、またはアドバイスはありません。ユニコードでの使用方法
今事実。デモ。詩人アプリを作成します。
poet new my #the "my" directory is the $poet_root
mkdir -p my/comps/xls
cd my/comps/xls
そして、以下に追加しdhandler.mc
ます(2つの基本的な問題を実証するもの)
<%class>
has 'dwl';
use Excel::Writer::XLSX;
</%class>
<%init>
my $file = $m->path_info;
$file =~ s/[^\w\.]//g;
my $cell = lc join ' ', "ÅNGSTRÖM", "in the", $file;
if( $.dwl ) {
#create xlsx in the memory
my $excel;
open my $fh, '>', \$excel or die "Failed open scalar: $!";
my $workbook = Excel::Writer::XLSX->new( $excel );
my $worksheet = $workbook->add_worksheet();
$worksheet->write(0, 0, $cell);
$workbook->close();
#poet/mason output
$m->clear_buffer;
$m->res->content_type("application/vnd.ms-excel");
$m->print($excel);
$m->abort();
}
</%init>
<table border=1>
<tr><td><% $cell %></td></tr>
</table>
<a href="?dwl=yes">download <% $file %></a>
アプリを実行します
../bin/run.pl
http:// 0:5000 / xls / hello.xlsxにアクセスすると、次のようになります。
+----------------------------+
| ÅngstrÖm in the hello.xlsx |
+----------------------------+
download hello.xlsx
ダウンロードhello.xlsxをクリックすると、ダウンロードが表示hello.xlsx
されます。
上記は最初の問題を示しています。たとえば、コンポーネントのソースは「下」にないuse utf8;
ため、lc
は文字を理解しません。
2番目の問題は次のとおりです。[ http:// 0:5000 / xls /hélló.xlsx]または http:// 0:5000 / xls / h%C3%A9ll%C3%B3.xlsx を試してみてください。見る:
+--------------------------+
| ÅngstrÖm in the hll.xlsx |
+--------------------------+
download hll.xlsx
#note the wrong filename
もちろん、入力(path_info
)はデコードされません。スクリプトは、perl文字ではなく、utf8でエンコードされたオクテットで機能します。
したがって、perlに「ソースはutf8にあります」と伝えると、結果ににを追加use utf8;
します。<%class%>
+--------------------------+
| �ngstr�m in the hll.xlsx |
+--------------------------+
download hll.xlsx
追加use feature 'unicode_strings'
(またはuse 5.014;
)さらに悪い:
+----------------------------+
| �ngstr�m in the h�ll�.xlsx |
+----------------------------+
download h�ll�.xlsx
もちろん、ソースにはワイド文字が含まれているためEncode::encode_utf8
、出力に必要です。
次のようなフィルターを使用してみることができます。
<%filter uencode><% Encode::encode_utf8($yield->()) %></%filter>
出力全体をフィルタリングします。
% $.uencode {{
<table border=1>
<tr><td><% $cell %></td></tr>
</table>
<a href="?dwl=yes">download <% $file %></a>
% }}
<%init%>
ただし、または<%perl%>
ブロックのエンコーディングに注意する必要があるため、これは部分的にしか役立ちません。多くの場所でのperlコード内のエンコード/デコード(読み取り:境界ではない)は、spagethyコードにつながります。
エンコード/デコードは、 詩人とメイソンの境界のどこかで明確に行う必要があります。もちろん、Plackはバイトレベルで動作します。
部分的な解決策。
幸いなことに、詩人は巧妙にそれ(およびメイソン)の部分を変更することを許可しているので、 $poet_root/lib/My/Mason
あなたは次のように変更することができますCompilation.pm
:
override 'output_class_header' => sub {
return join("\n",
super(), qq(
use 5.014;
use utf8;
use Encode;
)
);
};
必要なプリアンブルをすべてのメイソンコンポーネントに挿入するもの。(すべてのコンポーネントに触れることを忘れないでください。または、コンパイルされたオブジェクトをから削除してください$poet_root/data/obj
)。
また、次のように編集して、境界でリクエスト/レスポンスを処理してみることができます$poet_root/lib/My/Mason/Request.pm
。
#found this code somewhere on the net
use Encode;
override 'run' => sub {
my($self, $path, $args) = @_;
#decode values - but still missing the "keys" decode
foreach my $k (keys %$args) {
$args->set($k, decode_utf8($args->get($k)));
}
my $result = super();
#encode the output - BUT THIS BREAKS the inline XLS
$result->output( encode_utf8($result->output()) );
return $result;
};
すべてをエンコードすることは間違った戦略です、それは例えばXLSを壊します。
したがって、4年後(2011年に最初の質問をした)はまだわかりません:( Mason2アプリケーションでUnicodeを正しく使用する方法はまだわかりませんが、それに関するドキュメントやヘルパーはまだ存在しません。:(
主な質問は次のとおりです。-どこで(Mooseのメソッド修飾子によってどのメソッドを変更する必要があるか)、入力をどのように正しくデコードし、出力をどこで(Poet / Masonアプリで)。
- しかし、テキストのものだけ、例えば
text/plain
またはtext/html
など... - 上記の「サプライズフリー」を実行します。たとえば、単純に機能するものを実行します。;)
誰かが実際のコードを手伝ってくれませんか?上記で何を変更する必要がありますか?