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.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 件のコメント:
コメントを投稿