Open棟梁Project - マイクロソフト系技術情報 Wiki
文字チェックは、文字化け等を事前に防ぐために行われる。
以下の文字チェック・ルーチンが一般的である。
JIS第1第2水準漢字をチェックする
シフトJISのコード範囲でチェックを行う必要があるので、
一文字づつシフトJISにエンコード、数値型に変換し範囲チェックを行う。
//********************************************************************************** //* All Rights Reserved, Copyright (C) 2007,2012 Hitachi Solutions,Ltd. //********************************************************************************** //********************************************************************************** //* クラス名 :JISX0208_1983Checker //* クラス日本語名 :JIS X 0208-1983文字コード範囲チェック・クラス //* ・01~08区:記号、英数字、かな //* ・16~47区:JIS第1水準漢字 //* ・48~84区:JIS第2水準漢字 //* ※JIS X 0208-1990で追加された「凜[7425]」「熙[7426]」は含まれない //* ※NEC機種依存文字、NECのIBM拡張文字、IBM拡張文字は含まれない
Unicodeの外字範囲をチェックする。
string from = "文字列を初期化する。"
StringBuilder to = new StringBuilder();
foreach (char c in from)
{
int charCode = (int)c;
if (57344 <= charCode && charCode <= 63743)
{
// Unicodeの外字範囲
// BMP領域 U+E000‐U+F8FF (6,400字)
}
else if (983040 <= charCode && charCode <= 1048573)
{
// Unicodeの外字範囲
// 15面 U+F0000‐U+FFFFD (65,534字)
}
else if (1048576 <= charCode && charCode <= 1114109)
{
// Unicodeの外字範囲
// 16面 U+100000‐U+10FFFD (65,534字)
}
else
{
// Unicodeの外字でない。
}
}コード表で連続しない文字をチェックする。
//ここに判定する文字列を入れる。
string strSurrogatesPair = textBox1.Text;
Regex rg = new Regex("^[^\uD800-\uDBFF\uDC00-\uDFFF]+$");
//サロゲート ペア文字が文字列中に含まれているか
//Regex.IsMatch() メソッド判定
if ( rg.IsMatch( strSurrogatesPair ) )
{
// サロゲートペア文字が含まれていない。
}
else
{
// サロゲートペア文字が含まれている。
}
// 結合文字はチェックできない。//ここに判定する文字列を入れる。
string strSurrogatesPair = textBox1.Text;
//サロゲート ペア文字が文字列中に含まれているか
//char.IsSurrogate()メソッドで判定
int i = 1;
foreach (char ch in strSurrogatesPair.ToCharArray())
{
if(char.IsSurrogate(ch))
{
MessageBox.Show(i.ToString() + "文字目にサロゲート ペア文字が含まれています");
return;
}
else
{
i++;
}
}
MessageBox.Show("サロゲート ペア文字が含まれていません");//ここに判定する文字列を入れる。
string strSurrogatesPair = textBox1.Text;
StringBuilder sb = new StringBuilder();
//サロゲート ペアが文字列中に含まれているか
//char.IsSurrogate()メソッドで判定
foreach (char ch in strSurrogatesPair.ToCharArray())
{
if (char.IsSurrogate(ch))
{
// 破棄
}
else
{
sb.Append(ch);
}
}
textBox1.Text = sb.ToString();※ 前者は、存在チェックのみ、
後者は、文字の位置まで特定可能(∴削除も可能。)。
※ また、上記の方法では、結合文字はチェックできない。
ただし、Marksカテゴリにすべての結合文字が含まれているか、
そして、結合文字以外の文字が一切含まれていないかについては、はっきりしていません。
サロゲート ペア文字・結合文字は、
サロゲート ペア文字・結合文字を含む文字列の見た目の文字列長を調べる場合は、
/// <summary>文字列情報の表示</summary>
/// <param name="strSurrogatesPair">文字列</param>
private void GetStringInfo(string strSurrogatesPair)
{
// System.Globalization.StringInfoを使用する。
StringInfo si = new StringInfo(strSurrogatesPair);
// 文字列を表示
MessageBox.Show(strSurrogatesPair);
// 長さを表示1
MessageBox.Show("長さ(文字列長1):" + strSurrogatesPair.Length);
// 長さを表示2
MessageBox.Show("長さ(文字列長2):" + si.LengthInTextElements);
// 長さを表示3
MessageBox.Show("長さ(プログラム中(UTF-16)でのバイト長):" +
Encoding.Unicode.GetBytes(strSurrogatesPair).Length);
}
特定のエンコーディングの
をチェックできる。