nuits.jp blog

C#, Xamarin, WPFを中心に書いています。Microsoft MVP for Development Technologies。

全角・半角判定ライブラリ EastAsianWidthDotNet をリリースしました

Unicode文字列の全角・半角を判定し、文字列の幅を取得するライブラリ「EastAsianWidthDotNet 」をNuGetに公開しました

github.com

こんな感じで呼び出すと…

using  EastAsianWidthDotNet;

...
var width = "全角.".GetWidth();
Console.WriteLine($"Width is {width}.");

f:id:nuitsjp:20200517071726p:plain

全角・半角を考慮した文字列幅が取得されます。

なぜこんなものを新ためて作ったかというと、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へ連絡ください。