You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

259 lines
8.8 KiB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace Apewer.Internals
  5. {
  6. internal class TextGenerator
  7. {
  8. /// <summary>生成新的 GUID。</summary>
  9. public static string NewGuid(bool argHyphenation = false, bool argLowerCase = true)
  10. {
  11. var vguid = Guid.NewGuid().ToString();
  12. if (argLowerCase) vguid = vguid.ToLower();
  13. else vguid = vguid.ToUpper();
  14. if (!argHyphenation) vguid = vguid.Replace("-", "");
  15. return vguid;
  16. }
  17. /// <summary>合并字符串。</summary>
  18. public static string Merge(IEnumerable<string> argStrings)
  19. {
  20. if (argStrings == null) return "";
  21. var vsb = new StringBuilder();
  22. foreach (var vstring in argStrings)
  23. {
  24. if (string.IsNullOrEmpty(vstring)) continue;
  25. vsb.Append(vstring);
  26. }
  27. return vsb.ToString();
  28. }
  29. /// <summary>合并字符串。</summary>
  30. public static string Merge(params string[] argStrings)
  31. {
  32. if (argStrings == null) return "";
  33. var vsb = new StringBuilder();
  34. foreach (var vstring in argStrings)
  35. {
  36. if (string.IsNullOrEmpty(vstring)) continue;
  37. vsb.Append(vstring);
  38. }
  39. return vsb.ToString();
  40. }
  41. /// <summary>合并字符串。</summary>
  42. public static string Merge(IEnumerable<char> argChars)
  43. {
  44. if (argChars == null) return "";
  45. var vsb = new StringBuilder();
  46. foreach (var vchar in argChars)
  47. {
  48. vsb.Append(vchar.ToString());
  49. }
  50. return vsb.ToString();
  51. }
  52. /// <summary>合并字符串。</summary>
  53. public static string Merge(params char[] argChars)
  54. {
  55. if (argChars == null) return "";
  56. var vsb = new StringBuilder();
  57. foreach (var vchar in argChars)
  58. {
  59. vsb.Append(vchar.ToString());
  60. }
  61. return vsb.ToString();
  62. }
  63. private static int Asc(char argChar)
  64. {
  65. int num = Convert.ToInt32(argChar);
  66. if (num < 128) return num;
  67. int result = 0;
  68. try
  69. {
  70. Encoding fileIOEncoding = Encoding.Default;
  71. char[] chars = new char[] { argChar };
  72. if (fileIOEncoding.IsSingleByte)
  73. {
  74. byte[] array = new byte[1];
  75. int bytes = fileIOEncoding.GetBytes(chars, 0, 1, array, 0);
  76. result = (int)array[0];
  77. }
  78. else
  79. {
  80. byte[] array = new byte[2];
  81. int bytes = fileIOEncoding.GetBytes(chars, 0, 1, array, 0);
  82. if (bytes == 1)
  83. {
  84. result = (int)array[0];
  85. }
  86. else
  87. {
  88. if (BitConverter.IsLittleEndian)
  89. {
  90. byte b = array[0];
  91. array[0] = array[1];
  92. array[1] = b;
  93. }
  94. result = (int)BitConverter.ToInt16(array, 0);
  95. }
  96. }
  97. }
  98. catch { }
  99. return result;
  100. }
  101. /// <summary>按字符编码获取字符。</summary>
  102. public static char Chr(int argCode)
  103. {
  104. if (argCode < -32768 || argCode > 65535) return ' ';
  105. if (argCode >= 0 && argCode <= 127) return Convert.ToChar(argCode);
  106. checked
  107. {
  108. char result;
  109. try
  110. {
  111. Encoding encoding = Encoding.Default;
  112. if (encoding.IsSingleByte && (argCode < 0 || argCode > 255))
  113. {
  114. return ' ';
  115. }
  116. char[] array = new char[2];
  117. byte[] array2 = new byte[2];
  118. Decoder decoder = encoding.GetDecoder();
  119. if (argCode >= 0 && argCode <= 255)
  120. {
  121. array2[0] = (byte)(argCode & 255);
  122. int chars = decoder.GetChars(array2, 0, 1, array, 0);
  123. }
  124. else
  125. {
  126. array2[0] = (byte)((argCode & 65280) >> 8);
  127. array2[1] = (byte)(argCode & 255);
  128. int chars = decoder.GetChars(array2, 0, 2, array, 0);
  129. }
  130. result = array[0];
  131. }
  132. catch { return ' '; }
  133. return result;
  134. }
  135. }
  136. /// <summary>获取 ASCII 字符。</summary>
  137. /// <param name="argCode">ASCII 值。</param>
  138. public static string Ascii(int argCode)
  139. {
  140. try { return Chr(argCode).ToString(); }
  141. catch { return ""; }
  142. }
  143. /// <summary>获取范围内 ASCII 值连续的字符。</summary>
  144. /// <param name="argBegin">范围起始 ASCII 值。</param>
  145. /// <param name="argEnd">范围结束 ASCII 值。</param>
  146. public static string Ascii(int argBegin, int argEnd)
  147. {
  148. try
  149. {
  150. int vb = argBegin;
  151. int ve = argEnd;
  152. if (vb == ve) return Ascii(vb);
  153. else
  154. {
  155. var vr = new TextBuilder();
  156. if (vb < ve)
  157. {
  158. for (int i = vb; i <= ve; i++) vr.Append(Ascii(i));
  159. }
  160. else
  161. {
  162. for (int i = vb; i >= ve; i--) vr.Append(Ascii(i));
  163. }
  164. return vr.Value;
  165. }
  166. }
  167. catch { return ""; }
  168. }
  169. /// <summary>重复指定子字符串,直到达到指定长度。</summary>
  170. /// <param name="argCell">子字符串。</param>
  171. /// <param name="argLength">目标字符串的长度。</param>
  172. public static string CopyChar(string argCell, int argLength)
  173. {
  174. if (argLength > 0)
  175. {
  176. var vcell = string.IsNullOrEmpty(argCell) ? " " : argCell;
  177. var vtext = new TextBuilder();
  178. while (vtext.Length < argLength) vtext.Append(vcell);
  179. var vresult = vtext.Value;
  180. if (vresult.Length > argLength) vresult = vresult.Substring(0, argLength);
  181. return vresult;
  182. }
  183. return "";
  184. }
  185. /// <summary>获取指定长的的空格。</summary>
  186. public static string Space(int argLength)
  187. {
  188. return CopyChar(" ", argLength);
  189. }
  190. /// <summary>获取首字母大写的拼音。</summary>
  191. private static string GetHeadLetterByString(string argText)
  192. {
  193. string tempStr = "";
  194. foreach (char vchar in argText)
  195. {
  196. if ((int)vchar >= 33 && (int)vchar <= 126)
  197. {//字母和符号原样保留
  198. tempStr += vchar.ToString();
  199. }
  200. else
  201. {//累加拼音声母
  202. tempStr += GetHeadLetterByChar(vchar.ToString());
  203. }
  204. }
  205. return tempStr;
  206. }
  207. /// <summary>取单个字符的拼音声母</summary>
  208. /// <param name="argChar">要转换的单个汉字</param>
  209. /// <returns>拼音首字母</returns>
  210. public static string GetHeadLetterByChar(string argChar)
  211. {
  212. byte[] array = new byte[2];
  213. array = Encoding.Default.GetBytes(argChar);
  214. int i = (short)(array[0] - '\0') * 256 + ((short)(array[1] - '\0'));
  215. if (i < 0xB0A1) return "*";
  216. if (i < 0xB0C5) return "a";
  217. if (i < 0xB2C1) return "b";
  218. if (i < 0xB4EE) return "c";
  219. if (i < 0xB6EA) return "d";
  220. if (i < 0xB7A2) return "e";
  221. if (i < 0xB8C1) return "f";
  222. if (i < 0xB9FE) return "g";
  223. if (i < 0xBBF7) return "h";
  224. if (i < 0xBFA6) return "j";
  225. if (i < 0xC0AC) return "k";
  226. if (i < 0xC2E8) return "l";
  227. if (i < 0xC4C3) return "m";
  228. if (i < 0xC5B6) return "n";
  229. if (i < 0xC5BE) return "o";
  230. if (i < 0xC6DA) return "p";
  231. if (i < 0xC8BB) return "q";
  232. if (i < 0xC8F6) return "r";
  233. if (i < 0xCBFA) return "s";
  234. if (i < 0xCDDA) return "t";
  235. if (i < 0xCEF4) return "w";
  236. if (i < 0xD1B9) return "x";
  237. if (i < 0xD4D1) return "y";
  238. if (i < 0xD7FA) return "z";
  239. return "*";
  240. }
  241. }
  242. }