- - PR -
サロゲートペアの文字数カウント
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-04-16 00:35
現在、Vista上のVisual Studio 2005 C#で開発しています。
丈という字の右上に点が付いた字があります。 IME2007のIMEパッドで「部首」の「一」の中の一番最後から 2番目の文字です。internetで調べると、サロゲートペアに 該当する文字だそうです。 この文字をStringに代入して、str.Length()とすると、2という 値が返ってきます。また、UnicodeEncodingのGetByteCount() では、4という値になります。 正しくは、文字数は1ですし、バイト数は3?だと思います。 この正しい情報を返す方法をご存知の方、お助けください。 よろしくお願いします。 | ||||||||
|
投稿日時: 2007-04-16 01:20
StringクラスのLengthプロパティはヘルプで概要だけを読むと 単純に文字数だと思ってしまいがちですが、解説に以下のようにあります。 > Length プロパティは、このインスタンス内の Char オブジェクトの数を返します。 > Unicode 文字の数ではありません。これは、1 つの Unicode 文字が複数の Char で > 表されることがあるためです。おのおのの Char ではなくおのおのの Unicode 文字 > を対象に処理を行うには、System.Globalization.StringInfo クラスを使用します またバイト数はUnicode(UTF-16)の2文字分なので、4バイトで正しいです。
ヘルプによると、 System.Globalization.StringInfoクラスのLengthInTextElementsプロパティ が文字数の取得に使えそうです。 残念ながら、私は使ったことがないので、はずしていたらごめんなさい。 <修正> 2文字文→2文字分 </修正> [ メッセージ編集済み 編集者: よねKEN 編集日時 2007-04-16 09:20 ] | ||||||||
|
投稿日時: 2007-04-16 07:01
よねKEN様、ご回答ありがとうございました。
System.Globalization.StringInfoの存在を知りませんでしたので 大変に参考になりました。確かに、これを使用すると1文字という 値を取得することができました。ありがとうございました。 ところで、この文字の内部的な使用バイト数は4なのでしょうか? encode.GetByteCount( sinfo.String )とすると、4という値が返って きます。 ご存じの方、よろしくお願いします。 | ||||||||
|
投稿日時: 2007-04-16 08:46
というか、なぜ3バイトであると思ったのか知りたいです。 Unicode(=UTF-16)は16ビット(=2バイト)で1コードをあらわします。 サロゲートペアの場合上位サロゲートと下位サロゲートをあらわすコードが 2つ必要になります。よって 上位サロゲート+下位サロゲート=2バイト+2バイト=4バイト となるわけで、1コードが2バイトなので3バイトという中途半端な値にはなりません。 [ メッセージ編集済み 編集者: Blue 編集日時 2007-04-16 08:47 ] | ||||||||
|
投稿日時: 2007-04-17 00:10
Blue様
ご説明ありがとうございました。 はっきりではありませんが、なんとなく理解できたと思います。 |
1