text.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:5k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include <afxtempl.h>
  3. /*
  4. CString Explode(CString str, CList<CString>& sl, TCHAR sep, int limit)
  5. {
  6. sl.RemoveAll();
  7. if(limit == 1) {sl.AddTail(str); return _T("");}
  8. if(!str.IsEmpty() && str[str.GetLength()-1] != sep)
  9. str += sep;
  10. for(int i = 0, j = 0; (j = str.Find(sep, i)) >= 0; i = j+1)
  11. {
  12. CString tmp = str.Mid(i, j-i);
  13. tmp.TrimLeft(sep); tmp.TrimRight(sep);
  14. tmp.TrimLeft(); tmp.TrimRight();
  15. sl.AddTail(tmp);
  16. if(limit > 0 && sl.GetCount() == limit-1)
  17. {
  18. if(j+1 < str.GetLength()) 
  19. {
  20. CString tmp = str.Mid(j+1);
  21. tmp.TrimLeft(sep); tmp.TrimRight(sep);
  22. tmp.TrimLeft(); tmp.TrimRight();
  23. sl.AddTail(tmp);
  24. }
  25. break;
  26. }
  27. }
  28. if(sl.IsEmpty())
  29. {
  30. str.TrimLeft(sep); str.TrimRight(sep);
  31. str.TrimLeft(); str.TrimRight();
  32. sl.AddTail(str);
  33. }
  34. return sl.GetHead();
  35. }
  36. CString ExplodeMin(CString str, CList<CString>& sl, TCHAR sep, int limit)
  37. {
  38. Explode(str, sl, sep, limit);
  39. POSITION pos = sl.GetHeadPosition();
  40. while(pos) 
  41. {
  42. POSITION tmp = pos;
  43. if(sl.GetNext(pos).IsEmpty())
  44. sl.RemoveAt(tmp);
  45. }
  46. if(sl.IsEmpty()) sl.AddTail(CString()); // eh
  47. return sl.GetHead();
  48. }
  49. CString Implode(CList<CString>& sl, TCHAR sep)
  50. {
  51. CString ret;
  52. POSITION pos = sl.GetHeadPosition();
  53. while(pos)
  54. {
  55. ret += sl.GetNext(pos);
  56. if(pos) ret += sep;
  57. }
  58. return(ret);
  59. }
  60. */
  61. DWORD CharSetToCodePage(DWORD dwCharSet)
  62. {
  63. if(dwCharSet == CP_UTF8) return CP_UTF8;
  64. if(dwCharSet == CP_UTF7) return CP_UTF7;
  65. CHARSETINFO cs={0};
  66. ::TranslateCharsetInfo((DWORD *)dwCharSet, &cs, TCI_SRCCHARSET);
  67. return cs.ciACP;
  68. }
  69. CStringA ConvertMBCS(CStringA str, DWORD SrcCharSet, DWORD DstCharSet)
  70. {
  71. WCHAR* utf16 = new WCHAR[str.GetLength()+1];
  72. memset(utf16, 0, (str.GetLength()+1)*sizeof(WCHAR));
  73. CHAR* mbcs = new CHAR[str.GetLength()*6+1];
  74. memset(mbcs, 0, str.GetLength()*6+1);
  75. int len = MultiByteToWideChar(
  76. CharSetToCodePage(SrcCharSet), 0, 
  77. str.GetBuffer(str.GetLength()), str.GetLength(), 
  78. utf16, (str.GetLength()+1)*sizeof(WCHAR));
  79. len = WideCharToMultiByte(
  80. CharSetToCodePage(DstCharSet), 0, 
  81. utf16, len, 
  82. mbcs, str.GetLength()*6,
  83. NULL, NULL);
  84. str = mbcs;
  85. delete [] utf16;
  86. delete [] mbcs;
  87. return str;
  88. }
  89. CStringA UrlEncode(CStringA str, bool fRaw)
  90. {
  91. CStringA urlstr;
  92. for(int i = 0; i < str.GetLength(); i++)
  93. {
  94. CHAR c = str[i];
  95. if(fRaw && c == '+') urlstr += "%2B";
  96. else if(c > 0x20 && c < 0x7f && c != '&') urlstr += c;
  97. else if(c == 0x20) urlstr += fRaw ? ' ' : '+';
  98. else {CStringA tmp; tmp.Format("%%%02x", (BYTE)c); urlstr += tmp;}
  99. }
  100. return urlstr;
  101. }
  102. CStringA UrlDecode(CStringA str, bool fRaw)
  103. {
  104. str.Replace("&amp;", "&");
  105. CHAR* s = str.GetBuffer(str.GetLength());
  106. CHAR* e = s + str.GetLength();
  107. CHAR* s1 = s;
  108. CHAR* s2 = s;
  109. while(s1 < e)
  110. {
  111. CHAR s11 = (s1 < e-1) ? (__isascii(s1[1]) && isupper(s1[1]) ? tolower(s1[1]) : s1[1]) : 0;
  112. CHAR s12 = (s1 < e-2) ? (__isascii(s1[2]) && isupper(s1[2]) ? tolower(s1[2]) : s1[2]) : 0;
  113. if(*s1 == '%' && s1 < e-2
  114. && (s1[1] >= '0' && s1[1] <= '9' || s11 >= 'a' && s11 <= 'f')
  115. && (s1[2] >= '0' && s1[2] <= '9' || s12 >= 'a' && s12 <= 'f'))
  116. {
  117. s1[1] = s11;
  118. s1[2] = s12;
  119. *s2 = 0;
  120. if(s1[1] >= '0' && s1[1] <= '9') *s2 |= s1[1]-'0';
  121. else if(s1[1] >= 'a' && s1[1] <= 'f') *s2 |= s1[1]-'a'+10;
  122. *s2 <<= 4;
  123. if(s1[2] >= '0' && s1[2] <= '9') *s2 |= s1[2]-'0';
  124. else if(s1[2] >= 'a' && s1[2] <= 'f') *s2 |= s1[2]-'a'+10;
  125. s1 += 2;
  126. }
  127. else 
  128. {
  129. *s2 = *s1 == '+' && !fRaw ? ' ' : *s1;
  130. }
  131. s1++;
  132. s2++;
  133. }
  134. str.ReleaseBuffer(s2 - s);
  135. return str;
  136. }
  137. CString ExtractTag(CString tag, CMapStringToString& attribs, bool& fClosing)
  138. {
  139. tag.Trim();
  140. attribs.RemoveAll();
  141. fClosing = !tag.IsEmpty() ? tag[0] == '/' : false;
  142. tag.TrimLeft('/');
  143. int i = tag.Find(' ');
  144. if(i < 0) i = tag.GetLength();
  145. CString type = tag.Left(i).MakeLower();
  146. tag = tag.Mid(i).Trim();
  147. while((i = tag.Find('=')) > 0)
  148. {
  149. CString attrib = tag.Left(i).Trim().MakeLower();
  150. tag = tag.Mid(i+1);
  151. for(i = 0; i < tag.GetLength() && _istspace(tag[i]); i++);
  152. tag = i < tag.GetLength() ? tag.Mid(i) : _T("");
  153. if(!tag.IsEmpty() && tag[0] == '"') {tag = tag.Mid(1); i = tag.Find('"');}
  154. else i = tag.Find(' ');
  155. if(i < 0) i = tag.GetLength();
  156. CString param = tag.Left(i).Trim();
  157. if(!param.IsEmpty())
  158. attribs[attrib] = param;
  159. tag = i+1 < tag.GetLength() ? tag.Mid(i+1) : _T("");
  160. }
  161. return(type);
  162. }
  163. CList<CString>& MakeLower(CList<CString>& sl)
  164. {
  165. POSITION pos = sl.GetHeadPosition();
  166. while(pos) sl.GetNext(pos).MakeLower();
  167. return sl;
  168. }
  169. CList<CString>& MakeUpper(CList<CString>& sl)
  170. {
  171. POSITION pos = sl.GetHeadPosition();
  172. while(pos) sl.GetNext(pos).MakeUpper();
  173. return sl;
  174. }
  175. CList<CString>& RemoveStrings(CList<CString>& sl, int minlen, int maxlen)
  176. {
  177. POSITION pos = sl.GetHeadPosition();
  178. while(pos)
  179. {
  180. POSITION tmp = pos;
  181. CString& str = sl.GetNext(pos);
  182. int len = str.GetLength();
  183. if(len < minlen || len > maxlen) sl.RemoveAt(tmp);
  184. }
  185. return sl;
  186. }