最新のPerlがデフォルトでUTF-8を回避するのはなぜですか?


557

Perlを使用して構築された最新のソリューションのほとんどがデフォルトでUTF-8を有効にしないのはなぜでしょうか。

コアPerlスクリプトには多くのレガシー問題があり、問題が発生する可能性があることを理解しています。しかし、私の視点から、21で番目の世紀、大きな新しいプロジェクト(または大きな視点でのプロジェクトは)最初からそのソフトウェアUTF-8証明を行う必要があります。それでも私はそれが起こっているのを見ません。たとえば、Mooseは厳格な警告を有効にしますが、Unicodeは無効にしますModern :: Perlはボイラープレートも削減しますが、UTF-8処理は行いません。

どうして?2011年に最新のPerlプロジェクトでUTF-8を回避する理由はありますか?


@tchristへのコメントが長すぎたので、ここに追加します。

はっきりしないようです。いくつか追加してみましょう。

tchristと私は状況をかなり似ていますが、私たちの結論は完全に反対です。同意しますが、Unicodeの状況は複雑ですが、これが私たち(Perlユーザーおよびコーダー)が、UTF-8の処理を現在のように簡単にするいくつかのレイヤー(またはプラグマ)が必要な理由です。

tchristはカバーする多くの側面を指摘しました、私はそれらを数日あるいは数週間読んで考えます。それでも、これは私の趣旨ではありません。tchristは、「UTF-8を有効にする」単一の方法がないことを証明しようとします。私はそれについて議論する知識があまりありません。それで、私は生きている例に固執します。

楽堂いじってみたところ、UTF-8は必要なだけそこにありました。私は何の問題もなく、それはうまくいった。おそらく、どこかもっと深いところにいくつかの制限があるかもしれませんが、最初は、テストしたすべてが期待どおりに機能しました。

最新のPerl 5でもそれは目標ではないでしょうか?私はもっ​​と強調します:コアPerlのデフォルトの文字セットとしてUTF-8を提案しているのではなく、新しいプロジェクトを開発している人のためにスナップでトリガーする可能性を提案しています。

別の例ですが、よりネガティブなトーンです。フレームワークは開発を容易にするはずです。数年前、私はWebフレームワークを試しましたが、「UTF-8の有効化」があまりに曖昧だったので、それらを捨てました。Unicodeサポートをフックする方法と場所が見つかりませんでした。時間のかかる作業だったので、古い方法を使う方が簡単だと思いました。今、私はここでMason 2 と同じ問題に対処するための恵みがあったことを見ました:Mason2 UTF-8をきれいにする方法は?。したがって、これはかなり新しいフレームワークですが、UTF-8で使用するには、その内部について深い知識が必要です。それは大きな赤い看板のようなものです:やめて、私を使わないで!

私は本当にPerlが好きです。しかし、Unicodeの扱いは面倒です。私はまだ壁に向かって走っています。何らかの方法でtchristが正しく、私の質問に答えます。Perl5では複雑すぎるため、新しいプロジェクトはUTF-8を引き付けません。


15
申し訳ありませんが、@ tchristに同意します-UTF-8は非常に難しいです。「スイッチを切り替える」だけで、それを正しく処理するフレームワークやツールはありません。これは、アプリケーションを設計するときに直接考える必要があるものであり、あらゆる種類のフレームワークや言語で処理できるものではありません。楽堂がたまたまあなたのために働いたなら、あなたはあなたのテストケースに十分冒険していませんでした-それは@tchristの答えのいくつかの例を取り、それから肉屋になるでしょう。
Billy ONeal、2011年

12
MooseまたはModern :: Perlが正確に何をすることを期待していますか?ファイルやデータベース内のランダムにエンコードされた文字データを魔法のように有効なデータに再作成しますか?
jrockway、2011年

13
どういう意味ですか?ムースはテキスト操作とは何の関係もありません。なぜそれが文字エンコーディングについて知っているべきなのか、あなたのためにデフォルトのものを選ぶのではないのですか?(とにかく、リストするプラグマがエンコードに触れない理由は、Perlプラグマが字句動作に影響を与えるための規則であるためです。含まれる他のモジュールであるEntire Worldが単にUTF-8であると仮定すると、 。これはPHPでもRubyでもありません。)
jrockway

8
(また、「ほとんどの最新のPerlアプリケーション」はUTF-8で壊れますか?アプリケーションやPerlなどを記述したことがないので、Unicodeクリーンではありません。)
jrockway

11
Nb。tchrist(Tom Christiansen)が、Unicodeについての[ training.perl.com/OSCON2011/index.html Tom Christiansen's Materials for OSCON 2011]を投稿しました。「Unicode Support Shootout:The Good、The Bad、&the(mostly)Ugly」というタイトルの記事では、さまざまなプログラミング言語でのUnicodeサポートについて説明しています。Google GoとPerl5のみが完全なUnicodeをサポートし、組み込みのGoogle Goのみをサポートします(Perl6については言及していません)。
JakubNarębski11年

回答:


1146

𝙎𝙞𝙢𝙥𝙡𝙚𝙨𝙩 :𝟕𝘿𝙞𝙨𝙘𝙧𝙚𝙩𝙚𝙍𝙚𝙘𝙤𝙢𝙢𝙚𝙣𝙙𝙖𝙩𝙞𝙤𝙣𝙨

  1. PERL_UNICODE変数をに設定しますAS。これにより、すべてのPerlスクリプト@ARGVがUTF-8文字列としてデコードされ、stdin、stdout、およびstderrの3つすべてのエンコーディングがUTF-8に設定されます。これらは両方ともグローバルな効果であり、字句的な効果ではありません。

  2. ソースファイル(プログラム、モジュール、ライブラリ、dohickey)の上部で、次のようにして、perlバージョン5.12以降を実行していることを目立つようにアサートします。

    use v5.12;  # minimal for unicode string feature
    use v5.14;  # optimal for unicode string feature
  3. 以前の宣言では、警告ではなく、制限と機能のみが有効になるため、警告を有効にします。また、Unicode警告を例外に昇格させることをお勧めします。そのため、これらの行の1つだけではなく、両方を使用してください。ただし、v5.14では、utf8警告クラスは3つのサブ警告で構成されており、すべて個別に有効にできます。noncharsurrogate、とnon_unicode。これらは、より強力な制御を実行したい場合があります。

    use warnings;
    use warnings qw( FATAL utf8 );
  4. このソースユニットがUTF‑8としてエンコードされていることを宣言します。かつてこのプラグマは他のことをしていましたが、今ではこの唯一の目的だけを果たし、他にはありません:

    use utf8;
  5. このレキシカルスコープ内でファイルハンドルを開くが、他では開かないものを宣言するはないものは、特に指示がない限り、そのストリームがUTF-8でエンコードされていると想定することをます。そうすれば、他のモジュールや他のプログラムのコードに影響を与えることはありません。

    use open qw( :encoding(UTF-8) :std );
  6. を介して名前付き文字を有効にし\N{CHARNAME}ます。

    use charnames qw( :full :short );
  7. DATAハンドルがある場合は、エンコードを明示的に設定する必要があります。これをUTF‑8にしたい場合は、次のように言います。

    binmode(DATA, ":encoding(UTF-8)");

もちろん、最終的に気になる他の問題の終わりはありませんが、これらの用語の意味はやや弱いものの、「すべてをUTF-8で正しく機能させる」という州の目標に近づけるには十分です。

その他のプラグマは、Unicode関連ではありませんが、次のとおりです。

      use autodie;

強くお勧めします。

🐪🐫🐪🌞🌴 𝕲𝖔𝕿𝖍𝖔𝖚𝖆𝖓𝖉𝕯𝖔𝕷𝖎𝖐𝖊𝖜𝖎𝖘𝖊 🌞🐪🐫🐪🐁


🎁🐪𝕭𝖔𝖎𝖑𝖊𝖗⸗𝖕𝖑𝖆𝖙𝖊𝖋𝖔𝖗𝖀𝖓𝖎𝖈𝖔𝖉𝖊⸗𝕬𝖜𝖆𝖗𝖊𝕮𝖔𝖉𝖊🐪🎁


最近の自分の定型文は次のようになります。

use 5.014;

use utf8;
use strict;
use autodie;
use warnings; 
use warnings    qw< FATAL  utf8     >;
use open        qw< :std  :utf8     >;
use charnames   qw< :full >;
use feature     qw< unicode_strings >;

use File::Basename      qw< basename >;
use Carp                qw< carp croak confess cluck >;
use Encode              qw< encode decode >;
use Unicode::Normalize  qw< NFD NFC >;

END { close STDOUT }

if (grep /\P{ASCII}/ => @ARGV) { 
   @ARGV = map { decode("UTF-8", $_) } @ARGV;
}

$0 = basename($0);  # shorter messages
$| = 1;

binmode(DATA, ":utf8");

# give a full stack dump on any untrapped exceptions
local $SIG{__DIE__} = sub {
    confess "Uncaught exception: @_" unless $^S;
};

# now promote run-time warnings into stack-dumped
#   exceptions *unless* we're in an try block, in
#   which case just cluck the stack dump instead
local $SIG{__WARN__} = sub {
    if ($^S) { cluck   "Trapped warning: @_" } 
    else     { confess "Deadly warning: @_"  }
};

while (<>)  {
    chomp;
    $_ = NFD($_);
    ...
} continue {
    say NFC($_);
}

__END__

🎅𝕹𝖔𝕸𝖆𝖌𝖎𝖈𝕭𝖚𝖑𝖑𝖊𝖙🎅


「Perlは[ どういうわけか!]デフォルトでUnicodeを有効にする」というのは、ある種のまれで孤立したケースでは、ほんのわずかに役立つほどのことを言うことについて考え始めることすらありません。Unicodeは、単なる大きな文字のレパートリーではありません。また、これらのキャラクターがすべて、さまざまな方法で相互作用する方法でもあります。

(一部の)人々は、彼らがしたいと考えているようだが無残数百万行のコードを壊すことが保証されていることであっても、単純な志向の最小限の措置、あなたの気の利いた新に「アップグレード」する機会がありませんコードすばらしい新世界を現代性を。

それは、人々が偽るよりもはるかに複雑です。私はこれを過去数年間にわたって非常に大きなものと考えてきました。私が間違っていることを示されたいです。しかし、私はそうではないと思います。Unicodeは、基本的に、適用したいモデルよりも複雑であり、カーペットの下を一掃できないほど複雑です。試してみると、自分のコードまたは他の誰かのコードを壊すことになります。ある時点で、Unicodeが何であるかを分解して学ぶ必要があるだけです。あなたはそれがそうでないものであるふりをすることはできません。

Unicodeは、Unicodeを簡単にするために、私がこれまで使用した他の何よりもはるかに優れています。これが悪いと思うなら、しばらく他のことを試してください。次に🐪に戻ってください。あなたはより良い世界に戻ったか、または同じ知識を持ってくるので、私たちはあなたの新しい知識を利用してtheseをより良いものにすることができます。


💡𝕴𝖉𝖊𝖆𝖘𝖋𝖔𝖗𝖆𝖀𝖓𝖎𝖈𝖔𝖉𝖊⸗𝕬𝖜𝖆𝖗𝖊🐪𝕷𝖆𝖚𝖓𝖉𝖗𝖞𝕷𝖎𝖘𝖙💡


少なくとも、ここで、🐪を「デフォルトでUnicodeを有効にする」ために必要と思われるいくつかの事項を説明します。

  1. すべての🐪ソースコードは、デフォルトでUTF-8である必要があります。use utf8またはで取得できますexport PERL5OPTS=-Mutf8

  2. 🐪 DATAハンドルはUTF-8である必要があります。のように、パッケージごとにこれを行う必要がありbinmode(DATA, ":encoding(UTF-8)")ます。

  3. 🐪スクリプトへのプログラム引数は、デフォルトではUTF-8であると理解する必要があります。 export PERL_UNICODE=A、またはperl -CA、またはexport PERL5OPTS=-CA

  4. 標準入力、出力、およびエラーストリームのデフォルトはUTF-8です。export PERL_UNICODE=Sそれらのすべてのために、またはIOおよび/またはEそれらのほんの一部のため。これはみたいperl -CSです。

  5. 🐪によって開かれたその他のハンドルは、特に宣言されていない限り、UTF-8と見なされます。export PERL_UNICODE=Dまたはとiし、oこれらの特定のもののために。export PERL5OPTS=-CDうまくいくでしょう。それは-CSADそれらすべてに役立ちます。

  6. 両方のベースに加えて、開いたすべてのストリームをカバーしexport PERL5OPTS=-Mopen=:utf8,:stdます。uniquoteを参照してください。

  7. UTF-8エンコーディングエラーを見逃したくありません。お試しくださいexport PERL5OPTS=-Mwarnings=FATAL,utf8。そして、必ずご入力ストリームは、常にされていることを確認binmodeし日間:encoding(UTF-8)だけではなく、へ:utf8

  8. –は、128〜255のコードポイントを、プロパティ化されていないバイナリ値だけでなく、対応するUnicodeコードポイントであると理解する必要があります。 use feature "unicode_strings"またはexport PERL5OPTS=-Mfeature=unicode_strings。それはとにuc("\xDF") eq "SS"なり"\xE9" =~ /\w/ます。シンプルなexport PERL5OPTS=-Mv5.12またはより良いもそれを得ます。

  9. 名前付きUnicode文字はデフォルトでは有効になっていないため、追加export PERL5OPTS=-Mcharnames=:full,:short,latin,greekするなどしてください。uninamestcgrepを参照してください。

  10. ほとんどの場合、標準Unicode::Normalizeモジュールのさまざまなタイプの分解から関数にアクセスする必要があります。 export PERL5OPTS=-MUnicode::Normalize=NFD,NFKD,NFC,NFKD、そして常にNFDを介して着信するものとNFCからの発信するものを実行します。私が認識しているこれらのI / O層はまだありませんが、nfcnfdnfkd、およびnfkcを参照してください。

  11. 使用🐪での文字列比較eqnelccmpsort、&​​C&CCは常に間違っています。の代わりに@a = sort @b、あなたは必要@a = Unicode::Collate->new->sort(@b)です。それをに追加することもできますexport PERL5OPTS=-MUnicode::Collate。バイナリ比較のキーをキャッシュできます。

  12. 🐪組み込み関数は、Unicodeデータを好きprintfwrite間違っています。あなたは使用する必要があるモジュールを元のために、そしてことも、両方のモジュールとしても、後者のために。uwcおよびunifmtを参照してください。Unicode::GCStringUnicode::LineBreak

  13. それらを整数としてカウントする場合は、🐪の組み込みatoi(3)が現在十分に機能していないため関数\d+を介してキャプチャを実行する必要があります。Unicode::UCD::num

  14. 👽ファイルシステムでファイルシステムの問題が発生します。一部のファイルシステムは、NFCへの変換を暗黙的に強制します。他のユーザーは、サイレントにNFDへの変換を強制します。そして、他の人はまだ何か他のことをします。問題を完全に無視する人さえいるため、さらに大きな問題が発生します。したがって、正気を保つために独自のNFC / NFD処理を行う必要があります。

  15. あなたの🐪コード関わる全てのa-zA-Zと、そのようなは変更しなければならないなど、m//s///、とtr///。コードが壊れているということは、悲鳴を上げる赤い旗として目立つはずです。しかし、それがどのように変化しなければならないかは明らかではありません。適切なプロパティを取得し、それらのケースフォールドを理解することは、あなたが考えるよりも難しいです。私は毎日ユニチャールユニプロップを使用しています。

  16. を使用するコードは、を使用するコード\p{Lu}とほぼ同じくらい間違っています[A-Za-z]\p{Upper}代わりに使用する必要があり、その理由を知っている必要があります。はい、\p{Lowercase}\p{Lower}は異なっている\p{Ll}\p{Lowercase_Letter}

  17. を使用するコード[a-zA-Z]はさらに悪いです。そして、それは使用することはできません\pL\p{Letter}。それを使用する必要があります\p{Alphabetic}。すべてのアルファベットが文字であるとは限りません。

  18. で🐪変数を探し/[\$\@\%]\w+/ている場合は、問題があります。を探す必要がありますが/[\$\@\%]\p{IDS}\p{IDC}*/、それでも句読点変数やパッケージ変数については考えていません。

  19. あなたは空白をチェックしている場合は、間を選択する必要があります\h\v、依存します。また、一般的な考えに反して、\s意味を持た ないため、を使用しないでください[\h\v]

  20. あなたが\nライン境界のために、あるいはさえ使用しているなら\r\n、あなたはそれを間違っています。\R同じではないを使用する必要があります!

  21. Unicode :: Stringprepをいつ呼び出すか、また呼び出すかどうかがわからない場合は、学習することをお勧めします。

  22. 大文字と小文字を区別しない比較では、区別記号​​などに関係なく、2つのものが同じ文字であるかどうかを確認する必要があります。これを行う最も簡単な方法は、標準のUnicode :: Collat​​eモジュールを使用することです。Unicode::Collate->new(level => 1)->cmp($a, $b)。そこでもあるeq方法と、このような、あなたはおそらくについて学ぶ必要があるmatchsubstrも、方法。これらには、🐪ビルトインに比べて明確な利点があります。

  23. 時にはそれでも十分ではなく、代わりに、Unicode :: Collat​​e :: Localeモジュール が必要になりますUnicode::Collate::Locale->new(locale => "de__phonebook", level => 1)->cmp($a, $b)。それUnicode::Collate::->new(level => 1)->eq("d", "ð")が本当であるがUnicode::Collate::Locale->new(locale=>"is",level => 1)->eq("d", " ð")、偽であると考えてください。同様に、「ae」と「æ」はeq、ロケールを使用しない場合、または英語のロケールを使用する場合ですが、アイスランドのロケールでは異なります。それで?大変だとお伝えします。ucsortを使用して、これらのいくつかをテストでき ます。

  24. 文字列「niño」でパターンCVCV(子音、母音、子音、母音)を照合する方法を検討してください。そのNFDの形式—よく覚えておいた方がいいので、「nin \ x {303} o」になります。今、あなたは何をするつもりですか?NFDでも 'ø'のようなコードポイントは分解されないため、母音が[aeiou](誤って)ふりをしていて(?=[aeiou])\X)も、このようなことはできません。ただし、先ほど示したUCA比較を使用すると、「o」と同等にテストされます。NFDに依存することはできません。UCAに依存する必要があります。


💩𝔸𝕤𝕤𝕦𝕞𝕖𝔹𝕣𝕠𝕜𝕖𝕟𝕟𝕖𝕤𝕤💩


そして、それだけではありません。人々がユニコードについて行う100万の壊れた仮定があります。彼らがこれらのことを理解するまで、彼らの🐪コードは壊れるでしょう。

  1. エンコードを指定せずにテキストファイルを開くことができると想定しているコードは壊れています。

  2. デフォルトのエンコーディングが何らかのネイティブプラットフォームのエンコーディングであると想定しているコードは壊れています。

  3. 日本語または中国語のWebページが、UTF‑8よりもUTF in16で占めるスペースが少ないと想定するコードは誤りです。

  4. Perlが内部でUTF-8を使用することを前提とするコードは間違っています。

  5. エンコーディングエラーが常に例外を発生させると想定するコードは間違っています。

  6. Perlコードポイントが0x10_FFFFに制限されていることを前提とするコードは間違っています。

  7. $/有効な行区切り記号で機能するものに設定できると想定するコードは間違っています。

  8. lc(uc($s)) eq $sorのように、ケースフォールディングでの往復の等価性を前提とするコードuc(lc($s)) eq $sは完全に壊れており、間違っています。uc("σ")およびuc("ς") が両方であると考えてください"Σ"。ただし、lc("Σ")両方を返すことはできません。

  9. すべての小文字のコードポイントに明確な大文字のコードポイントがある、またはその逆であると想定しているコードは壊れています。たとえば、"ª"は大文字を含まない小文字です。"ᵃ""ᴬ"はどちらも文字ですが、小文字ではありません。ただし、どちらも小文字のコードポイントであり、対応する大文字のバージョンはありません。わかった?との両方であるにもかかわらず、そう \p{Lowercase_Letter}ではありません\p{Letter}\p{Lowercase}

  10. 大文字と小文字を変更しても文字列の長さが変更されないと想定するコードは壊れています。

  11. 2つのケースしかないことを前提とするコードは壊れています。タイトルケースもあります。

  12. 文字だけが大文字であると仮定するコードは壊れています。文字だけでなく、数字、記号、マークにも大文字と小文字の区別があることがわかります。実際、ケースを変更すると、何かがメインの一般カテゴリを変更することさえ\p{Mark}あり\p{Letter}ます。また、あるスクリプトから別のスクリプトに切り替えることもできます。

  13. 大文字と小文字がロケールに依存しないことを前提とするコードは壊れています。

  14. UnicodeがPOSIXロケールに関する図を提供することを前提とするコードは壊れています。

  15. 基本的なASCII文字を取得するために発音区別符号を削除できると想定しているコードは、邪悪で、まだ壊れており、脳に損傷を与え、間違っており、死刑を正当化します。

  16. 分音記号\p{Diacritic}とマーク\p{Mark}が同じものであることを前提とするコードは壊れています。

  17. 壊れている分だけ\p{GC=Dash_Punctuation}カバーすることを前提とするコード\p{Dash}

  18. ダッシュ、ハイフン、マイナスが同じであると想定するコード、またはハイフンとマイナスがそれぞれ1つだけであると想定するコードは、壊れていて間違っています。

  19. すべてのコードポイントが1つの印刷列しか占めないことを前提とするコードは壊れています。

  20. すべての\p{Mark}文字がゼロの印刷列を占めると想定するコードは壊れています。

  21. いる文字が似いると想定するコードは壊れています。

  22. 似ていない文字が似ていないことを前提とするコードは壊れてます。

  23. 行のコードポイントの数に制限があり、1つだけ\Xが一致することを想定しているコードは間違っています。

  24. 文字で\X開始できないと想定するコード\p{Mark}は間違っています。

  25. \X2つの非\p{Mark}文字を保持できないと想定するコードは誤りです。

  26. 使用できないことを想定したコード"\x{FFFF}"が間違っています。

  27. 2つのUTF-16(サロゲート)コード単位を必要とする非BMPコードポイントを想定するコードは、コード単位ごとに1つずつ、2つの別々のUTF-8文字にエンコードされますが、これは誤りです。ありません。単一のコードポイントにエンコードします。

  28. 結果のUTF-8の先頭にBOMを配置すると、BOMがUTF-8に先行するUTF-16またはUTF-32からトランスコードするコードが壊れます。これは技術者がまぶたを取り除く必要があるのでとても愚かです。

  29. CESU-8が有効なUTFエンコーディングであると想定するコードは間違っています。同様に、"\xC0\x80"UTF-8のようにU + 0000をエンコードすると考えるコードは壊れており、間違っています。これらの人もまぶたの治療に値する。

  30. >常に右を<指し、常に左を指すような文字を想定するコードは、実際にはそうではないため、誤りです。

  31. 最初にcharacter Xを出力し、次にcharacterを出力した場合Yに、それらXYが誤って表示されると想定するコード。時々彼らはしません。

  32. ASCIIが英語を適切に書くのに十分であると想定するコードは、愚かで近視眼的で、文盲で、壊れていて、邪悪で、間違っています。 彼らの頭でオフ!それが極端すぎると思われる場合は、妥協することができます。これ以降、彼らは片足からつま先だけでタイプする可能性があります。(残りはダクトテープで固定されます。)

  33. すべての\p{Math}コードポイントが可視文字であると想定するコードは間違っています。

  34. \w文字、数字、アンダースコアのみが含まれていると想定するコードは間違っています。

  35. ことを前提としていたコード^~句読点ですが間違っています。

  36. üウムラウトがあると想定するコードは間違っています。

  37. などに文字が含まれていると考えるコードは間違っています。

  38. 信じているコードはひどく壊れて\p{InLatin}いるのと同じ\p{Latin}です。

  39. それ\p{InLatin}がほとんど常に有用であると信じているコードは、ほぼ間違いなく間違っています。

  40. $FIRST_LETTERあるアルファベットの最初の文字$LAST_LETTERと同じアルファベットの最後の文字として与えられていると信じているコード[${FIRST_LETTER}-${LAST_LETTER}]は、ほとんど常に完全に壊れていて間違っていて無意味です。

  41. 誰かの名前に特定の文字のみを含めることができると信じているコードは、愚かで、攻撃的で、間違っています。

  42. UnicodeをASCIIに変換しようとするコードは単に間違っているのではなく、その実行者が再びプログラミングで動作することを許可されるべきではありません。限目。私は彼らが再び見ることを許されるべきであるとさえ確信していません。

  43. テキストファイルのエンコーディングが存在しないふりをする方法があると信じているコードは壊れており危険です。もう一方の目も突き出すかもしれません。

  44. 不明な文字をに変換するコード?は、壊れていて、愚かで、頭がおかしく、標準の推奨事項に違反していますRTFMの理由。

  45. マークされていないテキストファイルのエンコーディングを確実に推測できると信じているコードは、ゼウスの稲妻だけが修正するハブリスとナイベテの致命的なメランジュを犯している。

  46. 🐪 printf幅を使用してUnicodeデータを埋め込んで正当化できると信じているコードは壊れており、間違っています。

  47. 特定の名前でファイルを正常に作成すると、実行時lsまたはreaddirそのファイルを含むディレクトリで、作成した名前のファイルが実際にバグがあり、壊れており、間違っていることがわかるコード。これに驚かないでください!

  48. UTF-16が固定幅エンコーディングであると信じるコードは、愚かで、壊れており、間違っています。プログラミングライセンスを取り消します。

  49. 1つのプレーンのコードポイントを他のプレーンのコードポイントとは異なる方法で処理するコードは、事実上壊れていて間違っています。学校へ戻る。

  50. のようなもの/s/iだけが一致する"S""s"、壊れていて間違っていると信じているコード。あなたは驚かれることでしょう。

  51. を使用\PM\pM*する代わりに書記素クラスタを見つけるためにを使用するコード\Xは壊れており、間違っています。

  52. ASCIIの世界に戻りたいと思う人は心からそうするように励まされるべきです、そして彼らの輝かしいアップグレードを称えて、彼らはすべてのデータ入力の必要性のために事前に電気の手動タイプライターを無料で提供されるべきです。それらに送信されるメッセージは、1行あたり40文字でᴀʟʟᴄᴀᴘの電信を介して送信され、宅配業者によって手渡しされる必要があります。やめる。


😱𝕾𝖀𝕸𝕸𝕬𝕽𝖄😱


私が書いたものより、どれだけ多くの「デフォルトのUnicode in🐪」を入手できるかわかりません。ええ、そうです。使用する必要がUnicode::Collateあります。Unicode::LineBreakもです。そしておそらくもっと。

ご覧のとおり、あまりにも多くのUnicodeの事はあなたが本当にいることがあるにそこについて心配する必要はこれまで、「Unicodeへのデフォルト」などの任意のようなものが存在するが。

discover 5.8で行ったのと同じように、最初から設計されていないコードにこれらすべてを課すことは不可能であることに気づくでしょう。あなたの善意の利己主義は世界全体を壊しました。

また、一度実行しても、適切に機能するためには十分な検討が必要な重大な問題がまだあります。フリップできるスイッチはありません。脳に他ならない、そして本当の脳を意味する、ここでは十分でなくなります。学ばなければならないことがたくさんあります。手動タイプライターへの撤退をモジュロ、無知で潜入することは望めません。これは21世紀であり、故意の無知によってUnicodeを奪うことはできません。

あなたはそれを学ぶ必要があります。限目。「すべてがうまくいく」ほど簡単ではありません。多くのことがうまくいかないことが保証されるからです。ます。これにより、「すべてを機能させる」方法があるという仮定が無効になります。

非常に限られた非常に限られた操作で、いくつかの妥当なデフォルトを取得できる可能性がありますが、私が思っているよりもずっと物事について考えることなくしては。

ほんの一例として、正規の順序付けはいくつかの本当の頭痛の種を引き起こすでしょう。😭 "\x{F5}" 'õ'"o\x{303}" 'õ'"o\x{303}\x{304}" 'ȭ'、および"o\x{304}\x{303}" 'ō̃'はすべて'õ'と一致する必要がありますが、これをどのように実行しますか?これは見た目より難しいですが、それはあなたが説明する必要があるものです。💣

私はPerlの知っている一つのことがあれば、それはそのUnicodeのビットを行うと行わないものであり、このことは、私はあなたを約束する : 「ᴛʜᴇʀᴇɪsɴᴏUɴɪᴄᴏᴅᴇᴍᴀɢɪᴄʙᴜʟʟᴇᴛ」 😞

一部のデフォルトを変更してスムーズに航行することはできません。私がtoをにPERL_UNICODE設定して実行するのは本当ですが"SA"、それだけです。それはほとんどがコマンドライン関連のものです。実際の作業では、上で概説した多くの手順をすべて実行し、非常に注意深く**非常に**実行します。


ƨ¡ƨdləɥƨᴉɥʇədoɥpuɐʻλɐpəɔᴉuɐəʌɐɥʻʞɔnlpoo⅁😈


56
シャーム・ペンドリーが指摘したように:「すべて!」今日何か新しいものを書く場合、UTF-8は物事を成し遂げる最も簡単な方法であるはずです。そうではない。あなたのボイラープレートはそれを証明します。誰もがそう多くのタンブラーを正しい位置に向けるそのような知識を持っているわけではありません。すみません、長くてつらい一日でしたので、明日メインエントリーで例を挙げてコメントします。
2010年

17
上記のリストを読むと、1つの結論が明らかになります。大文字と小文字を区別しないでください。しないでください。ずっと。計算コストが高く、セマンティクスが「ロケール」が何であるかを特定することに失敗した場合に決定的に依存するセマンティクス。
Tim Bray、

72
私がtchristによるこの投稿がFF / Chrome / IE / Operaで非常に大きく異なるようになり、時々判読不能になるほど皮肉だと思うのは私だけですか?
ダメージボーイ、

15
私は一般的にこの投稿が好きで、賛成投票をしましたが、1つのことは私を地獄に悩ませています。「〜壊れているコード」がたくさんあります。私はその発言については議論しませんが、その破綻を示すのは良いことだと思います。このようにして、それは(回答のこの部分の)暴言から教育へと行き渡ります。

36
@xenoterracideいいえ意図的に問題のあるコードポイントを使用しませんでした。これは、Unicode 6.0に対応するGeorge Dourosの超素晴らしいSymbolaフォントをインストールするためのプロットです。😈@depeszここでは、それぞれの壊れた仮定が間違っている理由を説明する余地はありません。@leonbloy Perlだけでなく、多くのことはUnicode全般に当てはまります。この資料の一部は、10月にリリース予定の 『Programming Perl』第4版に掲載される場合があります。✍残り1か月で✍作業に取り掛かりました。Unicodeはᴍᴇɢᴀそこにあります。正規表現も
tchrist

96

Unicodeテキストの処理には2つの段階があります。1つ目は、「情報を失うことなく、どのように入力および出力できるか」です。2つ目は、「現地の言語規則に従ってテキストをどのように扱うか」です。

tchristの投稿は両方をカバーしていますが、2番目の部分は彼の投稿のテキストの99%が由来する場所です。ほとんどのプログラムはI / Oも正しく処理しないので、正規化と照合について心配する前に、それを理解することが重要です。

この投稿はその最初の問題を解決することを目的としています

データをPerlに読み込むとき、それがどのエンコーディングであるかは関係ありません。それはいくつかのメモリを割り当て、そこにバイトを隠します。あなたが言うならprint $str、それはあなたの端末にそれらのバイトを送信するだけです、それはおそらくそれに書き込まれるすべてがUTF-8であると仮定するように設定されており、あなたのテキストが表示されます。

素晴らしい。

ただし、そうではありません。データをテキストとして処理しようとすると、何か問題が発生していることがわかります。あなたはそれ以上行く必要はありませんlengthPerlがあなたの文字列について考えていることと、あなたの文字列についてどう思っているかが一致していを確認ます。次のようなワンライナーを書いてperl -E 'while(<>){ chomp; say length }'、タイプしてください文字化けします。と、12が返されます...正解ではありません。4。

これは、Perlが文字列をテキストではないと想定しているためです。それがあなたに正しい答えを与える前にそれがテキストであることをあなたはそれに言わなければなりません。

とても簡単です。Encodeモジュールには、そのための関数があります。一般的なエントリポイントはEncode::decode(またはuse Encode qw(decode)、もちろん)です。この関数は、外界からいくつかの文字列(「オクテット」と呼びます。「8ビットバイト」と言います)を受け取り、Perlが理解できるテキストに変換します。最初の引数は、「UTF-8」、「ASCII」、「EUC-JP」などの文字エンコーディング名です。2番目の引数は文字列です。戻り値は、テキストを含むPerlスカラーです。

(もあります Encode::decode_utf8エンコーディングにはUTF-8を想定してます。)

ワンライナーを書き直すと:

perl -MEncode=decode -E 'while(<>){ chomp; say length decode("UTF-8", $_) }'

文字化けと入力すると、結果として「4」が得られます。成功。

これが、PerlのUnicode問題の99%に対する解決策です。

重要なのは、プログラムにテキストが入力されるたびに、それをデコードする必要があることです。インターネットは文字を送信できません。ファイルは文字を格納できません。データベースに文字がありません。オクテットしかなく、Perlではオクテットを文字として扱うことはできません。Encodeモジュールを使用して、エンコードされたオクテットをPerl文字にデコードする必要があります。

問題の残りの半分は、プログラムからデータを取得することです。それは簡単です。あなたが言うだけでuse Encode qw(encode)、あなたのデータがどのエンコーディングになるかを決定し(UTF-8はUTF-8を理解するターミナル、Windows上のファイルのUTF-16など)、encode($encoding, $data)単に出力する代わりに結果を出力し$dataます。

この操作は、プログラムが操作するPerlの文字を、外部の世界で使用できるオクテットに変換します。インターネットまたはターミナルに文字を送信できればはるかに簡単ですが、オクテットのみは送信できません。したがって、文字をオクテットに変換する必要があります。変換しない場合、結果は未定義です。

要約すると、すべての出力をエンコードし、すべての入力をデコードします。

次に、これを少し難しいものにする3つの問題について説明します。最初はライブラリです。彼らはテキストを正しく処理していますか?答えは...彼らは試みます。Webページをダウンロードすると、LWPは結果をテキストとして返します。結果に対して適切なメソッドを呼び出すと、それが起こります(たまたま、サーバーから取得したオクテットストリームにすぎdecoded_contentませんcontent)。データベースドライバーは不安定な場合があります。PerlだけでDBD :: SQLiteを使用した場合、問題は解決しますが、他のツールがデータベースにUTF-8以外のエンコーディングとして格納されたテキストを配置した場合...まあ...それは正しく処理されません正しく処理するコードを書くまで。

通常、データの出力はより簡単ですが、「印刷されたワイド文字」が表示された場合は、どこかでエンコーディングがめちゃくちゃになっていることがわかります。その警告は「Perlの文字を外部に漏らそうとしているので、意味がありません」という意味です。プログラムは動作しているように見えます(通常、もう一方の端が生のPerl文字を正しく処理するため)。プログラムは非常に壊れており、いつでも動作を停止する可能性があります。明示的に修正してくださいEncode::encode

2番目の問題は、UTF-8でエンコードされたソースコードです。use utf8各ファイルの冒頭で述べない限り、PerlはソースコードがUTF-8であると想定しません。これは、のようなことを言うたびmy $var = 'ほげ'に、プログラムにゴミを注入し、すべてを恐ろしく破壊することを意味します。「utf8を使用する」必要ありませんが、使用しない場合は、プログラムで非ASCII文字を使用しないでください。

3番目の問題は、Perlが過去をどのように処理するかです。昔、Unicodeのようなものは存在せず、PerlはすべてがLatin-1テキストまたはバイナリであると想定していました。そのため、データがプログラムに入ってきてテキストとして扱い始めると、Perlは各オクテットをLatin-1文字として扱います。そのため、「文字化け」の長さを尋ねると、12が得られました。Perlは、Latin-1文字列「æååã」(12文字で、一部は非表示)で動作していると想定しました。

これは「暗黙のアップグレード」と呼ばれ、完全に合理的なことですが、テキストがLatin-1でない場合、これは望ましくありません。そのため、入力を明示的にデコードすることが重要です。それを行わないと、Perlがそうし、間違って行う可能性があります。

データの半分が適切な文字列であり、一部はまだバイナリであるという問題が発生します。Perlは、まだバイナリである部分をLatin-1テキストであると解釈し、正しい文字データと結合します。これにより、キャラクターを正しく処理することでプログラムが壊れたように見えますが、実際には十分に修正していません。

次に例を示します。UTF-8でエンコードされたテキストファイルを読み取るプログラムがあり、PILE OF POO各行にUnicode を付加して印刷します。あなたはそれを次のように書きます:

while(<>){
    chomp;
    say "$_ 💩";
}

そして、次のようないくつかのUTF-8エンコードされたデータで実行します。

perl poo.pl input-data.txt

各行の終わりにpooを付けてUTF-8データを出力します。完璧です、私のプログラムはうまくいきます!

しかし、いいえ、あなたはバイナリ連結をしているだけです。ファイルからオクテットを読み取り、\nwith chompを削除してから、PILE OF POO文字のUTF-8表現のバイトを追加します。ファイルからデータをデコードして出力をエンコードするようにプログラムを修正すると、pooの代わりにガベージ( "ð©")が発生することに気付くでしょう。これにより、入力ファイルをデコードするのは間違っていると信じるようになります。そうではありません。

問題は、pooがlatin-1として暗黙的にアップグレードされていることです。あなたがいる場合use utf8、バイナリの代わりにリテラルテキストを作るために、それが再び動作します!

(これが、私がUnicodeを手助けするときに私が目にする最大の問題です。彼らは正しく機能し、プログラムを壊しました。それは、未定義の結果の悲しいことです:長い間、正常に機能するプログラムを持つことができますが、それを修復し始めると、心配する必要はありません。プログラムにエンコード/デコードステートメントを追加しているときに問題が発生した場合、それは単に実行する作業が増えることを意味します。次回、最初からUnicodeを念頭に置いて設計すると、はるかに簡単です!)

これが、PerlとUnicodeについて知っておくべきことのすべてです。Perlにデータが何であるかを伝えると、すべての一般的なプログラミング言語の中で最も優れたUnicodeサポートを備えています。ただし、どのような種類のテキストを供給しているのかを魔法のように知っていると仮定すると、データを取り返しのつかない形で破棄することになります。プログラムがUTF-8端末で今日機能するからといって、明日、UTF-16でエンコードされたファイルで機能するわけではありません。だから今は安全にして、ユーザーのデータを破壊する頭痛を取り除いてください!

Unicodeの処理の簡単な部分は、出力のエンコードと入力のデコードです。難しいのは、すべての入力と出力を見つけ、それがどのエンコーディングであるかを判断することです。しかし、それがあなたが大金を得る理由です:)


原理はよく説明されていますが、I / Oの実際的なアプローチは欠けています。Encodeモジュールを明示的に使用するのは面倒でエラーが発生しやすく、I / Oに関するコードの読み取りが非常に困難になります。I / Oレイヤーは、必要に応じて透過的にエンコードおよびデコードするソリューションを提供します。openそしてbinmode、それらの仕様openを考慮に入れます。tchristが彼の答えで推奨するように、プラグマはデフォルトを設定します。
Palec 2017

48

多くの理由で難しい問題であることに私たちは皆同意していますが、それこそが、誰にとってもそれをより簡単にしようとする理由です。

CPANには、「Unicodeを有効にしようとするすべてのモジュール」utf8 :: allという最近のモジュールがあります。

指摘したように、システム全体(プログラムの外部、外部Webリクエストなど)にUnicodeを魔法のように使用することはできません。それが私たちがプログラマーである理由です。

utf8 :: allが想定どおりの動作を行わない場合は、改善して改善します。または、一緒に人々のさまざまなニーズにできるだけ合うことができる追加のツールを作ろう。

`


5
引用されたモジュールには改善余地がたくさんありutf8::allます。これはunicode_strings機能の前に作成されたもので、FᴀɴᴅᴀɴᴅᴀᴛLᴏɴɢLᴀsᴛが正規表現を修正して正規表現に追加/uします。エンコードエラーで例外が発生するとは思いませんが、これは本当に必要なものです。use charnames ":full"まだ自動ロードされていないプラグマにはロードされません。の代わりに、の代わりにを使用して[a-z]printf文字列の幅などについては警告しませんが、おそらくそれがより重要です。それが私なら、𝐍𝐅𝐃インと𝐍𝐅𝐂アウトを追加します。\n\R.\XPerl::Critic
tchrist

13
@tchrist utf8 :: allの課題トラッカーはこちらです。 github.com/doherty/utf8-all/issues 彼らはあなたの提案を聞きたいです。
Schwern、2011年

4
@Schwern:ᴇɴᴏᴛᴜɪᴛsですが、私がここで書いたものを自由に盗んだりつまんだりしてください。正直なところ、私はまだ何ができるか、何をすべきか、どこでできるかを感じています。以下は、オフロードソートの良い例ですunichars -gs '/(?=\P{Ll})\p{Lower}|(?=\P{Lu})\p{Upper}/x' | ucsort --upper | cat -n | less -r。同様に、のような前処理の手順... | ucsort --upper --preprocess='s/(\d+)/sprintf "%#012d", $1/ge'も非常に便利で、他の人に決定を下したくありません。まだUnicodeツールボックスを構築しています
tchrist

35

UnicodeとPerlとの関係を誤解していると思います。データ、Unicode、ISO-8859-1、または他の多くのものを格納する方法に関係なく、プログラムは、取得したバイトを入力として解釈する方法(デコード)と、出力したい情報を表現する方法(エンコード)を知っている必要があります。 )。その解釈を誤ると、データが文字化けします。あなたのプログラムの中に、どのように行動するかをプログラムに伝える魔法のデフォルト設定はありません。

あなたは、ASCIIであることにすべて慣れているので、おそらく難しいと思います。あなたが考えていたはずのすべてが、プログラミング言語とそれが相互作用しなければならなかったすべてのものによって単に無視されました。すべてがUTF-8しか使用せず、選択の余地がない場合、UTF-8も同じくらい簡単です。しかし、すべてがUTF-8を使用するわけではありません。たとえば、実際にはそうでない場合、入力ハンドルがUTF-8オクテットを取得していると考えたくはありません。また、出力ハンドルがUTF-8を処理できる場合、出力ハンドルをUTF-8にしたくありません。 。Perlはそれらのことを知る方法がありません。それがあなたがプログラマーである理由です。

Perl 5のUnicodeは複雑すぎるとは思いません。私はそれは恐ろしいと思います、そして人々はそれを避けます。違いがあります。そのために、私はUnicodeをLearning Perl、6th Editionに入れましたが、Effective Perl Programmingには多くのUnicode機能があります。Unicodeとその仕組みを学び、理解するために時間を費やす必要があります。そうしないと、効果的に使用できなくなります。


3
私はあなたがポイントを持っていると思います:それは怖いです。それでいいの?私にとってはUnicodeの祝福ですが、Perl5での使用はそうではありません(ASCIIであるとは想定していません。母国語には少なくともiso8859-4が必要です)。私はRakudoをインストールし、UTF-8(この限られたサンドボックス内)で試したものはすべてそのまま使用できました。私は何か見落としてますか?もう一度強調します。Unicodeのサポートを微調整することは良いことですが、ほとんどの場合、その必要はありません。トピックへの恐れを取り除くために、1つの方法は、誰もが内部を理解するために多くを読むことです。その他:特別なプラグマがあるのでuse utf8_everywhere、人々は幸せになります。なぜ最後にしないのですか?
2010年

3
私はまだあなたが要点を逃していると思います。何がうまくいった?内部を理解する必要はありません。外部を理解し、同じ文字の異なるエンコーディングと異なる表現を持つ文字列をどのように処理するかを理解する必要があります。トムのアドバイスをもう一度読んでください。彼が言っていることのほとんどは、楽堂はあなたのために処理しないと思うだろう。
ブライアン・ド・フォイ2011年

1
@wk:ランディの答えをもう一度読んでください。彼はすでに制限が何であるかをあなたに話しました。
ブライアン・ド・フォイ

2
@brian d foy:tchristが言うように、これらの制限は問題ないと思います(すべての側面に特効薬はありません(ここでこの質問をする前にそれらのほとんどを見ていませんでした)。したがって、utf8 :: allのようなもので多くの基本的なものをカバーする場合、utf8処理の基本を機能させるためだけに、誰もが独自の巨大なボイラープレートを構築する必要はありません。「まったく恐れない」とは、基本がカバーされていることを知っていれば誰でも彼のプロジェクトを開始できることを意味します。はい、そうです、まだ多くの問題があります。しかし、開始が簡単な場合、それらを解決するために関与する人が増えます。私見

1
@wk-「utf8:all」または「uni :: perl」の唯一の「間違った」は1つだけです-それらはCOREにありません-したがって、誰もがCPANからインストールする必要があります。それがなければ、COREのperlはまだユニコードをサポートしているはい、それはヘルパーモジュールと簡単に使用UTF8です- - 。再考してください-扱う。しかし、ずっと、ずっと複雑で、これは間違っている。
jm666

28

このスレッドを読んでいると、「Unicode」の同義語として「UTF-8」を使用しているような印象を受けます。ASCIIコードの相対的な拡大であるUnicodeの「コードポイント」とUnicodeのさまざまな「エンコーディング」を区別してください。そのうちのいくつかはあり、そのうちUTF-8、UTF-16、およびUTF-32が現在のものであり、さらにいくつかは廃止されています。

UTF-8(および他のすべてのエンコーディング)が存在し、入力または出力でのみ意味があります。内部的には、Perl 5.8.1以降、すべての文字列はUnicodeの「コードポイント」として保持されます。確かに、以前に見事にカバーされたいくつかの機能を有効にする必要があります。


19
私は人々がU⧸をUTF-8⧸16⧸32と混同することが多すぎることに同意しますが、Uɴɪᴄᴏᴅᴇがᴀsᴄɪɪに比べて単なる拡大された文字セットであることは根本的かつ批判的に真実ではありませんせいぜい、それは単なるɪsᴏ‑10646にすぎませんUɴɪᴄᴏᴅᴇにはさらに多くのものが含まれます照合、ケースフォールディング、正規化形式、書記素クラスター、単語と改行、スクリプト、数値の同値、幅、双方向性、グリフバリアント、コンテキスト動作、ロケール、正規表現、結合クラス、プロパティの100、はるかに!
tchrist

15
@tchrist:最初のステップは、データをプログラムに取り込み、それを破壊することなく外部に送り出すことです。次に、照合、大文字と小文字の折りたたみ、グリフの変形などのベビーステップについて心配することができます。
jrockway

7
私は同意します、perlが入力や出力を捨てないようにすることが最優先事項でなければなりません。次の架空の会話を具体化できるモジュールまたはプラグマが欲しいのですが、 "-親愛なるPerl。このプログラムの場合、すべての入力と出力はUTF-8のみになります。データをゴミ箱に入れないでください。- -確かに-本当に-絶対に-UTF-8以外のデータが提供された場合、私が異常な動作をする可能性があることを受け入れますか?-はい、大丈夫です。 -じゃあね」
hlovdal

10

世の中には本当に恐ろしい量の古代のコードがあり、その多くは一般的なCPANモジュールの形をしています。影響を受ける可能性のある外部モジュールを使用する場合は、Unicodeの有効化にかなり注意を払う必要があることに気付き、定期的に使用するいくつかのPerlスクリプトでUnicode関連の障害を特定して修正しようとしています(特に、iTiVoが失敗します)。トランスコーディングの問題により、7ビットASCII以外のものではひどい。


-C明示的に設定$LANGして$LC_ALL適切に設定している場合でも、Unicodeの代わりにISO 8859/1を使用することに決めているため、PerlがUnicodeと同じページにあることを確認するオプションを使用するつもりでした。(これは実際にはプラットフォームロケールライブラリのバグを反映している可能性があります。)それが何であれ、処理を実行するPerlスクリプトが変換エラーでフォールオーバーするため、アクセントのあるプログラムでiTivoを使用できないのは非常に不愉快です。
ギーコサウルス

3
唯一の-Cオプションなしであるバギー、エラーが発生しやすいです。あなたは世界を壊します。をセットするPERL5OPTenvariableをにする-Cと、私の意味がわかります。私たちはv5.8でこの方法を試しましたが、それは惨事でした。あなたは単純にそれを期待していないプログラムに、彼らがそれが好きかどうかに関わらず今ユニコードを扱っていることを告げることはできませんし、してはなりません。セキュリティ上の問題もあります。少なくとも、print while <>バイナリデータを渡した場合は、何も機能しなくなります。すべてのデータベースコードも同様です。これはひどい考えです。
tchrist

1
私は具体的にではなく、総称的に話していました -Cオプションなしで。私が取り組んできた特定の呼び出しはでした-CSDA。それはそうかもしれないこと、私は(...こんにちはMacPortsの)長い時間のために5.8.xにこだわっていた、と述べことの一部。
ギーコサウルス

1
PERL_UNICODEをSAに設定して実行します。あなたはことはできません D.に設定
tchrist

@tchrist:一部のPerl varmintが-CSDAおよびPERL_UNICODE = SDAの使用法を示すコードを投稿しています。コミュニティでの影響力を活用してください。彼は止められなければならない!
アシュリー

1

Unicode文字列機能を有効にする必要があります。これは、v5.14を使用する場合のデフォルトです。

あなたは本当にユニコード識別子、特にを使用すべきではありません。utf8を介した外部コードについては、perl5では安全でないため、cperlのみが正しく実行しました。例:http : //perl11.org/blog/unicode-identifiers.html

ファイルハンドル/ストリームのutf8に関して:外部データのエンコーディングを自分で決める必要があります。ライブラリはそれを知ることができず、libcもutf8をサポートしていないため、適切なutf8データはまれです。さらに多くのwtf8、つまりutf8のウィンドウの異常があります。

ところで、Mooseは実際には「モダンPerl」ではなく、名前を乗っ取っただけです。Mooseは、ラリーウォールスタイルのポストモダンperlとBjarne Stroustrupスタイルのすべてを組み合わせたもので、適切なperl6構文の折衷的な異常があります。適切な実装。cperlとperl6は、フォームが機能に従い、実装が削減および最適化された、真の最新のperlです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.