Open棟梁Project - マイクロソフト系技術情報 Wiki

[[戻る>文字コード]]

* 目次 [#m402c4a9]
#contents

*概要 [#e675a56e]

*文字のチェック [#p010ee67]
文字チェックは、文字化けを事前に防ぐために行われる。

以下の文字チェック・ルーチンが一般的である。

**エンコード後、範囲チェック [#v36f5f1c]

***JIS第1第2水準漢字チェック [#b1013d54]

-仕様:~
以下は、Open棟梁に実装されているJIS第1第2水準漢字チェック部品の仕様。
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で追加された文字をチェックする。
--実装:~
Unicodeのみに存在し、コード範囲もバラバラなので、~
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文字列を比較し=か?をチェックする。


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS