私はすでに次まで読んでいます:
- Perl Unicode クックブック
- open プラグマは異なる utf8 でどのように異なりますか?
- open プラグマで utf8 エンコードを使用する方法
- autodie-pragma はエンコーディングに影響を与えますか?
- 他の多くの... (例: perlunicode perluniintro、perlunifaq、perlunitut)... ;(
- そしてもちろん tchrist の天才的な答えなぜ最近の Perl はデフォルトで UTF-8 を避けるのですか?
しかし、おそらくいくつかのBASICポイントを見逃していました。
を使用して
use open(:utf8);
cpan モジュールにも影響しますか? たとえば、CPAN モジュールが任意のファイルを開くとき、それは:utf8
?で開かれます。このステートメントは TRUE ですか? (または open プラグマはレキシカルスコープのみですか?) AFAIK - モジュールにも影響しますが、「一貫性のない」方法で.. (おそらくモジュールの問題です)。
にopen pragma
効果がありopendir
ますか?-私がすでに試したこと-いいえ- (NFCに加えて)decode
から来るすべてのファイル名にまだ追加が必要です。readdir
IO::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::ForceUTF8
、Template::Stash::ForceUTF8
、HTML::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