- 追加された行はこの色です。
- 削除された行はこの色です。
[[Open棟梁Project>http://opentouryo.osscons.jp/]] - [[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]
-[[戻る>文字コード]]
* 目次 [#m402c4a9]
#contents
*概要 [#e675a56e]
*文字のチェック [#p010ee67]
文字チェックは、文字化けを事前に防ぐために行われる。
以下の文字チェック・ルーチンが一般的である。
**エンコード後、範囲チェック [#v36f5f1c]
***JIS第1第2水準漢字チェック [#b1013d54]
-仕様:~
JIS第1第2水準漢字をチェックする
-実装:~
シフトJISのコード範囲でチェックを行う必要があるので、~
一文字づつシフトJISにエンコード、数値型に変換し範囲チェックを行う。~
-サンプルコード:
--JISX0208_1983Checker~
https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/C%23/Frameworks/Infrastructure/Business/Str/JISX0208_1983Checker.cs
//**********************************************************************************
//* 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の外字範囲チェック [#x1bfc0d5]
-仕様:~
Unicodeの外字範囲をチェックする。
--BMP領域 U+E000‐U+F8FF (6,400字)
--15面 U+F0000‐U+FFFFD (65,534字)
--16面 U+100000‐U+10FFFD (65,534字)
--余談:シフトJISの外字範囲:U+E000~U+E757(0xF040~0xF9FC)。
-実装:
--一文字づつUnicode数値に変換し範囲チェックを行う。
--Java、.NETの文字列はUnicodeのためUnicodeの範囲チェックは、~
以下の様なコードで簡単にチェックできる。~
(Unicode?JIS X 0221?各国の工業規格で使用されるか?)~
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の外字でない。
}
}
**個別チェック [#w00408c7]
コード表で連続しない文字をチェックする。
***JIS2004チェック [#p7818a59]
***[[JIS2004>JIS2004関連]]チェック [#p7818a59]
-追加文字チェック
--仕様:~
JIS2004で追加された文字をチェックする。
[[JIS2004>JIS2004関連]]で追加された文字をチェックする。
--実装:~
Unicodeのみに存在し、コード範囲もバラバラなので、~
JIS2004追加文字配列を初期化し、一文字づつ、比較処理を行う。
[[JIS2004>JIS2004関連]]追加文字配列を初期化し、一文字づつ、比較処理を行う。
-サロゲートペア文字チェック
--仕様:JIS2004で追加されたサロゲートペア文字をチェックする。
--仕様:[[JIS2004>JIS2004関連]]で追加されたサロゲートペア文字をチェックする。
--実装:
---char.IsSurrogate()メソッドを使用する。~
---正規表現を使用する。以下サンプル・コード。~
//ここに判定する文字列を入れる。
string strSurrogatesPair = textBox1.Text;
Regex rg = new Regex("^[^\uD800-\uDBFF\uDC00-\uDFFF]+$");
//サロゲート ペア文字が文字列中に含まれているか
//Regex.IsMatch() メソッド判定
if ( rg.IsMatch( strSurrogatesPair ) )
{
// サロゲートペア文字が含まれていない。
}
else
{
// サロゲートペア文字が含まれている。
}
// 結合文字はチェックできない。
-結合文字チェック
--現状、ハッキリした方法が無い。
---サロゲートペアや結合文字が含まれているか調べる .NET Tips C#, VB.NET~
http://dobon.net/vb/dotnet/string/issurrogatepair.html#section4~
結合文字が含まれているか調べる~
>ただし、Marksカテゴリにすべての結合文字が含まれているか、~
そして、結合文字以外の文字が一切含まれていないかについては、はっきりしていません。
-サンプルコード:
--JIS2k4Checker~
https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/C%23/Frameworks/Infrastructure/Public/Str/JIS2k4Checker.cs
**エンコーディングを使用したチェック [#s9e7f29f]
特定のエンコーディングの
-コードページ範囲内の文字であるか?
-Unicodeからの双方向のエンコーディングか可能か?
をチェックできる。
***例:MS932の範囲内であるか?のチェック [#nf743037]
-以下のようにエンコーディングを行う。~
++①Unicode文字列
++→MS932エンコーディング
++→②MS932文字列(バイト配列)
++→MS932デコーディング++→③Unicode文字列
-上記の結果から、~
①Unicode文字列と、③Unicode文字列を比較し=か?をチェックする。