6

2 つの出発点:

  • Why does modern Perl avoid UTF-8 by default?への彼の回答では、tchrist は、Perl で正しい Unicode 処理を保証するために必要な 52 のことを指摘しました。答えは、定型コードといくつかのuseステートメントを示しています。Unicode の使用に関する同様の質問は、How to make "use My::defaults" with modern perl & utf8 defaults? です。
  • PSGI 仕様は、設計上バイト指向です。すべてをエンコード/デコードするのは私の責任なので、Plack アプリの正しい方法は、出力をエンコードして入力をデコードすることです。

    use Encode;
    my $app = sub {
        my $output = encode_utf8( myapp() );
        return [ 200, [ 'Content-Type' =>'text/plain' ], [ $str ] ];
    };
    

使い方は正しいですか

use uni::perl; # or any similar

PSGI アプリケーションおよび/またはモジュールで?

uni::perlPerl のデフォルト IO を UTF-8 に変更します。

use open qw(:std :utf8);
binmode(STDIN,   ":utf8");
binmode(STDOUT,  ":utf8");
binmode(STDERR,  ":utf8");

そうすることで、Plack やそのミドルウェアの何かが壊れますか? openまたは、プラグマなしで、オープン時に明示的にエンコード/デコードするPlack用のアプリを作成する唯一の正しい方法ですか?

4

2 に答える 2

2

STDIN/STDOUTをデフォルトで UTF-8 モードに設定したくはないでしょう。たとえば、それらがバイナリ データ トランスポートになるかどうかわからないからです。たとえば、これらのファイルハンドルが FastCGI プロトコル コネクタである場合、UTF-8 テキストではなく、エンコードされたバイナリ構造が含まれます。したがって、エンコーディング層を定義してはなりません。そうしないと、これらのバイナリ構造が破損するか、無効として拒否されます。

于 2012-06-13T17:41:21.757 に答える
-2

最新の GNU/Linux システムでは、グローバルに UTF-8 に完全に切り替える必要があります。設定という意味です

LANG="xx_YY.UTF-8"
PERL_UNICODE=SDAL
PERL5OPT=-Mutf8

/etc/environmentまたは/etc/sysconfig/i18nまたは/etc/default/localeシステム構成ファイルが何であれ。RHEL/ Centosのバグのため、シンボリック リンクを作成/etc/environmentしましたsysconfig/i18n

バイナリ入力に依存するスクリプトはbinmode、STDIN/OUT/ERR(?) またはuse openプラグマで設定するか、-C0オプションで呼び出す必要があります。

問題は、DBD::JDBCDBDなどの一部のドライバーにバグがあり、手動で utf8 フラグを設定する必要があることです。

use Encode qw/_utf8_on/;
map { _utf8_on $_; } @strings;
于 2014-08-13T09:10:56.090 に答える