@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

サロゲートペアの文字数カウント

1
投稿者投稿内容
にー
常連さん
会議室デビュー日: 2006/04/30
投稿数: 35
投稿日時: 2007-04-16 00:35
現在、Vista上のVisual Studio 2005 C#で開発しています。

丈という字の右上に点が付いた字があります。
IME2007のIMEパッドで「部首」の「一」の中の一番最後から
2番目の文字です。internetで調べると、サロゲートペアに
該当する文字だそうです。

この文字をStringに代入して、str.Length()とすると、2という
値が返ってきます。また、UnicodeEncodingのGetByteCount()
では、4という値になります。

正しくは、文字数は1ですし、バイト数は3?だと思います。
この正しい情報を返す方法をご存知の方、お助けください。

よろしくお願いします。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2007-04-16 01:20
引用:

にーさんの書き込み (2007-04-16 00:35) より:
現在、Vista上のVisual Studio 2005 C#で開発しています。

丈という字の右上に点が付いた字があります。
IME2007のIMEパッドで「部首」の「一」の中の一番最後から
2番目の文字です。internetで調べると、サロゲートペアに
該当する文字だそうです。

この文字をStringに代入して、str.Length()とすると、2という
値が返ってきます。また、UnicodeEncodingのGetByteCount()
では、4という値になります。



StringクラスのLengthプロパティはヘルプで概要だけを読むと
単純に文字数だと思ってしまいがちですが、解説に以下のようにあります。

> Length プロパティは、このインスタンス内の Char オブジェクトの数を返します。
> Unicode 文字の数ではありません。これは、1 つの Unicode 文字が複数の Char で
> 表されることがあるためです。おのおのの Char ではなくおのおのの Unicode 文字
> を対象に処理を行うには、System.Globalization.StringInfo クラスを使用します

またバイト数はUnicode(UTF-16)の2文字分なので、4バイトで正しいです。

引用:

正しくは、文字数は1ですし、バイト数は3?だと思います。
この正しい情報を返す方法をご存知の方、お助けください。



ヘルプによると、
System.Globalization.StringInfoクラスのLengthInTextElementsプロパティ
が文字数の取得に使えそうです。

残念ながら、私は使ったことがないので、はずしていたらごめんなさい。

<修正>
2文字文→2文字分
</修正>

[ メッセージ編集済み 編集者: よねKEN 編集日時 2007-04-16 09:20 ]
にー
常連さん
会議室デビュー日: 2006/04/30
投稿数: 35
投稿日時: 2007-04-16 07:01
よねKEN様、ご回答ありがとうございました。
System.Globalization.StringInfoの存在を知りませんでしたので
大変に参考になりました。確かに、これを使用すると1文字という
値を取得することができました。ありがとうございました。

ところで、この文字の内部的な使用バイト数は4なのでしょうか?
encode.GetByteCount( sinfo.String )とすると、4という値が返って
きます。

ご存じの方、よろしくお願いします。
Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2007-04-16 08:46
引用:

にーさんの書き込み (2007-04-16 07:01) より:
ところで、この文字の内部的な使用バイト数は4なのでしょうか?
encode.GetByteCount( sinfo.String )とすると、4という値が返って
きます。


というか、なぜ3バイトであると思ったのか知りたいです。

Unicode(=UTF-16)は16ビット(=2バイト)で1コードをあらわします。
サロゲートペアの場合上位サロゲートと下位サロゲートをあらわすコードが
2つ必要になります。よって

上位サロゲート+下位サロゲート=2バイト+2バイト=4バイト

となるわけで、1コードが2バイトなので3バイトという中途半端な値にはなりません。

[ メッセージ編集済み 編集者: Blue 編集日時 2007-04-16 08:47 ]
にー
常連さん
会議室デビュー日: 2006/04/30
投稿数: 35
投稿日時: 2007-04-17 00:10
Blue様

ご説明ありがとうございました。
はっきりではありませんが、なんとなく理解できたと思います。
1

アイティメディアの提供サービス

ホワイトペーパー(TechTargetジャパン/閲覧には会員登録が必要です)

スキルアップ/キャリアアップ(JOB@IT)