|
.NET TIPS 文字数を正確にカウントするには?(サロゲート文字対応)[C#、VB]デジタルアドバンテージ 一色 政彦2008/04/03 |
![]() |
|
|
|
文字列の長さを取得する場合、基本的には「TIPS:文字列の長さを取得するには?」で紹介しているように、文字列オブジェクト(=System名前空間のStringクラスのオブジェクト)のLengthプロパティを利用すればよい。
しかし、「文字列の長さ」と「文字数」は必ずしも一致しない可能性がある。というのも、Windows Vistaの登場などにより、Unicodeのサロゲート文字が(エンド・ユーザーにより)入力される可能性が出てきているからだ。
サロゲート文字(もしくはサロゲート・ペア文字)とは、通常「1文字=2bytes」のところが、「1文字=4bytes」となることがある文字のことだ。そのような「1文字=4bytes」のサロゲート文字の「文字列の長さ」を、先ほどのLengthプロパティを使って取得すると、「2」になる。正確な文字数は「1」なのに、文字列の長さは「2」と判定されてしまうのだ。
そこで本稿では(サロゲート文字を考慮して)正確な文字数を取得する方法を紹介する。
文字数を取得する方法(.NET Framework 2.0以降)
文字数を取得するには、StringInfoオブジェクト(=System.Globalization名前空間のStringInfoクラスのオブジェクト)のLengthInTextElementsプロパティを使用すればよい。StringInfoオブジェクトは、パラメータに文字列を指定してStringInfoクラスのコンストラクタを呼び出せば取得できる。
ただし、このLengthInTextElementsプロパティは.NET Framework 2.0以降でしか利用できない。.NET Framework 1.xで文字数を取得する方法は本TIPS後半で説明する。
次のコードは、「
る」という文字列の文字数を取得するコンソール・アプリケーションのサンプル・プログラムである。
|
||
| 文字数を取得するコンソール・アプリケーションのサンプル・プログラム【.NET Framework 2.0以降】(上:C#、下:VB) |
文字数を取得する方法(.NET Framework 1.x以降)
続いて.NET Framework 1.xで文字数を取得する場合だが、先ほどのコード内にあるStringInfoオブジェクトのLengthInTextElementsプロパティの呼び出しを、(本TIPSで紹介する)GetLengthInTextElementsメソッドの呼び出しに置き換えるだけだ。GetLengthInTextElementsメソッドは、パラメータに文字列を渡すと、戻り値で文字数を返す。
次のコードは実際にGetLengthInTextElementsメソッドを使用したコンソール・アプリケーションのサンプル・プログラムである。
|
||
| 文字数を取得するコンソール・アプリケーションのサンプル・プログラム【.NET Framework 1.x以降】(上:C#、下:VB) |
GetLengthInTextElementsメソッドの内部では、StringInfoクラスの静的メソッドParseCombiningCharactersを呼び出している。ParseCombiningCharactersメソッドは、1文字(制御文字やサロゲート文字を含む)ごとの、(文字列中の)インデックス番号をint/Integer型の配列で返す。従って、この配列の長さ(Lengthプロパティ)を調べれば正確な文字数が判明する。
ちなみに、文字数ではなく、文字列のバイト数を取得する方法は、「TIPS:文字列のバイト数を取得するには?」を参照してほしい。![]()
| カテゴリ:クラス・ライブラリ 処理対象:文字列 使用ライブラリ:StringInfoクラス(System.Globalization名前空間) 関連TIPS:文字列の長さを取得するには? 関連TIPS:文字列のバイト数を取得するには? |
|
||||||||||||||||||||||||||||
| 「.NET TIPS」 |
TechTargetジャパン
- 新人プログラマーのためのInsider.NETの歩き方 2012 (2012/5/22)
晴れて.NETプログラマーとなる新人が効率的に開発技術を習得するには? 大量にある記事群の中から新人が読むべきお勧めを厳選して紹介 - jQuery MobileでJavaScriptプログラミング (2012/5/17)
jQuery Mobileは手軽なだけでなく、JavaScriptのAPIも充実しており、独自機能の実装もできる。今回は「グローバル設定」と「イベント」を解説 - Windows上で開発するための開発環境構築入門 (2012/5/16)
Windowsを使ってチームで開発している? なのにサーバOSを設定・運用した経験がない? そうなら、今すぐ学ぼう - 「コントラクト」でアプリのサンドボックスを乗り越える! (2012/5/11)
Metroスタイル・アプリはサンドボックスの中で動作する。それを乗り越えてほかのアプリと連携する仕組み「コントラクト」を解説
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -


