zoukankan      html  css  js  c++  java
  • 从2进制文件读取一个UTF8字符串 ReadUTF8 ,跨平台

    直接贴代码: 游戏开发群:44727718

    如果缺少什么函数,请给下看。。

     1 string HSReadData::ReadUTF8()
     2 {
     3     
     4     int utflen = ReadShort() & 0xffff;
     5     wstring str;
     6     str.resize(utflen);
     7     vector<char> bytes;
     8     bytes.resize(utflen);
     9     for (int i=0;i<utflen;++i)
    10     {
    11         bytes[i] = this->ReadByte();
    12     }
    13 
    14     int ch1, ch2, ch3;
    15     int length = 0;
    16     int index = 0;
    17 
    18     while(length < utflen)
    19     {
    20         ch1 = (int) bytes[length] & 0xff;
    21         switch(ch1 >> 4)
    22         {
    23         case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
    24             /* 0xxxxxxx*/
    25             length++;
    26             str[index++] = (wchar_t)ch1;
    27             break;
    28         case 12: case 13:
    29             /* 110x xxxx   10xx xxxx*/
    30             length += 2;
    31             if(length > utflen)
    32             {
    33                 return "Error code -1";
    34             }
    35 
    36             ch2 = (int)bytes[length - 1];
    37             if((ch2 & 0xC0) != 0x80)
    38             {
    39                 return "Error code -1";
    40             }
    41 
    42             str[index++] = (wchar_t)(((ch1 & 0x1F) << 6) | (ch2 & 0x3F));
    43             break;
    44         case 14:
    45             /* 1110 xxxx  10xx xxxx  10xx xxxx */
    46             length += 3;
    47             if(length > utflen)
    48             {
    49                 return "Error code -1";
    50             }
    51 
    52             ch2 = (int)bytes[length - 2];
    53             ch3 = (int)bytes[length - 1];
    54 
    55             if(((ch2 & 0xC0) != 0x80) || ((ch3 & 0xC0) != 0x80))
    56             {
    57                 return "Error code -1";
    58             }
    59             str[index++] = (wchar_t)(((ch1 & 0x0F) << 12) | ((ch2 & 0x3F) << 6) | ((ch3 & 0x3F) << 0));
    60             break;
    61         default:
    62             /* 10xx xxxx,  1111 xxxx */
    63             return "Error code -1";
    64         }
    65     }
    66     string text = HSTool::GetStringWithWstring(str);
    67     
    68     return text;
    69 }
     1 short  HSReadData::ReadShort()
     2 {
     3     int b1 = Fgetc();
     4     int b2 = Fgetc();
     5     b1 &= 0xff;
     6     b2 &= 0xff;
     7     if (b1 == -1 || b2 == -1)
     8     {
     9         HSMessageBox("HSReadData @ ReadShort  throw -1 ");
    10     }
    11     int value = (b1 << 8) | (b2 << 0);
    12     return (short) value;
    13 }
     1 char  HSReadData::ReadByte()
     2 {
     3     int b1 = Fgetc();
     4     b1 &= 0xff;
     5     if (b1 == -1)
     6     {
     7         HSMessageBox("SPX3 @ ReadByte  throw -1 ");
     8     }
     9     int value = b1 & 0xff;
    10     //CCLog("ReadByte : %d",b1);
    11     return (char) value;
    12 }

     1 std::string HSTool::GetStringWithWstring( const wstring& ws )
     2 {
     3 //     string curLocale = setlocale(LC_ALL, NULL); // curLocale = "C";
     4 //     setlocale(LC_ALL, "chs"); 
     5 //     const wchar_t* _Source = ws.c_str();
     6 //     size_t _Dsize = 2 * ws.size() + 1;
     7 //     char *_Dest = new char[_Dsize];
     8 //     memset(_Dest,0,_Dsize);
     9 //     wcstombs(_Dest,_Source,_Dsize);
    10 //     string result = _Dest;
    11 //     delete []_Dest;
    12 //     setlocale(LC_ALL, curLocale.c_str());
    13     string ret;
    14 
    15     ret.resize(ws.size());
    16 
    17     for(size_t i = 0; i < ws.size(); ++i)
    18     {
    19         ret[i] = (string::value_type)ws[i];
    20     }
    21 
    22     return ret;
    23     return ret;
    24 }
     1 wstring HSTool::GetWstringWithString( const std::string& s )
     2 {
     3 //     std::string curLocale = setlocale(LC_ALL, NULL); // curLocale = "C";
     4 //     setlocale(LC_ALL, "chs"); 
     5 //     const char* _Source = s.c_str();
     6 //     size_t _Dsize = s.size() + 1;
     7 //     wchar_t *_Dest = new wchar_t[_Dsize];
     8 //     wmemset(_Dest, 0, _Dsize);
     9 //     mbstowcs(_Dest,_Source,_Dsize);
    10 //     std::wstring result = _Dest;
    11 //     delete []_Dest;
    12 //     setlocale(LC_ALL, curLocale.c_str());
    13     wstring ret;
    14 
    15     ret.resize(s.size());
    16 
    17     for(size_t i = 0; i < s.size(); ++i)
    18     {
    19         ret[i] = (wstring::value_type)s[i];
    20     }
    21 
    22     return ret;
    23 }
  • 相关阅读:
    力扣(LeetCode)验证回文串 个人题解(C++)
    力扣(LeetCode)平方数之和 个人题解
    Exclusive Access 2 UVA
    C语言中指针*p[N], (*P)[N]的区别
    2018年蓝桥杯国赛比赛心得
    2018acm/icpc西安邀请赛比赛心得
    [最小割]Cable TV Network UVA
    Tree Reconstruction UVA
    Twenty Questions UVA
    python中的enumerate 函数(编号的实现方式)
  • 原文地址:https://www.cnblogs.com/GameDeveloper/p/2705975.html
Copyright © 2011-2022 走看看