Perl CGIスクリプトはデフォルトでどのコンテンツエンコーディングを使用しますか?
-
05-07-2019 - |
質問
Perlで書かれた成熟したCGIアプリケーションを修正しているのですが、コンテンツエンコーディングの問題が浮上しています。ブラウザは、コンテンツがiso-8859-1でエンコードされ、アプリケーションがHTTPヘッダーの文字セットとしてiso-8859-1を宣言していることを報告しますが、エンコードを実際に実行するようには見えません。 perldocチュートリアル(エンコード、エンコード、 Open )がコードで使用されているため、ドキュメントが実際にどのようにエンコードされているかについて少し混乱しています。
前述のように、アプリケーションは非常に成熟しており、現在のエンコード方式の多くよりも前のものです。誰もが私が探しているレガシーまたは非推奨のテクニックを知っていますか?開発者によって方向が提供されていない場合、Perlはどのエンコーディングに対して/デフォルトと見なしますか?
ありがとう
解決
デフォルトでは、Perlは文字列をバイトシーケンスとして処理するため、ファイルから読み取り、それをSTDOUTに出力すると、同じバイトシーケンスが生成されます。テンプレートがLatin-1の場合、出力もLatin-1になります。
テキスト文字列コンテキストで文字列を使用する場合( uc
、 lc
など)、perlは前に文字列がデコードされていない限り、Latin-1セマンティクスを想定しています。
他のヒント
Perlは何も想定していませんが、ブラウザは通常、推測に基づいたエンコーディングを想定しています。エンコード手法が使用されていない場合、ドキュメントは作成されたとおりに直接出力されます。
HTTP Content-Typeヘッダーで文字セットを指定できます。
最初に確認するのは、サーバーの構成です。プログラムでcontent-encodingヘッダーを設定していない場合は、サーバーの推測を使用している可能性があります。
サーバーとは別にスクリプトを実行して、実際の出力を確認します。サーバーがCGIプログラム(nphではない)から出力を取得すると、サーバーはクライアントに送信する前に欠落していると思われるもののヘッダーを修正します。
ブラウザがコンテンツをiso-8859-1として報告する場合、perlスクリプトが文字セットを指定するための正しいヘッダーを出力しなかった可能性がありますか?