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