OSDN Git Service

5a67bc82ed281b177e1a44d10416c21ce165b0a0
[simplecms/utakata.git] / src / utf8_transcoder.h
1 // バイナリデータをutf-8のデータとして解釈するTranscoderです。
2 #ifndef _UTAKATA_SRC_UTF8_TRANSCODER_H_
3 #define _UTAKATA_SRC_UTF8_TRANSCODER_H_
4
5 #include <vector>
6 #include "src/transcoder_interface.h"
7
8 namespace utakata {
9
10 namespace reader {
11 class IReader;
12 }
13
14 namespace transcoder {
15
16 class UTF8Transcoder : public ITranscoder {
17   // バイト列をUTF8と解釈して読出すためのTranscoderです。
18   // UTF8Transcoder::Encode/Decodeで、変換不可能であるバイナリデータ
19   // があった場合、それぞれEncodeException、DecodeExceptionが送出されます。
20  public:
21   UTF8Transcoder() : kUTF8MaxBitPos(21),
22                      kByteMaxValue((1 << 7) - 1),
23                      kExternalCodeLimit(0x110000),
24                      kSamplingUTF8Bits((1 << 6) - 1),
25                      kMaxUTF8MultiByteSize(5) {}
26   virtual ~UTF8Transcoder() {}
27
28   // 渡されたreaderから、一文字分のデータを読出し、結果をunicodeとして
29   // 返します。
30   // 完全なUTF8のバイト列として解釈できない場合、例外を送出します。
31   virtual unsigned int Encode(reader::IReader* reader);
32
33   // 渡されたunicodeから、UTF-8へと解釈して、バイト列として返します。
34   // 不正なunicodeか、UTF-8へと変換できないunicodeである場合、DecodeException
35   // が送出されます。
36   virtual std::vector<unsigned int> Decode(unsigned int unicode);
37
38  private:
39
40   // UTF8として認識できる最大のbitサイズです。これは完全な固定値であるため、
41   // 変更は不可能です。
42   const unsigned int kUTF8MaxBitPos;
43
44   // 1バイトの最大値を表します。16進数で表わした場合、0x7Fとなります。
45   const unsigned int kByteMaxValue;
46
47   // Unicodeとして認識可能な最大値を表します。16進数での表現は、0x110000となります。
48   const unsigned int kExternalCodeLimit;
49
50   // 先頭バイト以外のUTF8のバイト列からデータを抽出する際のサンプリングを
51   // 行うバイト列です。16進数では0x3Fとなります。
52   const unsigned int kSamplingUTF8Bits;
53
54   // UTF8として認識可能な最大のマルチバイト数です。この値以上
55   // はUTF8として認識することができません。
56   const unsigned int kMaxUTF8MultiByteSize;
57
58   // 渡されたバイト列から、一文字分のunicodeを生成します。
59   // 内部でのみ利用されます。
60   unsigned int GenerateUnicode(const std::vector<unsigned int>& bytes);
61
62   // UTF8の先頭バイト以外のデータ列から、実際に利用するビットのみを
63   // 抽出し、先頭バイトからの個数分だけシフトします。
64   unsigned int SamplingUTF8Data(unsigned int data, int byte_number) {
65     return (data & kSamplingUTF8Bits) << (6 * byte_number);
66   }
67
68   // UTF-8の先頭バイトとして正しいフォーマットであるかをチェックします。
69   // 正しいフォーマットである場合、trueを返します。
70   // utf8_sizeには、先頭バイトも含めたUTF8一文字のサイズが返されます。
71   // 正しいフォーマットでは無い場合、utf8_sizeは編集されません。
72   // utf8_sizeには有効なポインタを渡さなければなりません。
73   bool IsUTF8FirstByte(int check_byte, int* utf8_size);
74
75 };
76 };
77 };
78
79 #endif /* _UTAKATA_SRC_UTF8_TRANSCODER_H_ */