XSUtil.class.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. <?php
  2. /**
  3. * XSUtil 类定义文件
  4. *
  5. * @author hightman
  6. * @link http://www.xunsearch.com/
  7. * @copyright Copyright &copy; 2011 HangZhou YunSheng Network Technology Co., Ltd.
  8. * @license http://www.xunsearch.com/license/
  9. * @version $Id$
  10. */
  11. /**
  12. * XSUtil 工具程序通用代码
  13. *
  14. * @author hightman <hightman@twomice.net>
  15. * @version 1.0.0
  16. * @package XS.util
  17. */
  18. class XSUtil
  19. {
  20. private static $optind, $options = null;
  21. private static $charset = null;
  22. /**
  23. * 修正字符串至固定宽度
  24. * 其中一个全角符号、汉字的宽度为半角字符的 2 倍。
  25. * @param string $text 要修正的字符串
  26. * @param int $size 修正的目标宽度
  27. * @param string $pad 用于填充补足的字符
  28. * @return type
  29. */
  30. public static function fixWidth($text, $size, $pad = ' ')
  31. {
  32. for ($i = $j = 0; $i < strlen($text) && $j < $size; $i++, $j++)
  33. {
  34. if ((ord($text[$i]) & 0xe0) == 0xe0)
  35. {
  36. if (($size - $j) == 1)
  37. break;
  38. $j++;
  39. $i += 2;
  40. }
  41. }
  42. return substr($text, 0, $i) . str_repeat($pad, $size - $j);
  43. }
  44. /**
  45. * 设置输出、输入编码
  46. * 默认输出的中文编码均为 UTF-8
  47. * @param string $charset 期望得到的字符集
  48. */
  49. public static function setCharset($charset)
  50. {
  51. if ($charset !== null && strcasecmp($charset, 'utf8') && strcasecmp($charset, 'utf-8'))
  52. {
  53. self::$charset = $charset;
  54. ob_start(array(__CLASS__, 'convertOut'));
  55. }
  56. }
  57. /**
  58. * 把 UTF-8 字符串转换为用户编码
  59. * @param string $buf 要转换字符串
  60. * @return string 转换后的字符串
  61. */
  62. public static function convertOut($buf)
  63. {
  64. if (self::$charset !== null)
  65. return XS::convert($buf, self::$charset, 'UTF-8');
  66. return $buf;
  67. }
  68. /**
  69. * 把用户输入的字符串转换为 UTF-8 编码
  70. * @param string $buf 要转换字符串
  71. * @return string 转换后的字符串
  72. */
  73. public static function convertIn($buf)
  74. {
  75. if (self::$charset !== null)
  76. return XS::convert($buf, 'UTF-8', self::$charset);
  77. return $buf;
  78. }
  79. /**
  80. * 解析命令行参数
  81. * @param array $valued 需要附加值的参数列表
  82. * @return array 解析完的参数数组,未指定 - 开头的选项统一放入 '-' 的子数组
  83. */
  84. public static function parseOpt($valued = array())
  85. {
  86. $result = array('-' => array());
  87. $params = isset($_SERVER['argv']) ? $_SERVER['argv'] : array();
  88. for ($i = 0; $i < count($params); $i++)
  89. {
  90. if ($params[$i] === '--')
  91. {
  92. for ($i = $i + 1; $i < count($params); $i++)
  93. $result['-'][] = $params[$i];
  94. break;
  95. }
  96. else if ($params[$i][0] === '-')
  97. {
  98. $value = true;
  99. $pname = substr($params[$i], 1);
  100. if ($pname[0] === '-')
  101. {
  102. $pname = substr($pname, 1);
  103. if (($pos = strpos($pname, '=')) !== false)
  104. {
  105. $value = substr($pname, $pos + 1);
  106. $pname = substr($pname, 0, $pos);
  107. }
  108. }
  109. else if (strlen($pname) > 1)
  110. {
  111. for ($j = 1; $j < strlen($params[$i]); $j++)
  112. {
  113. $pname = substr($params[$i], $j, 1);
  114. if (in_array($pname, $valued))
  115. {
  116. $value = substr($params[$i], $j + 1);
  117. break;
  118. }
  119. else if (($j + 1) != strlen($params[$i]))
  120. {
  121. $result[$pname] = true;
  122. }
  123. }
  124. }
  125. if ($value === true && in_array($pname, $valued) && isset($params[$i + 1]))
  126. {
  127. $value = $params[$i + 1];
  128. $i++;
  129. }
  130. $result[$pname] = $value;
  131. }
  132. else
  133. {
  134. $result['-'][] = $params[$i];
  135. }
  136. }
  137. self::$options = $result;
  138. self::$optind = 1;
  139. return $result;
  140. }
  141. /**
  142. * 取得命令行参数
  143. * 要求事先调用 parseOpt, 否则会自动以默认参数调用它。
  144. * @param string $short 短参数名
  145. * @param string $long 长参数名
  146. * @param bool $extra 是否补用默认顺序的参数
  147. * @return string 返回可用的参数值,若不存在则返回 null
  148. * @see parseOpt
  149. */
  150. public static function getOpt($short, $long = null, $extra = false)
  151. {
  152. if (self::$options === null)
  153. self::parseOpt();
  154. $value = null;
  155. $options = self::$options;
  156. if ($long !== null && isset($options[$long]))
  157. $value = $options[$long];
  158. else if ($short !== null && isset($options[$short]))
  159. $value = $options[$short];
  160. else if ($extra === true && isset($options['-'][self::$optind]))
  161. {
  162. $value = $options['-'][self::$optind];
  163. self::$optind++;
  164. }
  165. return $value;
  166. }
  167. /**
  168. * 刷新标准输出缓冲区
  169. */
  170. public static function flush()
  171. {
  172. flush();
  173. if (ob_get_level() > 0)
  174. ob_flush();
  175. }
  176. }