3

私の問題は単純です。Perl スクリプトで UTF-8 を出力したいと考えています。このコードは機能していません。

use utf8;
open(TROIS,">utf8.out.2.txt");
binmode(TROIS, ":utf8");
print TROIS "Hello\n";         

出力ファイルは UTF-8 ではありません。(私のファイル スクリプトは UTF-8 でコーディングされています) しかし、アクセント記号付きの文字を に挿入するprintと、機能し、出力ファイルは UTF-8 になります。例:

print TROIS "é\n";

Windows で ActivePerl 5.10 を使用しています。何が問題なのですか?

4

1 に答える 1

10

でASCII文字しか書いていませんHello\n。幸いなことに、ASCII は依然として完全に有効な UTF-8 です。ただし、エディタによる自動検出では、ファイル コンテンツのエンコーディングを判断するものが何もないため、エンコーディングとして UTF-8 が表示されない可能性が高くなります。ファイルエンコーディングがどのように機能するかを知らないだけだと思います。

ファイルのエンコーディングは、一般に、ファイル内またはファイルと一緒に外部的に保存されないプロパティです。多くのエディターは、実行しているオペレーティング システムまたは環境設定 (システム言語) に基づいて特定のエンコーディングを単純に想定するか、何らかのセミインテリジェントな自動検出機能を組み込んでいます (ファイル エンコーディングを自動検出できないため、それでも失敗する可能性があります)。明確に検出されます)。binmodeそのため、または対応する I/O 層でファイルを読み取るときに、ファイルが UTF-8 でエンコードされていることを Perl に伝える必要があります。

エンコーディングが UTF ファミリー (UTF-8、UTF-16 LE および BE、UTF-32 LE および BE) の 1 つである場合、テキスト ファイルのエンコーディングをマークする方法が 1 つあります。その方法はBOM (バイト オーダー マーク)と呼ばれます。ただし、BOM 付きのファイルの作成は、UTF-8 が今日ほど広く普及していなかった時代に始まりました。通常、特にエディターやアプリケーションが一般的に BOM をまったくサポートしていないため、解決できるよりも多くの異なる問題を引き起こします。したがって、今日では BOM はおそらく避けるべきです。

もちろん、ファイルのエンコーディングを示す特定の指示がファイル形式に含まれている例外もあります。XML はそのDOCTYPE宣言で頭に浮かびます。DOCTYPEただし、そのようなファイルの場合でも、ファイルの宣言を解析するために、ファイルが常に 1 文字あたり少なくとも 2 バイトを使用するマルチバイト エンコーディング (UTF-16/UTF-32) でエンコードされているかどうかを認識する必要があります。最初の場所。それは単に単純ではありません;)

于 2012-12-14T09:14:54.197 に答える