11

私はすでに次まで読んでいます:

しかし、おそらくいくつかのBASICポイントを見逃していました。

を使用して

use open(:utf8);

cpan モジュールにも影響しますか? たとえば、CPAN モジュールが任意のファイルを開くとき、それは:utf8?で開かれます。このステートメントは TRUE ですか? (または open プラグマはレキシカルスコープのみですか?) AFAIK - モジュールにも影響しますが、「一貫性のない」方法で.. (おそらくモジュールの問題です)。

open pragma効果がありopendirますか?-私がすでに試したこと-いいえ- (NFCに加えて)decodeから来るすべてのファイル名にまだ追加が必要です。readdirIO::Dir は別のものです - どの open プラグマがカバーしていないのでしょうか?

open プラグマsockets、パイプにも影響しますか? (例えば、 IO::Handle のようなものは何か?)

すべての (またはほとんどの) CPAN モジュールは、i/o を実行するときに必要な方法 (utf8 または lattin1 または raw?) を認識しています (単純なプラグマautodieでは機能しないため、おそらくそうではありませんopen... :()

多くの場所で、同様の規則を読むことができます: Unicode の標準的な規則を思い出してください: 常にアプリケーションの端でエンコード/デコードします。これは良いルールですが、アプリケーション エッジとは、自分のソース コードを意味します。CPAN モジュールは (通常)エッジの背後にもあります - システムやネットワークのような「外の世界」だけではありません...

私の経験から、短いスクリプト (CPAN を多用するもの) に含まれるコンテンツの 3/4 には、トップ宣言と、ほとんどすべてのエンコード/デコード/NFC が含まれています...

例: ロギング ユーティリティでさえ、明示的なエンコードが必要です。

use Log::Any qw($log);
use Log::Any::Adapter ('File', 'file.log');
$log->error( encode('utf-8', "tökös"));

コードに追加したい場合でも、すべてをエンコードされたバージョンtieに置き換える必要があります。$key $value

これは本当ですか、それとも上記のすべてのドキュメントで本当に基本的なポイントを見逃していましたか?

JSON::XS、YAML::XS、File::Slurp などの utf8 (内部) を処理する一部の CPAN モジュール (ただし、YAML::XS、純粋な YAML および JSON::XS から正しい「もの」を取得することに成功したことはありません)何か問題...

一部のモジュールには「ハック」が存在します - DBIx::Class::ForceUTF8Template::Stash::ForceUTF8HTML::FillInForm::ForceUTF8- など - utf と非 utf の世界の「両方」に対して正しいアプリケーションを書くことを許可しないもの... ;(

多くの CPAN モジュールは、上記の「ハッキングされたバリアント」を内部的に呼び出しません - (例HTML::FillInForm::ForceUTF8) 単純なもののみを呼び出すため、utf8 でそれらを正しく使用することは不可能です... 他のものは、黙って失敗します.. ;(

Plack アプリケーションは、迷惑な "Wide character...." なしではutf8ロギング メッセージを処理しません;( /modern perl :(/ そして続行できます ;(

上記から、(おそらく間違って) 「推定」しました -すべての CPAN モジュールが utf8 でエンコードされた文字列をどのように処理しているかを知り、覚えておく必要があります

したがって、主な質問は次のとおりです。

私が覚えている間:ここには魔法の弾丸はありませんが、 「 utf8 Ready CPANモジュール」を使用する前に特別なエンコード/デコードを必要としないものを検出して知る良い方法はありますか?

誰かが知る必要がある場合、私はすべてのスクリプトで次のものを使用しています:

use 5.014;
use warnings;
use utf8;
use feature qw(unicode_strings);
use charnames qw(:full);
use open(:utf8); #this sometimes is bad, so using only open qw(:std :utf8);
use Encode qw(encode decode);
use Unicode::Normalize qw(NFD NFC);

うーん.. perlモジュールを「発見」したところ、デコードを行うバージョンutf8:allに置き換えられました。readdir

4

1 に答える 1

5

鉱山の強調:

openプラグマは、すべての I/O のデフォルトの「レイヤー」(「規律」とも呼ばれる) を宣言するインターフェイスの 1 つとして機能します。このプラグマのレキシカル スコープ内にある2 つの引数openreadpipe(別名qx//) および同様の演算子は、宣言されたデフォルトを使用します。でIO レイヤーを指定していない場合、引数が 3 つの s でも、このプラグマの影響を受ける可能性があります。openMODE

いいえ、プラグマが存在しないコードには影響しません。ただし、このようなプラグマのスコープ内で開かれたハンドルは、プラグマのスコープ外のコードに渡された場合、そのレイヤーを失いません。


モジュールが何を期待しているかを確認するためのテスト:

入力

  • テスト 1
    • 入力ソースが 80..FF のコード ポイントを含み、FF より上のコード ポイントを含まない文字列を返すようにします。
  • テスト 2
    • 入力ソースが FF より上のコード ポイントを含む文字列を返すようにします。

出力

  • テスト 1
    • 80..FF のコード ポイントを含み、FF より上のコード ポイントを含まない文字列を出力します。最初に紐を通しutf8::downgrade($_);ます。
  • テスト 2
    • テスト 1 と同じですが、utf8::uprade($_);最初に文字列を渡します。
  • テスト 3
    • FF より上のコード ポイントを含む文字列を出力する
于 2013-07-01T15:49:40.537 に答える