2012年12月27日木曜日

string.Length は文字数ではなく char の数

string.Length は char の数 を取得します。
UTF-16 では、1文字を 2バイトまたは4バイトであらわすので、文字列中に 1文字が 4バイトの文字がある場合、Lengthは 文字数になりません。
このような文字列の文字数を取得するには、StringInfo.LengthInTextElements を使います。

また、部分文字列の取得も、「n文字目からm文字・・ 」などで指定する場合は、string.Substring ではなく、StringInfo.SubstringByTextElements を使います。

サンプルプログラムは、入力した文字列の 文字数(StringInfo.LengthInTextElements) と char数(string.Substring) と、各文字の文字コード(UTF-16)を表示します。




MainWindow.xaml

<Window x:Class="StringInfoTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="350" Width="425">
    <DockPanel LastChildFill="True">
        <TextBox Name="textBox1" DockPanel.Dock="Top"/>
        <Button Click="Button_Click_1" DockPanel.Dock="Top">更新</Button>
        <TextBlock Name="textBlock1" DockPanel.Dock="Top"/>
    </DockPanel>
</Window>

MainWindow.xaml.cs

using System.Globalization;
using System.Windows;

namespace StringInfoTest
{
    public partial class MainWindow Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            string text = this.textBox1.Text;

            StringInfo stringInfo = new StringInfo(text);
            string charCode = "";
            for (int i = 0; i < stringInfo.LengthInTextElements; i++)
            {
                string token = stringInfo.SubstringByTextElements(i, 1);
                charCode += "\n" + token + " : ";
                for (int j = 0; j < token.Length; j++)
                {
                    charCode += " " + ((int)token[j]).ToString("X4");
                }
            }

            this.textBlock1.Text =                  "StringInfo.LengthInTextElements = " + stringInfo.LengthInTextElements +
                "\nstring.Length = " + text.Length +
                "\n" + charCode;
        }
    }
}

0 件のコメント:

コメントを投稿