UTF-16leやUTF-8など、さまざまな Unicode エンコーディングでは、1 文字が 2 バイトまたは 3 バイトを占める場合があります。多くの Unicode アプリケーションは、Unicode 文字がすべてラテン文字であるように、Unicode 文字の表示幅を考慮しません。たとえば、80列のテキストでは、1 行に40 個の漢字または80 個のラテン文字を含める必要がありますが、ほとんどのアプリケーション (Eclipse、Notepad++、およびすべてのよく知られているテキスト エディターなど、良い例外があれば敢えて) をカウントするだけです。各漢字をラテン文字として 1 幅として。これは確かに結果のフォーマットを醜く、整列させません。
たとえば、タブ幅が 8 の場合、次のように醜い結果が得られます (すべての Unicode を 1 表示幅としてカウントします)。
apple 10
banana 7
苹果 6
猕猴桃 31
pear 16
ただし、予想される形式は次のとおりです (各漢字を 2 幅としてカウントします)。
apple 10
banana 7
苹果 6
猕猴桃 31
pear 16
文字の表示幅の計算が不適切なため、これらのエディターは、タブの配置、行の折り返し、段落の再フォーマットを行うときにまったく役に立たなくなります。
ただし、文字の幅はフォントによって異なる場合がありますが、固定サイズの端末フォントのすべての場合、漢字は常に倍幅です。つまり、フォントに関係なく、各漢字は 2 幅で表示することが望ましいということです。
解決策の 1 つは、エンコーディングをGB2312に変換することで正しい幅を取得できることです。GB2312エンコーディングでは、各漢字が 2 バイトかかります。ただし、一部の Unicode 文字は GB2312 文字セット (またはGBK文字セット)には存在しません。また、一般に、エンコードされたサイズ (バイト単位) から表示幅を計算することはお勧めできません。
Unicode の ( \u0080
.. \uFFFF
) の範囲内のすべての文字を単純に 2 幅として計算することも正しくありません。これは、範囲内に 1 幅の文字が多数散在しているためです。
また、アラビア文字や韓国語の文字は、任意の数の Unicode コード ポイントで単語/文字を構成するため、表示幅を計算するのも困難です。
そのため、Unicode コード ポイントの表示幅は整数ではない可能性がありますが、それで問題ないと思います。実際には、整数に固定することができます。少なくとも、何もないよりはましです。
では、Unicode 標準の char の優先表示幅に関連する属性はありますか? または、表示幅を計算する Java ライブラリ関数はありますか?