Unicode文字列の全角・半角を判定し、文字列の幅を取得するライブラリ「EastAsianWidthDotNet 」をNuGetに公開しました。
こんな感じで呼び出すと…
using EastAsianWidthDotNet; ... var width = "全角.".GetWidth(); Console.WriteLine($"Width is {width}.");
全角・半角を考慮した文字列幅が取得されます。
なぜこんなものを新ためて作ったかというと、ConsoleTablesというテキストで表形式の表示を手軽に行うライブラリがあって、非常に便利に使っているのですが、こちら日本語などの全角文字をサポートされていという問題がありました。
ということで、日本語含む、全角文字をサポートするテキストテーブルライブラリを自作するために、まずは全角・半角判定ライブラリを作成しました。
概要
全角・半角の判定は、UnicodeのEAST ASIAN WIDTHに則って判定します。
EAST ASIAN WIDTHという辞書に文字コード別の幅情報が登録されています。ただ、やや扱いが難しい箇所もあって、特に全角・半角が文脈によって変化する「Ambiguous」という種別が存在します。
Ambiguousは、東アジアの場合は全角として、東アジア以外の場合は半角として扱う必要があります。
EastAsianWidthDotNetではCultureInfoによって判断しています。EastAsianWidthDotNetではこちらのロケールを東アジアとして判断しています。
CultureInfoを明示的に指定することもできますが、未指定の場合、CultureInfo.CurrentUICultureが適用されます。
また明示的に東アジアか否か指定することも可能です。
API Reference
以下を参照ください。
多くの場合、stringの拡張メソッド(StringExtensions)を利用することで解決できます。
絵文字の扱いについて
一部の絵文字について適切に判断することができません。たとえば多くのフォントで「⏳」は全角と半角の中間の幅として表示されます。絵文字の幅はフォントに依存するところが多く、フォント別に網羅することが現実的ではありません。
EastAsianWidthDotNetでは、「現時点で」絵文字に対する個別の対応は行っていません。文字幅を気にする箇所では、絵文字を利用することは避けてください。
ただし一部の絵文字(☀など)は、多くの場合扱いが同一ですが、EAST ASIAN WIDTHとの定義と差があります。このような絵文字について、要望が多ければ個別に対応することを検討したいと思います。
その際はIssueへ連絡ください。