Perlで構築された最近のソリューションのほとんどがなぜ有効になっていないのか不思議ですUTF-8デフォルトでは。
Perl のコア スクリプトには多くのレガシー問題があり、それが問題を引き起こす可能性があることは理解しています。しかし、私の観点からすると、21 世紀には、大規模な新しいプロジェクト (または大きな展望を持つプロジェクト) は、ソフトウェアを最初から UTF-8 対応にする必要があります。それでも、それが実現するとは思えません。たとえば、ムース厳密な警告は有効になりますが、ユニコード。モダン::Perl定型文も削減されますが、UTF-8 は処理されません。
なぜですか? 2011 年の最新の Perl プロジェクトで UTF-8 を避けるべき理由があるのでしょうか?
@tchrist へのコメントが長くなりすぎたので、ここに追加します。
私の説明が明確でなかったようです。いくつか追加させてください。
tchristと私は状況についてかなり似た見方をしていますが、結論はまったく正反対です。Unicode の状況は複雑であることは私も同意しますが、だからこそ、私たち (Perl ユーザーとコーダー) は、UTF-8 の処理を今日必要なほど簡単にするレイヤー (またはプラグマ) を必要としているのです。
tchrist は、カバーすべき多くの側面を指摘しました。私は、それらについて数日、あるいは数週間かけて読み、考えます。しかし、これは私の論点ではありません。tchristは、「UTF-8 を有効にする」方法が 1 つだけではないことを証明しようとしています。私は、それに反論できるほどの知識を持っていません。そのため、実際の例に固執します。
私は遊んでみました楽土UTF-8 は必要なだけありました。何の問題もなく、問題なく動作しました。どこか深いところに何らかの制限があるのかもしれませんが、最初はテストしたものはすべて期待どおりに動作しました。
それは現代の Perl 5 でも目標になるべきではないでしょうか? 私はさらに強調します。私はコア Perl のデフォルトの文字セットとして UTF-8 を提案しているのではなく、新しいプロジェクトを開発する人のために、それを簡単にトリガーできる可能性を提案しているのです。
もう 1 つの例ですが、より否定的なトーンです。フレームワークは開発を容易にするはずです。数年前、Web フレームワークを試しましたが、「UTF-8 を有効にする」がわかりにくかったため、すぐに捨ててしまいました。Unicode サポートをフックする方法と場所がわかりませんでした。時間がかかりすぎたため、従来の方法の方が簡単だとわかりました。今、同じ問題に対処するための懸賞があることを知りました。石工2:Mason2 UTF-8 をクリーンにするにはどうすればいいですか?かなり新しいフレームワークですが、UTF-8 で使用するには内部の深い知識が必要です。まるで大きな赤い看板のようです。「やめてください。使用しないでください」!
私は Perl が大好きです。しかし、Unicode を扱うのは苦痛です。私はまだ壁にぶつかっています。ある意味では、tchristは正しく、私の疑問に答えています。Perl 5 では UTF-8 が複雑すぎるため、新しいプロジェクトでは UTF-8 は採用されません。
ベストアンサー1
���������������� ℞ :
PERL_UNICODE
変数を に設定しますAS
。これにより、すべての Perl スクリプトが@ARGV
UTF-8 文字列としてデコードされ、stdin、stdout、stderr の 3 つすべてのエンコードが UTF-8 に設定されます。これらは両方ともグローバルな効果であり、字句的な効果ではありません。ソース ファイル (プログラム、モジュール、ライブラリ、ヒッキー) の先頭で
do
、次のようにして、Perl バージョン 5.12 以上を実行していることを明示的に宣言します。use v5.12; # minimal for unicode string feature use v5.14; # optimal for unicode string feature
警告を有効にします。前の宣言では、警告ではなく、制約と機能のみが有効になっています。また、Unicode 警告を例外に昇格させることも提案しています。そのため、これらの行の 1 つだけではなく両方を使用してください。ただし、v5.14 では、警告
utf8
クラスは、すべて個別に有効にできる 3 つの他のサブ警告 (nonchar
、、surrogate
および) で構成されることに注意してくださいnon_unicode
。これらに対して、より詳細な制御を行う必要がある場合があります。use warnings; use warnings qw( FATAL utf8 );
このソース ユニットが UTF-8 としてエンコードされていることを宣言します。かつてこのプラグマは他の機能も果たしていましたが、現在はこの 1 つの目的のみを果たします。
use utf8;
このレキシカル スコープ内でファイル ハンドルを開くが、他の場所では開かないものは、特に指定しない限り、そのストリームが UTF-8 でエンコードされていると想定することを宣言します。こうすることで、他のモジュールや他のプログラムのコードには影響しません。
use open qw( :encoding(UTF-8) :std );
経由で名前付き文字を有効にします
\N{CHARNAME}
。use charnames qw( :full :short );
ハンドルがある場合は
DATA
、明示的にエンコーディングを設定する必要があります。これを UTF-8 にしたい場合は、次のようにします。binmode(DATA, ":encoding(UTF-8)");
もちろん、最終的に関心を持つことになる他の事項は尽きることはありませんが、これらの用語の意味は多少弱められたとしても、「すべてを UTF-8 で動作させる」という国家目標に近づくには十分でしょう。
Unicode に関連していませんが、もう 1 つのプラグマは次のとおりです。
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 を有効にする」ために必要なものがいくつかあります。
すべての��ソースコードはデフォルトでUTF-8でなければなりません。
use utf8
またはを使用してそれを取得できますexport PERL5OPTS=-Mutf8
。DATA
�� ハンドルはUTF-8 である必要があります。 のように、パッケージごとにこれを行う必要がありますbinmode(DATA, ":encoding(UTF-8)")
。�� スクリプトへのプログラム引数は、デフォルトで UTF-8 であると理解される必要があります。
export PERL_UNICODE=A
、またはperl -CA
、またはexport PERL5OPTS=-CA
。標準入力、出力、およびエラー ストリームは、
export PERL_UNICODE=S
すべて UTF-8 にデフォルト設定されます。または、一部だけ 、 、 、 のいずれかになります。これは のようにI
なりO
ます。E
perl -CS
�� によって開かれたその他のハンドルは、特に宣言されていない限り UTF-8 と見なす必要があります。
export PERL_UNICODE=D
または、これらのうちの特定のハンドルについては、i
とが機能します。これですべてが解決します。o
export PERL5OPTS=-CD
-CSAD
両方のベースと、開いたすべてのストリームをカバーします
export PERL5OPTS=-Mopen=:utf8,:std
。ユニクォート。UTF-8 エンコード エラーを見逃さないようにしてください。 を試してください
export PERL5OPTS=-Mwarnings=FATAL,utf8
。また、入力ストリームが だけでなく、常に にbinmode
d されていることを確認してください。:encoding(UTF-8)
:utf8
128~255 のコード ポイントは、プロパティ化されていないバイナリ値だけでなく、対応する Unicode コード ポイントとして によって理解される必要があります。
use feature "unicode_strings"
またはexport PERL5OPTS=-Mfeature=unicode_strings
。これにより、 および が作成されますuc("\xDF") eq "SS"
。"\xE9" =~ /\w/
単純なexport PERL5OPTS=-Mv5.12
または より優れた もそれを取得します。名前付きUnicode文字はデフォルトでは有効になっていないので、追加する
export PERL5OPTS=-Mcharnames=:full,:short,latin,greek
か、またはそれに相当するものを追加してください。ユニネームそしてtcgrep。ほとんどの場合、以下の機能にアクセスする必要があります。標準
Unicode::Normalize
モジュールさまざまなタイプの分解。export PERL5OPTS=-MUnicode::Normalize=NFD,NFKD,NFC,NFKD
そして、常にNFD経由で受信するものとNFC経由で送信するものを実行します。私が知る限り、これらにはまだI/Oレイヤーはありませんが、NFC、不要、いいえ、 そしてナフコ。eq
、、、、、 &c & ccを使用した での文字列比較は常に間違っています。したがって、 の代わりに が必要です。それを に追加してもよいでしょう。ne
バイナリ比較のキーをキャッシュできます。lc
cmp
sort
@a = sort @b
@a = Unicode::Collate->new->sort(@b)
export PERL5OPTS=-MUnicode::Collate
やのような組み込み関数は
printf
、write
Unicodeデータに対して間違った動作をします。モジュールUnicode::GCString
前者については、そしてそれとまたモジュールUnicode::LineBreak
後者も同様です。uwcそしてユニフォーム。\d+
整数としてカウントしたい場合は、キャプチャを次のように実行する必要があります。関数Unicode::UCD::num
なぜなら、��の組み込みatoi(3)は現時点では十分に賢くないからです。�� ファイルシステムでは、ファイルシステムの問題が発生します。一部のファイルシステムは、暗黙的に NFC への変換を強制します。また、暗黙的に NFD への変換を強制するファイルシステムもあります。さらに、他のファイルシステムは別の処理を行います。中には、問題を完全に無視するものもあり、これはさらに大きな問題につながります。したがって、正常な状態を保つには、NFC/NFD 処理を独自に行う必要があります。
、、およびを含む、
a-z
またはA-Z
などを含むすべての��コードは変更する必要があります。これは、コードが壊れていることを示す明らかな赤信号として目立つはずです。しかし、どのように変更する必要があるかは明確ではありません。適切なプロパティを取得し、それらのケースフォールドを理解することは、あなたが思っているよりも難しいです。私はm//
s///
tr///
ユニキャラそしてユニプロップ毎日。を使用するコードは、
\p{Lu}
を使用するコードとほぼ同じくらい間違っています。代わりに を使用し、その理由を理解する[A-Za-z]
必要があります。はい、と は、 およびとは異なります。\p{Upper}
\p{Lowercase}
\p{Lower}
\p{Ll}
\p{Lowercase_Letter}
を使用するコードはさらに悪いです。また、または は
[a-zA-Z]
使用できません。 を使用する必要があります。ご存知のように、すべてのアルファベットが文字であるわけではありません。\pL
\p{Letter}
\p{Alphabetic}
で �� 変数を探している場合
/[\$\@\%]\w+/
、問題があります。 を探す必要があります/[\$\@\%]\p{IDS}\p{IDC}*/
が、それでも句読点変数やパッケージ変数は考慮されません。空白をチェックする場合は、状況に応じて と のどちらかを選択する必要があり
\h
ます。また、 はを意味しないという一般的な考えに反して、\v
を使用しないでください。\s
[\h\v]
\n
線の境界に 、あるいは を使用している場合は\r\n
、それは間違いです。 を使用する必要がありますが\R
、これは同じではありません。いつ電話すればいいのか分からない場合Unicode::文字列の準備なら、学んだほうがいいですよ。
大文字と小文字を区別しない比較では、2つの文字が発音区別記号などに関係なく同じ文字であるかどうかを確認する必要があります。これを行う最も簡単な方法は、標準 Unicode::Collateモジュール。メソッドなど
Unicode::Collate->new(level => 1)->cmp($a, $b)
もありeq
、match
およびsubstr
メソッドについても学習する必要があります。 これらは、�� 組み込み関数に比べて明確な利点があります。時にはそれだけでは十分ではなく、Unicode::Collate::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これらのいくつかをテストします。文字列「 niño 」のパターン CVCV (子音、母音、子音、母音) を一致させる方法を考えてみましょう。NFD形式 (これは絶対に入れておくべきでした) は「nin\x{303}o」になります。では、どうしますか? 母音であると仮定しても
[aeiou]
(ちなみにこれは間違っています)、どちらも同じようにはできません(?=[aeiou])\X)
。なぜなら、NFD でも 'ø' のようなコード ポイントは分解されないからです。ただし、先ほど示した UCA 比較を使用すると、'o' と等しいとテストされます。NFD に頼ることはできず、UCA に頼る必要があります。
�� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ��
それだけではありません。Unicode に関して人々が抱く誤った思い込みは無数にあります。人々がこれらのことを理解しない限り、彼らのコードは壊れたままです。
エンコーディングを指定せずにテキスト ファイルを開くことができると想定しているコードは壊れています。
デフォルトのエンコーディングが何らかのネイティブ プラットフォーム エンコーディングであると想定するコードは壊れています。
日本語または中国語の Web ページは UTF-8 よりも UTF-16 の方がスペースをあまり取らないと想定するコードは間違っています。
Perl が内部的に UTF-8 を使用すると想定するコードは間違っています。
エンコード エラーによって常に例外が発生すると想定するコードは間違っています。
Perl コード ポイントが 0x10_FFFF に制限されていると想定するコードは間違っています。
$/
任意の有効な行区切り文字で機能するものに設定できると想定するコードは間違っています。lc(uc($s)) eq $s
または のように、casefolding での往復の等価性を前提とするコードは完全に壊れていて間違っています。と は両方とも ですが、その両方を返すことは不可能であるuc(lc($s)) eq $s
ことを考慮してください。uc("σ")
uc("ς")
"Σ"
lc("Σ")
すべての小文字のコード ポイントに大文字のコード ポイントが 1 つずつある (またはその逆) と想定するコードは壊れています。たとえば、 は
"ª"
大文字のない小文字ですが、 と"ᵃ"
は"ᴬ"
どちらも文字ですが小文字ではありません。ただし、どちらも対応する大文字バージョンがない小文字のコード ポイントです。わかりましたか?どちらもと であるにもかかわらず、ではありません 。\p{Lowercase_Letter}
\p{Letter}
\p{Lowercase}
大文字と小文字を変更しても文字列の長さは変わらないと想定しているコードは壊れています。
ケースが 2 つしかないと想定しているコードは壊れています。タイトルケースもあります。
文字だけが大文字と小文字を持つと想定しているコードは壊れています。文字だけでなく、数字、記号、マークにも大文字と小文字があります。実際、大文字と小文字を変更すると、
\p{Mark}
が に変わるなど、主な一般カテゴリが変わることもあります\p{Letter}
。また、あるスクリプトから別のスクリプトに切り替えることもできます。大文字と小文字がロケールに依存しないことを前提とするコードは壊れています。
Unicode が POSIX ロケールに関する情報を提供すると想定しているコードは壊れています。
発音区別符号を削除して基本 ASCII 文字を取得できると想定するコードは、邪悪で、静止していて、壊れていて、脳に損傷があり、間違っており、死刑を正当化するものです。
\p{Diacritic}
発音区別符号と記号\p{Mark}
が同じものであると想定するコードは壊れています。\p{GC=Dash_Punctuation}
壊れている部分をカバーすることを前提としたコード\p{Dash}
。ダッシュ、ハイフン、マイナスが互いに同じものである、またはそれぞれ 1 つしかないと想定するコードは壊れており、間違っています。
各コード ポイントが 1 つの印刷列しか占めないと想定するコードは壊れています。
\p{Mark}
すべての文字が 0 個の印刷列を占めると想定するコードは壊れています。似ている文字は同じであると想定するコードは壊れています。
似ていない文字は似ていないと想定するコードは壊れています。
行内のコード ポイントの数に制限があり、
\X
一致するのは 1 つだけであると想定するコードは間違っています。\X
文字で始まることができないと想定するコードは\p{Mark}
間違っています。\X
が2 つの非文字を保持できないと想定するコードは\p{Mark}
間違っています。使用できないことを前提としたコードは
"\x{FFFF}"
間違っています。2 つの UTF-16 (サロゲート) コード ユニットを必要とする非 BMP コード ポイントが、コード ユニットごとに 1 つずつ、2 つの別々の UTF-8 文字にエンコードされると想定するコードは間違っています。そうではありません。単一のコード ポイントにエンコードされます。
先頭に BOM がある UTF-16 または UTF-32 から UTF-8 にトランスコードするコードは、結果の UTF-8 の先頭に BOM が付くと壊れます。これはあまりにも愚かなので、エンジニアはまぶたを切除するべきです。
CESU-8 が有効な UTF エンコーディングであると想定しているコードは間違っています。同様に、U+0000 を
"\xC0\x80"
UTF-8 としてエンコードすると考えるコードも壊れていて間違っています。これらの人々もまぶたの処置を受けるに値します。>
常に右を指し、<
常に左を指すような文字を想定するコードは間違っています。実際にはそうではないからです。X
最初に文字を出力し、次に文字を出力した場合にY
、それらが として表示されることを想定するコードはXY
間違っています。そうならない場合もあります。英語を正しく書くには ASCII で十分だと想定するコードは、愚かで、近視眼的で、無学で、壊れていて、邪悪で、間違っています。首をはねましょう! それが極端すぎると思われるなら、妥協しましょう。今後は片足の親指だけで入力できます。(残りの部分はダクトテープで固定します。)
\p{Math}
すべてのコード ポイントが可視文字であると想定するコードは間違っています。\w
文字、数字、アンダースコアのみが含まれていると想定するコードは間違っています。^
およびが~
句読点であると想定するコードは間違っています。ü
ウムラウトがあると想定しているコードは間違っています。₨
何か文字が含まれていると想定するコードは間違っています。\p{InLatin}
同じであると信じているコードは\p{Latin}
、ひどく壊れています。\p{InLatin}
ほとんどの場合役に立つと信じているコードは、ほぼ間違いなく間違っています。$FIRST_LETTER
あるアルファベットの最初の文字として与えられ、$LAST_LETTER
同じアルファベットの最後の文字として与えられれば、[${FIRST_LETTER}-${LAST_LETTER}]
何らかの意味を持つと信じているコードは、ほとんどの場合、完全に壊れていて、間違っており、意味がありません。誰かの名前には特定の文字しか使用できないと信じているコードは愚かで、不快で、間違っています。
Unicode を ASCII に縮小しようとするコードは単に間違っているだけでなく、その実行者は二度とプログラミングに従事することを許されるべきではありません。以上です。これまでのところ、明らかにあまり良い結果をもたらしていないので、彼らが再び目が見えるようになることさえ許されるべきかどうかさえ確信が持てません。
テキストファイルのエンコーディングが存在しないかのように見せかける方法があると信じているコードは壊れていて危険です。もう片方の目も突き刺すようなものです。
不明な文字を に変換するコードは
?
壊れていて、愚かで、頭が悪く、標準の推奨事項に反して実行されます。標準の推奨事項では、そうしてはいけないとされています。なぜそうしてはいけないのか、RTFM で確認してください。マークされていないテキストファイルのエンコードを確実に推測できると信じているコードは、傲慢さと無知さの致命的な混合の罪を犯しており、それを修正できるのはゼウスの稲妻だけです。
printf
�� 幅を使用して Unicode データをパディングおよび位置揃えできると想定しているコードは壊れており、間違っています。特定の名前でファイルを正常に作成すると、そのファイルを囲むディレクトリで
ls
または を実行readdir
すると、実際には作成した名前のファイルにバグがあり、壊れていて、間違っていることがわかると信じているコード。これに驚かないでください。UTF-16 が固定幅エンコーディングであると信じているコードは愚かで、壊れていて、間違っています。そのプログラミング ライセンスを取り消してください。
あるプレーンのコード ポイントを他のプレーンのコード ポイントと少しでも異なる方法で扱うコードは、ipso facto壊れていて間違っています。学校に戻って勉強してください。
/s/i
のようなものだけが一致すると信じているコードは壊れてい"S"
て"s"
間違っています。驚くでしょう。\PM\pM*
を使用する代わりに を使用するコードは\X
壊れていて間違っています。ASCII の世界に戻りたい人は、心からそうするように奨励されるべきであり、彼らの輝かしいアップグレードを記念して、データ入力に必要なすべての機能を備えた、電気以前の手動タイプライターを無料で提供すべきです。彼らに送られるメッセージは、1 行あたり 40 文字の ᴀʟʟᴄᴀᴘs 電信で送信され、宅配業者によって手渡されるべきです。やめてください。
�� �� �� �� �� �� �� �� ��
私が書いたものより「�� のデフォルトの Unicode」がどれだけ入手できるかはわかりません。ええ、わかります。 と も使用する必要がありますUnicode::Collate
。Unicode::LineBreak
おそらく、それ以上でしょう。
ご覧のとおり、実際に心配しなければならないUnicode関連の事柄が多すぎるため、 「Unicode をデフォルトにする」というようなことはあり得ません。
皆さんが発見するのは、私たちが �� 5.8 で発見したのと同じように、最初から考慮して設計されていないコードにこれらすべてのことを強制することは不可能だということである。皆さんの善意の利己心が世界全体を破壊したのだ。
そして、たとえそれができたとしても、正しく理解するにはかなりの思考を必要とする重要な問題がまだあります。スイッチを入れることはできません。ここでは頭脳、つまり本物の頭脳だけが役に立ちます。学ばなければならないことが山ほどあります。手動タイプライターに退却したとしても、無知のままでやり過ごすことは絶対に望めません。今は 21 世紀であり、故意に無知なまま Unicode を消滅させることは不可能です。
それを学ばなければなりません。以上です。「すべてがうまくいく」というのは決して簡単なことではありません。なぜなら、そうすると多くのことがうまくいかないことが保証され、「すべてをうまく機能させる」方法が存在するという仮定が無効になるからです。
ごく少数の非常に限定された操作に対して、いくつかの妥当なデフォルトを取得できるかもしれませんが、私が考えているよりもはるかに多くのことを考えなければ、それは不可能です。
ほんの一例ですが、正規の順序付けは本当に頭の痛い問題です。 "\x{F5}"
' õ' 、"o\x{303}"
'õ'、"o\x{303}\x{304}"
'ȭ'、"o\x{304}\x{303}"
'ō̃'はすべて'õ'に一致するはずですが、一体どうやってそれを実現するのでしょうか。これは見た目よりも難しいですが、考慮する必要があることです。
Perl について私が知っていることが 1 つあるとすれば、それは Unicode ビットが何を実行し、何を実行しないかということです。そして、次のことは保証します。「̲ᴛ̲ʜ̲ᴇ̲ʀ̲ᴇ̲ ̲ɪ̲s̲ ̲ɴ̲ᴏ̲ ̲U̲ɴ̲ɪ̲ᴄ̲ᴏ̲ᴅ̲ᴇ̲ ̲ᴍ̲ᴀ̲ɢ̲ɪ̲ᴄ̲ ̲ʙ̲ᴜ̲ʟ̲ʟ̲ᴇ̲ᴛ̲ ̲ 」
いくつかのデフォルトを変更するだけで、スムーズに進むというわけではありません。PERL_UNICODE
を に設定してを実行するのは事実"SA"
ですが、それだけです。しかも、それも主にコマンドラインでの操作です。実際の作業では、上記で概説した多くの手順をすべて実行し、非常に**非常に**慎重に実行します。