支持UNICODE/UTF8/ANSI之间的转换的类
作者 佚名技术
来源 程序设计
浏览
发布时间 2012-06-30
& 0xF) || (sx[1]&(0x80+0x40)) != 0x80 || (sx[2]&(0x80+0x40)) != 0x80) { rv = 0; break; } sx += 3; } else { /* more than 16 bits are not allowed here */ ASCII7only = 0; rv = 0; break; } } if(cchUnused) *cchUnused = endx-sx; return(ASCII7only?0:rv); } //--------------------------------------------------------------------------- EncodingType __fastcall ZUtf8_16::DetermineEncoding(unsigned char *data, size_t iLen) { // TODO:判断当前文件的编码类型。 m_unicodeMode = uni8Bit; // 默认ASCII if(data[0] == 0xFE && data[1] == 0xFF) // Big endian == UNICODE-BIG UTF16 { m_unicodeMode = uni16BE; } else if(data[0] == 0xFF && data[1] == 0xFE) // Little endian == UNICODE UTF16 { m_unicodeMode = uni16LE; // Unicode } else if(data[0] == 0xEF && data[1] == 0xBB && data[2] == 0xBF) // UTF8 { m_unicodeMode = uniUTF8; } else if(isUTF8_16(data, iLen, NULL) == 1) { m_unicodeMode = uniUTF8NOBOM; } return m_unicodeMode; } //--------------------------------------------------------------------------- bool __fastcall ZUtf8_16::LoadFromStream(TMemoryStream *pSourceStream, AnsiString &DestText) { // TODO:从流中读取数据 // 先判断字符编码 pSourceStream->Position = 0; if(pSourceStream->Size == 0) return true; m_unicodeMode = DetermineEncoding((char*)pSourceStream->Memory, pSourceStream->Size); pSourceStream->Position = 0; // 再根椐相应的编码做相应的事。 switch(m_unicodeMode) { case uni8Bit: { // 什么都不做。以保证打开一些大的文件时速度快一些。 // 所以调用者需要自己在调的之后判断字符编码, // 如果是uni8Bit,则需要自己处理。 // int iLength = pSourceStream->Size ; // char *szUnicode = new char[iLength+1]; // memset(szUnicode, 0x00, iLength+1); // pSourceStream->Read(szUnicode, iLength); // DestText = AnsiString(szUnicode); // delete []szUnicode; // szUnicode = NULL; break; } case uni16BE: { // UC Big endian pSourceStream->Position = 2; int iLength = pSourceStream->Size-2 ; char temp; char *szUnicode = new char[iLength+2]; memset(szUnicode, 0x00, iLength+2); pSourceStream->Read(szUnicode, iLength); // 只要把每两个字节的位置交换一下,就是UNICODE LE了。So... for(int i = 0; i<iLength; i += 2) { temp = szUnicode[i]; szUnicode[i] = szUnicode[i+1]; szUnicode[i+1] = temp; Application->ProcessMessages(); } DestText = WideCharLenToString ((wchar_t*)(szUnicode), iLength/2); delete []szUnicode; szUnicode = NULL; break; } case uni16LE: |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
上一篇: 用于计算四则混合运算表达式的递归函数第二版下一篇: 实例解析C++/CLI中的接口与泛型
关于支持UNICODE/UTF8/ANSI之间的转换的类的所有评论