質問

ほぼ5年前、ジョエル・スポルスキーはこの記事を書きました。 「すべてのソフトウェア開発者が絶対に、積極的に Unicode と文字セットについて知っておくべき絶対最低限のこと (言い訳はできません!)」.

多くの人と同じように、私もこの本を注意深く読み、この「ASCII の代替品」を理解する時期が来たと悟りました。残念ながら、5 年が経ち、この分野でいくつかの悪い習慣に戻ってしまったように感じます。ありますか?

私は特に国際的なアプリケーションをあまり作成しませんが、多くの ASP.NET インターネット向け Web サイトの構築を支援してきたので、それは言い訳にはならないと思います。

そこで、私 (そして他の多くの人たちもそう信じています) のために、以下について人々から意見を得ることができますか。

  • ASCIIを完全に「克服」する方法
  • Unicode を使用する場合の基本的なガイダンス。
  • Unicode に関する推奨される (最近の) 書籍と Web サイト (開発者向け)。
  • Unicode の現状 (Joels の記事から 5 年後)
  • 今後の方向性。

正直、私には .NET のバックグラウンドがあるので、.NET Framework の Unicode に関する情報も喜んで提供したいと思います。もちろん、だからといって、異なる背景を持つ人がコメントするのを妨げるものではありません。

アップデート:見る この関連質問 以前StackOverflowでも質問しました。

役に立ちましたか?

解決

Joel の記事やその他の I18n の記事を読んで以来、私は常に自分の文字エンコーディングに細心の注意を払ってきました。そして、それを継続的に行うと実際に効果があります。UTF-8 を使用することが標準であり、誰もがこれを知っている/実行している会社で働いている場合は、うまくいきます。

このテーマに関する (Joel の記事以外の) 興味深い記事をいくつか紹介します。

最初の記事からの引用。Unicode を使用するためのヒント:

  • Unicode を受け入れ、それと争わないでください。おそらくそれが正しい行動であり、そうでないとしても、おそらくそうする必要があるでしょう。
  • ソフトウェア内では、テキストを UTF-8 または UTF-16 として保存します。つまり、2 つのうちの 1 つを選択し、それを使い続けることです。
  • 可能な限り XML を使用して外部とデータを交換します。これにより、潜在的な問題の多くが解消されます。
  • 独自のクライアントを作成するのではなく、アプリケーションをブラウザベースにするようにしてください。ブラウザは世界中のテキストを扱うのが非常に上手になってきています。
  • 他の人のライブラリ コードを使用している場合 (もちろん、あなたもそうしています)、正しいことが証明されるまで、その Unicode 処理が壊れていると想定してください。
  • 検索を行っている場合は、言語や文字の処理の問題を理解できる人に任せるようにしてください。
  • Amazon かどこかに行って、印刷された Unicode 標準の最新版を購入してください。知っておくべきことがすべて含まれています。
  • 時間をかけて Unicode Web サイトを閲覧し、コード チャートがどのように機能するかを学習してください。
  • アジア言語に関する本格的な仕事をしなければならない場合は、Ken Lunde によるこのテーマに関するオライリーの本を購入してください。
  • Macintosh をお持ちの場合は、Lord Pixel の Unicode フォント検査ツールを入手してください。まったくクールだ。
  • どうしてもデータを扱う必要がある場合は、年に 2 回開催される Unicode カンファレンスに参加してください。専門家が全員参加しますので、何を知るべきかわからない場合は、知っている人を見つけることができます。

他のヒント

私はしばらく検索エンジン ソフトウェアを使って作業しました。信じられないほど多くの Web サイトが、ページのエンコーディングに関する嘘をついた HTTP ヘッダーやメタ タグを含むコンテンツを提供しています。多くの場合、ISO-8859 文字と UTF-8 文字の両方が含まれるドキュメントを取得することもあります。

この種の問題をいくつか乗り越えると、生成するデータの適切な文字エンコーディングを真剣に受け止めるようになります。

.NET Framework は文字列の保存に Windows の既定のエンコーディングを使用しますが、これは UTF-16 であることがわかります。ほとんどのテキスト I/O クラスを使用するときにエンコーディングを指定しない場合、BOM なしで UTF-8 を記述し、最初に BOM を確認してから UTF-8 を想定して読み取ることになります (確かにわかっています)。 StreamReader そして StreamWriter これは、BOM を理解できない「愚かな」テキスト エディタにとっては非常に安全ですが、UTF-8 を表示したり、実際に標準 ASCII 範囲外の文字を書いている状況を表示したりする賢いテキスト エディタにとってはちょっと汚いものです。 。

通常、これは目に見えませんが、興味深い方法で頭をもたげることがあります。昨日、私は XML シリアル化を使用して、オブジェクトを文字列にシリアル化する人と一緒に作業していました。 StringWriter, そして、エンコーディングが常に UTF-16 である理由がわかりませんでした。メモリ内の文字列は UTF-16 になり、.NET によって強制されるため、XML シリアル化フレームワークで実行できるのはこれだけです。

そのため、単なる使い捨てツールではないものを作成するときは、BOM 付きの UTF-8 エンコーディングを指定します。技術的には、.NET では常に誤って Unicode を認識しますが、それはユーザーがエンコーディングを UTF-8 として検出することを知っている場合に限られます。

誰かが「どうすれば文字列のバイトを手に入れるの?」と尋ねるのを見るたびに、少し泣きます。そして、提案されたソリューションは使用します Encoding.ASCII.GetBytes() :(

経験則:文字列を変更したり内部を調べたりせず、文字列を厳密にデータの塊として扱うと、はるかに良い結果が得られます。

単語を分割したり、文字列を小文字にしたりするなどの単純なことでも、それを「Unicode の方法」で実行しようとすると、難しくなります。

そして、それを「Unicode 方式」で実行したい場合は、非常に優れたライブラリが必要になります。これは信じられないほど複雑です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top