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); }
エンコーディングを使用して可逆チェックをする。
特定のエンコーディングの
をチェックできる。