/// <summary>
        /// 情報レコード取得(String,Safe)
        /// </summary>
        /// <param name="pMoji">キー文字列</param>
        /// <returns>InfomationRecord</returns>
        /// <remarks>
        /// pMojiに該当する情報を返す。this[pMoji]と違いnullを返さない。
        /// 該当する情報が見つからない場合はキーにpMojiをセットしたInfomationRecordを返す。
        /// </remarks>
        public InfomationRecord GetAtSafe(string pMoji)
        {
            InfomationRecord result = this[pMoji];

            if (result != null)
            {
                return(result);
            }
            return(new InfomationRecord(pMoji));
        }
        /// <summary>
        /// 情報レコード取得(Char,Safe)
        /// </summary>
        /// <param name="pChar">キー文字</param>
        /// <returns>InfomationRecord</returns>
        /// <remarks>
        /// pCharに該当する情報を返す。this[pChar]と違いnullを返さない。
        /// 該当する情報が見つからない場合はキーにpCharをセットしたInfomationRecordを返す。
        /// </remarks>
        public InfomationRecord GetAtSafe(char pChar)
        {
            string           moji   = pChar.ToString();
            InfomationRecord result = this[moji];

            if (result != null)
            {
                return(result);
            }
            return(new InfomationRecord(moji));
        }
        /// <summary>
        /// 定義データ読み込み(TextReader渡し)
        /// </summary>
        /// <param name="pReader">TextReader</param>
        /// <remarks>
        /// 定義データを読み込みインスタンスを初期化する。
        /// </remarks>
        public void Load(TextReader pReader)
        {
            this.items.Clear();
            this.majorVer = 0;
            this.minorVer = 0;

            int dataCount = 0;

            while (true)
            {
                string line = pReader.ReadLine();
                if (line == null)
                {
                    break;
                }
                if ((line.Length == 0) || (line[0] == '#'))
                {
                    continue;
                }

                dataCount++;

                if (dataCount == 1)
                {
                    string[] fields = line.Split('.');

                    this.majorVer = int.Parse(fields[0]);
                    if (majorVer != 1)
                    {
                        throw new InvalidDataException("認識できないデータ(バージョン)");
                    }

                    this.minorVer = int.Parse(fields[1]);

                    continue;
                }

                InfomationRecord rec = this.MakeInformationRecord(line);
                this.items[rec.KeyUnicodeString] = rec;
            }
        }
        static public string DebugStringsDump(CharacterInformation pCharInfo, string pString)
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendLine(pString);

            UTF32Encoding utf32withoutbom = new UTF32Encoding(false, false);

            List <string> characterList = new List <string>(GetOneCharacterEnumerator(pString));

            for (int i = 0; i < characterList.Count; i++)
            {
                string moji = characterList[i];
                sb.AppendFormat("[{0}]:{1}", i + 1, moji);

                byte[] bytetbl = utf32withoutbom.GetBytes(moji);
                for (int j = 0; j < bytetbl.Length; j += 4)
                {
                    if (j == 0)
                    {
                        sb.Append("(U+");
                    }
                    else
                    {
                        sb.Append("+");
                    }
                    sb.AppendFormat("{0:X}", BitConverter.ToInt32(bytetbl, j));
                }
                sb.Append(")");

                InfomationRecord charInfo = pCharInfo[characterList[i]];
                if (charInfo != null)
                {
                    if (charInfo.JISX0213Level != JISX0213Levels.None)
                    {
                        sb.AppendFormat(" {0}", charInfo.JISX0213Level);
                    }

                    if (charInfo.NameType != NameTypes.None)
                    {
                        sb.AppendFormat(" {0}", charInfo.NameType);
                    }

                    if (charInfo.ETaxAvailable)
                    {
                        sb.AppendFormat(" e-Tax");
                    }

                    if (charInfo.GakunenbetuKanji != GakunenbetuKanjis.None)
                    {
                        sb.AppendFormat(" {0}", charInfo.GakunenbetuKanji);
                    }

                    if (charInfo.NISAAvailable)
                    {
                        sb.AppendFormat(" NISA");
                    }

                    if (charInfo.ELTAXAvailable)
                    {
                        sb.AppendFormat(" eLTAX");
                    }
                }

                sb.AppendLine();
            }

            return(sb.ToString());
        }
        /// <summary>
        /// 情報レコード作成
        /// </summary>
        /// <param name="pRecord">レコード文字列</param>
        /// <returns>InfomationRecord</returns>
        private InfomationRecord MakeInformationRecord(string pRecord)
        {
            string[]         fields = pRecord.Split(',');
            InfomationRecord result = new InfomationRecord();

            if (fields.Length < 1)
            {
                throw new InvalidDataException("キーとなるコードポイントが定義されていない");
            }

            do
            {
                // key
                result.SetUnicodeKey(MakeStringFromCodePoints(fields[0]));

                // JISX0213Levels
                if (fields.Length < 2)
                {
                    break;
                }
                string strwk = fields[1].Trim();
                if (strwk.Length >= 1)
                {
                    result.SetJISX0213Level((JISX0213Levels)int.Parse(strwk));
                }

                // NameTypes
                if (fields.Length < 3)
                {
                    break;
                }
                strwk = fields[2].Trim();
                if (strwk.Length >= 1)
                {
                    result.SetNameType((NameTypes)int.Parse(strwk));
                }

                // ETaxAvailable
                if (fields.Length < 4)
                {
                    break;
                }
                strwk = fields[3].Trim();
                if (strwk.Length >= 1)
                {
                    result.SetETaxAvailable(int.Parse(strwk) != 0);
                }

                // GakunenbetuKanji
                if (fields.Length < 5)
                {
                    break;
                }
                strwk = fields[4].Trim();
                if (strwk.Length >= 1)
                {
                    result.SetGakunenbetuKanji((GakunenbetuKanjis)int.Parse(strwk));
                }

                // NISAAvailable
                if (fields.Length < 6)
                {
                    break;
                }
                strwk = fields[5].Trim();
                if (strwk.Length >= 1)
                {
                    result.SetNISAAvailable(int.Parse(strwk) != 0);
                }

                // EELTAXAvailable
                if (fields.Length < 7)
                {
                    break;
                }
                strwk = fields[6].Trim();
                if (strwk.Length >= 1)
                {
                    result.SetELTAXAvailable(int.Parse(strwk) != 0);
                }
            } while (false);

            return(result);
        }