2008-09-12 12 views
12

ほぼ5年前にJoel Spolskyがこの記事("The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)")を書きました。あなたはまだUnicodeに慣れていますか?

多くの人と同じように、この「ASCIIの置き換え」を把握しなければならないことは非常にわかりました。残念なことに、5年後、私はこの分野のいくつかの悪い習慣に巻き込まれたように感じました。あなたは?

私は多くの特に国際的なアプリケーションを書いていませんが、私は多くのASP.NETインターネットに直面しているウェブサイトを構築するのを手伝ってくれましたので、それは言い訳ではないと思います。私の利益のためにそう

は(と私は多くの人が信じている)私は、次の人々からいくつかの入力を取得することができます。

  • 一度、すべて
  • 基本的な指導のためのASCII「を乗り越える」ためにどのように作業しているときUnicodeで。
  • (最近の)ユニコードに関する書籍とウェブサイト(開発者向け)。
  • 現在のUnicodeの状態(Joelsの記事の5年後)
  • 今後の方向。

私は.NETのバックグラウンドを持っていることを認めなければならないので、.NETフレームワークのUnicodeに関する情報にも満足しています。もちろん、これはコメントとは異なる背景を持つ誰かを止めるべきではありません。

更新:以前にStackOverflowで尋ねられたthis related questionも参照してください。

答えて

9

私はジョエルの記事と他のいくつかの記事を読んで以来、私はいつも私のキャラクターエンコーディングに目を向けました。あなたがそれを一貫して行うなら、それは実際に働きます。あなたがUTF-8を使うのが標準的な会社で働いているなら、誰もがこれを知っている/これはうまくいくでしょう。ここで

テーマに関する興味深い記事(ジョエルの記事以外):

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

  • エンコードのUnicodeは、それと戦わないでください。それはおそらく適切なことであり、もしそうでなければ、どうにかする必要があります。
  • ソフトウェア内には、テキストをUTF-8またはUTF-16として保存します。つまり、2人のうちの1人を選び、それに固執してください。
  • 可能な限りXMLを使用して外界とデータを交換する。潜在的な問題が一掃されます。
  • 独自のクライアントを作成するのではなく、ブラウザベースでアプリケーションを作成してください。ブラウザは世界のテキストを扱うのにかなり良い状態になっています。
  • 他の人のライブラリコードを使用している場合(そしてもちろんあなたがいる場合)は、正しいことが証明されるまで、そのUnicode処理が壊れていると仮定します。
  • 検索を行っている場合は、言語や文字の処理に関する問題を、理解している人に伝えてみてください。
  • Amazonや他の場所に行って、印刷されたUnicode標準の最新版を購入してください。それはあなたが知る必要があるすべてをかなりよく含んでいます。
  • しばらく時間をかけて、Unicode Webサイトを覗いてコードチャートの仕組みを学んでください。
  • アジア言語で深刻な作業をする必要がある場合は、Ken Lundeの件名でO'Reillyの本を購入してください。
  • Macintoshをお持ちの場合は、実行してLord PixelのUnicodeフォント検査ツールを入手してください。完全に冷たい。
  • 実際にデータをダウンして汚れていなければならない場合は、2年に一度のユニコード会議に参加してください。すべての専門家が行って、あなたが知る必要があることが分からなければ、知っている誰かを見つけることができます。
+0

優れたリンクとフィードバック。 – Ash

4

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

これらの問題のいくつかを克服したら、本当に真剣に作り出すデータの適切な文字エンコーディングを開始します。

2

大まかなルール:文字列の中を迷子にしたり、文字列の中を見ることなく、厳密にデータのまとまりとして扱うことができない場合は、はるかに良いでしょう。

単語を分割したり、文字列を小文字にするなど、単純な操作を行っても、「Unicode方法」を実行したい場合は難しくなります。

"Unicodeのやり方"をしたい場合は、非常に良いライブラリが必要です。このことは信じられないほど複雑です。

+0

ASCIIを使用しているので英語のように大文字でも大文字でも意味があります。 – Arafangion

+0

大文字と小文字を区別することは、Win32のAPI関数 'CharUpper'でさえ間違っていることを認めているだけで、' LCMapString'を使うのは難しいです。 –

3

.NET Frameworkでは、文字列を格納するためにWindowsのデフォルトのエンコーディングが使用されます。これはUTF-16になります。ほとんどのテキストI/Oクラスを使用するときにエンコーディングを指定しないと、BOMを持たないUTF-8を作成し、まずBOMをチェックしてUTF-8を仮定して読み込みます(StreamReaderStreamWriterがこれをこれは、BOMを理解できない "ダム"のテキストエディタにとっては大変安全ですが、UTF-8を表示できるよりスマートなものや、実際に標準のASCII範囲外の文字を書いている状況ではひどいです。

通常、これは見えませんが、面白い方法で頭を後ろにすることができます。昨日私はStringWriterを使用してオブジェクトを文字列にシリアル化するためにXMLシリアル化を使用していた人物と仕事をしていましたが、エンコーディングが常にUTF-16である理由を理解できませんでした。メモリ内の文字列はUTF-16になり、.NETによって強制されるため、これがXMLシリアル化フレームワークで可能なのはこれだけです。

私は単なるツールではないものを書くときに、BOMでUTF-8エンコーディングを指定します。技術的には、.NETではUTF-8としてエンコーディングを検出することをユーザーが知っている場合に限り、常にUnicode対応であることが偶然になります。

誰かが「文字列のバイトをどうやって得るのですか?」と尋ねるたびに、私は少し泣きます。推奨ソリューションではEncoding.ASCII.GetBytes()を使用しています。(

関連する問題