utf8_string::CUTF8Char ch(stream->read());
-
// 最初の一文字で、大体決定されるため、firstをチェックして
// いく。
if (first)
{
return makeComma();
}
+
+ if (ch.toUTF16Code() == '"')
+ {
+ // 先頭が"の場合、stringと判断される。
+ return makeString(stream);
+ }
+
}
else
{
+ // それまでに読みだした文字列が固定の文字列かどうか。
+
// 読出した文字がデリミタであるかどうか。
if (isDelimiter(ch))
{
// デリミタ文字である場合、このデリミタ文字に来るまでの間に
// 保存した文字列から、実際のデータを作成する。
+ // ここに来るまでにすでに型は決定されているはずなので、
+ // その型を基にして作成する。
}
+
+
}
}
}
// マルチバイトとascii文字の混在文字も正しく扱うことのできる
// CUTF8Stringのテスト
- std::string tmp("あいうえsssお");
+ std::string tmp("ã\81\82ã\81\82ã\81\84ã\81\86ã\81\88sssã\81\8a");
smart_ptr<std::istream> ss(new std::stringstream(tmp));
utakata::utf8::CUTF8InputStream stream(ss);
+ utakata::utf8_string::CUTF8Char ch(stream.read());
+
utakata::utf8_string::CUTF8String str(stream.read(5));
asserter->check(str.begin()->toStr(), "あ");
asserter->check(str.size(), 5);
// 文字列とするのは自身の関数だけで可能。
asserter->check(str.toStr(), "あいうえsあいうえs");
+ // 文字との加算も可能。
+ str += ch;
+ asserter->check(str.toStr(), "ああいうえsあいうえs");
+
return asserter->isOk();
}
return ch.getBytes()[0] == 0xff ? true : false;
}
-CUTF8String utakata::utf8_string::operator+(const CUTF8String& lh, const CUTF8String& rh)
-{
- // 双方をコピーして加算して返す。凄い負荷が高い。
- CUTF8String str(lh);
- str += rh;
- return str;
-}
//================================================================================
return *this;
}
+CUTF8String& CUTF8String::operator+=(const std::vector<unsigned char>& ch)
+{
+ // 実際には文字を設定するのに利用される。
+ // また、これを定義しておくことで、streamからの結果を直接設定することができる。
+ CUTF8String tmp(ch);
+ chars_.insert(chars_.end(), tmp.chars_.begin(), tmp.chars_.end());
+ return *this;
+}
+
+CUTF8String& CUTF8String::operator+=(const CUTF8Char& ch)
+{
+ // 実際には文字を設定するのに利用される。
+ // また、これを定義しておくことで、streamからの結果を直接設定することができる。
+ CUTF8String tmp(ch.getBytes());
+ chars_.insert(chars_.end(), tmp.chars_.begin(), tmp.chars_.end());
+ return *this;
+}
+
+
std::string CUTF8String::toStr() const
{
// 文字列に変換する。
}
}
+CUTF8String utakata::utf8_string::operator+(const CUTF8String& lh, const CUTF8String& rh)
+{
+ // 双方をコピーして加算して返す。凄い負荷が高い。
+ CUTF8String str(lh);
+ str += rh;
+ return str;
+}
+
+CUTF8String utakata::utf8_string::operator+(const CUTF8String& lh, const CUTF8Char& rh)
+{
+ // 文字と加算する。
+ CUTF8String tmp(lh);
+ tmp += rh.getBytes();
+ return tmp;
+}
+CUTF8String utakata::utf8_string::operator+(const CUTF8Char& lh, const CUTF8String& rh)
+{
+ CUTF8String tmp(lh.getBytes());
+ tmp += rh;
+ return tmp;
+}
// 実体に代入する。代入が行われなかった場合、元のデータ
// は保存される。
void assign(const std::vector<unsigned char>& bytes);
- void assign(const std::vector<CUTF8Char>& chars);
void assign(const CUTF8String& str);
// iteratorを取得する。
// 加算のみをサポートする。
CUTF8String& operator+=(const CUTF8String& str);
+ CUTF8String& operator+=(const std::vector<unsigned char>& ch);
+ CUTF8String& operator+=(const CUTF8Char& ch);
// std::stringへ変換する。ただし、std::string上でのinsertなどは
// 保証できない。
};
CUTF8String operator+(const CUTF8String& lh, const CUTF8String& rh);
+ CUTF8String operator+(const CUTF8String& lh, const CUTF8Char& rh);
+ CUTF8String operator+(const CUTF8Char& lh, const CUTF8String& rh);
+
// substringの実装を行う。
// [begin, end)までの文字を文字列として返す。