web-dev-qa-db-ja.com

UTF8 vs. UTF16 vs. char * vs.何?誰かが私にこの混乱を説明します!

私はこのマルチバイト文字をほとんど無視することができましたが、今度はUI作業を行う必要があり、この分野での私の無知が追いつくことを知っています!アプリケーションをローカライズするために知っておくべきことを、数段落以内で誰かが説明できますか?どのタイプを使用する必要がありますか(.NetとC/C++の両方を使用しており、UnixとWindowsの両方でこの回答が必要です)。

33
dicroce

Joel Spolskyのすべてのソフトウェア開発者が絶対に、Unicodeと文字セットについて絶対に知っておく必要があります(言い訳はありません!)

EDIT 20140523:また、文字、記号、Unicodeの奇跡YouTubeのTom Scottによる-10分弱で、UTF-8である素晴らしい「ハック」の素晴らしい説明

76
Dylan Beattie

文字エンコーディングは、それぞれが特定の文字セットからシンボルを検索する一連のコードで構成されます。 文字エンコードに関するウィキペディア に関するこの良い記事を参照してください。

TF8(UCS)は、各シンボルに1〜4バイトを使用します。 Wikipedia は、マルチバイトランダウンがどのように機能するかについての適切な要約を提供します。

  • 1バイト文字の最上位ビットは常に0です。
  • マルチバイトシーケンスの最初のバイトの最上位ビットによって、シーケンスの長さが決まります。これらの最上位ビットは、2バイトシーケンスの場合は110です。 3バイトシーケンスの場合は1110など。
  • マルチバイトシーケンスの残りのバイトは、2つの最上位ビットとして10を持ちます。
  • UTF-8ストリームには、バイトFEもFFも含まれていません。これにより、UTF-8ストリームがU + FEFF(バイトオーダーマーク)で始まるUTF-16ストリームのように見えないようになります。

このページには、各文字エンコードタイプの長所と短所の優れた比較も示されています。

UTF16(UCS2)

シンボルごとに2バイトから4バイトを使用します。

UTF32(UCS4)

シンボルごとに常に4バイトを使用します。

charは、データの1バイトを意味し、実際のエンコーディングではありません。これはUTF8/UTF16/asciiに類似していません。 char *ポインターは、任意のタイプのデータと任意のエンコードを参照できます。

STL:

Stlのstd :: wstringとstd :: stringはどちらも、UTF-8やUTF-16などの可変長文字エンコーディング用に設計されていません。

実装方法:

Iconvライブラリを見てください。 iconv は、次のようなプロジェクトで使用される強力な文字エンコード変換ライブラリです libxml (GnomeのXML Cパーサー)

文字エンコードに関するその他の優れたリソース:

25
Brian R. Bondy

一般通念 は、Spolskyの記事がいくつかの重要な点を見逃していることを示唆しています。

この記事はより完全なものとして推奨されています: nicode®標準:技術紹介

この記事も良い紹介です: nicode Basics

特に後者は、Unicodeの文字エンコード形式とスキームの概要を示しています。

12
mmalc

さまざまなUTF標準は、「コードポイント」をエンコードする方法です。コードポイントは、Unicode文字セットへのインデックスです。

もう1つのエンコーディングはUCS2で、これは常に16ビットであるため、Unicodeの全範囲をサポートしていません。

また、1つのコードポイントが1文字と等しくないことも知っておくとよいでしょう。たとえば、åなどの文字は、コードポイントとして、または1つはa用、もう1つはリング用の2つのコードポイントとして表すことができます。

したがって、2つのUnicode文字列を比較するには、比較する前に正規表現を取得するために正規化する必要があります。

4
John Nilsson

フォントにも問題があります。フォントを処理する方法は2つあります。必要なすべてのUnicode文字にグリフ付きの巨大なフォントを使用するか(最近のバージョンのWindowsにはそのようなフォントが1つまたは2つ付属していると思います)。または、Unicode標準のサブセット専用のさまざまなフォントのグリフを組み合わせることができるsomライブラリを使用します。

1
John Nilsson