示例#1
0
        private static void ReadCjkRadicalInfo(BinaryReader reader, out CjkRadicalData value)
        {
            char tr;
            char tc;

            tr = (char)reader.ReadUInt16();
            tc = (char)reader.ReadUInt16();

            value = (tr & 0x8000) == 0 ?
                    new CjkRadicalData(tr, tc) :
                    new CjkRadicalData((char)(tr & 0x7FFF), tc, (char)reader.ReadUInt16(), (char)reader.ReadUInt16());
        }
示例#2
0
        internal static void ReadFromStream(Stream stream, out Version unicodeVersion, out UnicodeCharacterData[] unicodeCharacterData, out UnihanCharacterData[] unihanCharacterData, out CjkRadicalData[] radicals, out UnicodeBlock[] blocks, out int maxContiguousIndex)
        {
            using (var reader = new BinaryReader(stream, Encoding.UTF8))
            {
                int i;

                if (reader.ReadByte() != 'U'
                    | reader.ReadByte() != 'C'
                    | reader.ReadByte() != 'D')
                {
                    throw new InvalidDataException();
                }

                byte formatVersion = reader.ReadByte();

                if (formatVersion != 2)
                {
                    throw new InvalidDataException();
                }

                var fileUnicodeVersion = new Version(reader.ReadUInt16(), reader.ReadByte(), reader.ReadByte());

                var    unicodeCharacterDataEntries = new UnicodeCharacterData[ReadCodePoint(reader)];              // Allocate one extra entry to act as a dummy entry.
                byte[] nameBuffer = new byte[128];
                int    mci        = 0;

                for (i = 0; i < unicodeCharacterDataEntries.Length; ++i)
                {
                    ReadUnicodeCharacterDataEntry(reader, nameBuffer, out unicodeCharacterDataEntries[i]);
                    if (unicodeCharacterDataEntries[i].CodePointRange.Contains(i))
                    {
                        mci = i;
                    }
                    else
                    {
                        ++i;
                        break;
                    }
                }

                maxContiguousIndex = mci;

                for (; i < unicodeCharacterDataEntries.Length; ++i)
                {
                    ReadUnicodeCharacterDataEntry(reader, nameBuffer, out unicodeCharacterDataEntries[i]);
                }

                var blockEntries = new UnicodeBlock[reader.ReadUInt16()];

                for (i = 0; i < blockEntries.Length; ++i)
                {
                    ReadBlockEntry(reader, out blockEntries[i]);
                }

                var cjkRadicalEntries = new CjkRadicalData[reader.ReadByte()];

                for (i = 0; i < cjkRadicalEntries.Length; ++i)
                {
                    ReadCjkRadicalInfo(reader, out cjkRadicalEntries[i]);
                }

                var unihanCharacterDataEntries = new UnihanCharacterData[ReadCodePoint(reader)];

                for (i = 0; i < unihanCharacterDataEntries.Length; ++i)
                {
                    ReadUnihanCharacterDataEntry(reader, out unihanCharacterDataEntries[i]);
                }

                unicodeVersion       = fileUnicodeVersion;
                unicodeCharacterData = unicodeCharacterDataEntries;
                unihanCharacterData  = unihanCharacterDataEntries;
                radicals             = cjkRadicalEntries;
                blocks = blockEntries;
            }
        }
示例#3
0
        public static UnicodeData ReadFromStream(Stream stream)
        {
            using (var reader = new BinaryReader(stream, Encoding.UTF8))
            {
                int i;

                if (reader.ReadByte() != 'U'
                    | reader.ReadByte() != 'C'
                    | reader.ReadByte() != 'D')
                {
                    throw new InvalidDataException();
                }

                byte formatVersion = reader.ReadByte();

                if (formatVersion != 2)
                {
                    throw new InvalidDataException();
                }

                var fileUnicodeVersion = new Version(reader.ReadUInt16(), reader.ReadByte(), reader.ReadByte());

                var    unicodeCharacterDataEntries = new UnicodeCharacterData[ReadCodePoint(reader)];              // Allocate one extra entry to act as a dummy entry.
                byte[] nameBuffer         = new byte[128];
                int    maxContiguousIndex = 0;

                for (i = 0; i < unicodeCharacterDataEntries.Length; ++i)
                {
                    ReadUnicodeCharacterDataEntry(reader, nameBuffer, out unicodeCharacterDataEntries[i]);
                    if (unicodeCharacterDataEntries[i].CodePointRange.Contains(i))
                    {
                        maxContiguousIndex = i;
                    }
                    else
                    {
                        ++i;
                        break;
                    }
                }

                for (; i < unicodeCharacterDataEntries.Length; ++i)
                {
                    ReadUnicodeCharacterDataEntry(reader, nameBuffer, out unicodeCharacterDataEntries[i]);
                }

                var blockEntries = new UnicodeBlock[reader.ReadUInt16()];

                for (i = 0; i < blockEntries.Length; ++i)
                {
                    ReadBlockEntry(reader, out blockEntries[i]);
                }

                var cjkRadicalEntries = new CjkRadicalData[reader.ReadByte()];

                for (i = 0; i < cjkRadicalEntries.Length; ++i)
                {
                    ReadCjkRadicalInfo(reader, out cjkRadicalEntries[i]);
                }

                var unihanCharacterDataEntries = new UnihanCharacterData[ReadCodePoint(reader)];

                for (i = 0; i < unihanCharacterDataEntries.Length; ++i)
                {
                    ReadUnihanCharacterDataEntry(reader, out unihanCharacterDataEntries[i]);
                }

                return(new UnicodeData
                       (
                           fileUnicodeVersion,
                           unicodeCharacterDataEntries,
                           unihanCharacterDataEntries,
                           blockEntries,
                           cjkRadicalEntries,
                           maxContiguousIndex
                       ));
            }
        }
示例#4
0
 internal CjkRadicalInfo(byte radicalIndex, CjkRadicalData radicalData)
 {
     this.radicalIndex = radicalIndex;
     this.radicalData  = radicalData;
 }
示例#5
0
 internal CjkRadicalInfo(byte radicalIndex, CjkRadicalData radicalData)
 {
     RadicalIndex = radicalIndex;
     _radicalData = radicalData;
 }