WTLSTLATLVisual C++ 7.1Visual C++ 8.0Visual C++ 7.0Windows 2003Windows 2000Visual C++ 6.0Windows XPMFC中级开发Visual StudioWindowsC++
utf8::ostream
轻量级 utf8 生成器。
引言
这个模板类是一个轻量级且快速的 utf8 生成器 - 输出流。该流的主要目的是提供一种简单的方法来动态生成 XML/HTML。
示例
html::viewer hv; utf8::oxstream out; out << "<HTML>" << "<TITLE>" << L"Hello world!" << "</TITLE>" << "<BODY>" << L"Hello world!" << "</BODY>" << "<HTML>"; hv.show(out.data());
实现
主类是一个模板,声明如下:
template <class T, bool X> class ostream_t : public T {}
其中 T 是一个类 - 输出(写入)缓冲区的实现。
而 X 是一个布尔参数。如果它为 true
,则流将对具有特殊 XML/HTML 含义的字符进行转换,例如 '<','>' 等。
类 T 是一个输出缓冲区,应提供两个写入方法的实现。
void push(unsigned char c); void push(const unsigned char *pc, size_t sz);
有关实现细节,请参阅下面的 byte_buffer 类源码。
源代码
源码非常简洁,您可以从这里获取并粘贴到任何您想要的地方
// // This file is part of // Terra Informatica Lightweight Embeddable HTMEngine control SDK // Created by Andrew Fedoniouk @ TerraInformatica.com // namespace aux { // byte_buffer class is an in-memory dynamic buffer implementation. class byte_buffer { unsigned char* _body; size_t _allocated; size_t _size; unsigned char *reserve(size_t size) { size_t newsize = _size + size; if( newsize > _allocated ) { _allocated *= 2; if(_allocated < newsize) _allocated = newsize; unsigned char *newbody = new unsigned char[_allocated]; memcpy(newbody,_body,_size); delete[] _body; _body = newbody; } return _body + _size; } public: byte_buffer():_size(0) { _body = new unsigned char[_allocated = 256]; } ~byte_buffer() { delete[] _body; } const unsigned char * data() { if(_size == _allocated) reserve(1); _body[_size] = '\0'; return _body; } size_t length() const { return _size; } void push(unsigned char c) { *reserve(1) = c; ++_size; } void push(const unsigned char *pc, size_t sz) { memcpy(reserve(sz),pc,sz); _size += sz; } }; } namespace utf8 { // UTF8 stream // class T must have two methods: // void push(unsigned char c) // void push(const unsigned char *pc, size_t sz) // bool X - true - XML markup character conversion // (characters '<','>',etc). // false - no conversion at all. template <class T, bool X = true> class ostream_t : public T { public: ostream_t() { // utf8 byte order mark static unsigned char BOM[] = { 0xEF, 0xBB, 0xBF }; T::push(BOM, sizeof(BOM)); } // intended to handle only ascii-7 strings // use this for markup output ostream_t& operator << (const char* str) { T::push((const unsigned char*)str,strlen(str)); return *this; } // use UNICODE chars for value output ostream_t& operator << (const wchar_t* wstr) { const wchar_t *pc = wstr; for(unsigned int c = *pc; c ; c = *(++pc)) { if(X) switch(c) { case '<': *this << "<"; continue; case '>': *this << ">"; continue; case '&': *this << "&"; continue; case '"': *this << """; continue; case '\'': *this << "'"; continue; } if (c < (1 << 7)) { T::push (c); } else if (c < (1 << 11)) { T::push ((c >> 6) | 0xc0); T::push ((c & 0x3f) | 0x80); } else if (c < (1 << 16)) { T::push ((c >> 12) | 0xe0); T::push (((c >> 6) & 0x3f) | 0x80); T::push ((c & 0x3f) | 0x80); } else if (c < (1 << 21)) { T::push ((c >> 18) | 0xe0); T::push (((c >> 12) & 0x3f) | 0x80); T::push (((c >> 6) & 0x3f) | 0x80); T::push ((c & 0x3f) | 0x80); } } return *this; } }; // raw ASCII/UNICODE -> UTF8 converter typedef ostream_t<aux::byte_buffer,false> ostream; // ASCII/UNICODE -> UTF8 converter with XML support typedef ostream_t<aux::byte_buffer,true> oxstream; }
我们在 HTMEngine SDK 中使用这段代码来创建 HTML 对话框和弹出窗口。希望它也可以在其他需要动态 XML/HTML 创建的地方使用。