实时搜索: php 中文占用几个字节

php 中文占用几个字节

391条评论 3737人喜欢 1881次阅读 243人点赞
数据库中有这个字段,用sql语句直接可以查,但是php发送查询就查不了,数据表的格式是utf8_general_ci
php保存的utf-8,求解 , 字符串
$str = "中文abcd123${1,2,3,4,5}.jpg";
要求只提取{}中的内容,
不要只是这个字符串的哦,
要求其它同格式的字符串也能适用。
能不能不要那个大{}
只要里面的内容? ...

PHP如何获取中文字符串长度 utf8: PHP对中文字符串的处理一直困扰于刚刚接触PHP开发的新手程序员。下面简要的剖析一下PHP对中文字符串长度的处理:

PHP自带的函数如strlen()、mb_strlen()都是通过计算字符串所占字节数来统计字符串长度的,一个英文字符占1字节。例:

$enStr = ‘Hello,China!’;
echo strlen($enStr); // 输出:12

而中文则不然,做中文网站一般会选择两种编码:gbk/gb2312或是utf-8。utf-8能兼容更多的字符,所以受到很多站长的喜爱。gbk与utf-8对中文的编码不同,导致中文在gbk与utf-8编码下所占字节也有差异。

gbk编码下每个中文字符所占字节为2,例:

$zhStr = ‘您好,中国!’;
echo strlen($zhStr); // 输出:12

utf-8编码下每个中文字符所占字节为3,例:

$zhStr = ‘您好,中国!’;
echo strlen($zhStr); // 输出:18

那么如何计算这组中文字符串的长度呢?有人可能会说gbk下获取中文字符串长度除以2,utf-8编码下除以3不就行了吗?但是您要考虑字符串并不老实,99%的情况会以中英混合的情况出现。

这是WordPress中的一段代码,主要思想就是先用正则将字符串分解为个体单元,然后再计算单元的个数即字符串的长度,代码如下(只能处理utf-8编码下的字符串):

$zhStr = ‘您好,中国!’;
$str = ‘Hello,中国!’;

// 计算中文字符串长度
function utf8_strlen($string = null) {
// 将字符串分解为单元
preg_match_all(“/./us”, $string, $match);
// 返回单元个数
return count($match[0]);
}

echo utf8_strlen($zhStr); // 输出:6
echo utf8_strlen($str); // 输出:9

如何获得一个php变量储存在内存中占用的空间大小:   我们在前面的php高效写法提到,尽量不要复制变量,特别是数组。一般来说,PHP数组的内存利用率只有 1/10, 也就是说,一个在C语言里面100M 内存的数组,在PHP里面就要1G。下面我们可以粗略的估算PHP数组占用内存的大小,首先我们测试1000个元素的整数占用的内存:
  [php] view plain copy print?
  <?php
  echo memory_get_usage() , '<br>';
  $start = memory_get_usage();
  $a = Array();
  for ($i=0; $i<1000; $i++) {
  $a[$i] = $i + $i;
  }
  $mid = memory_get_usage();
  echo memory_get_usage() , '<br>';
  for ($i=1000; $i<2000; $i++) {
  $a[$i] = $i + $i;
  }
  $end = memory_get_usage();
  echo memory_get_usage() , '<br>';
  echo 'argv:', ($mid - $start)/1000 ,'bytes' , '<br>';echo 'argv:',($end - $mid)/1000 ,'bytes' , '<br>';输出是:
  353352
  437848
  522024
  argv:84.416bytes
  argv:84.176bytes
  大概了解1000
  个元素的整数数组需要占用 82k 内存,平均每个元素占用 84 个字节。而纯 C 中整体只需要 4k(一个整型占用4byte * 1000)。memory_get_usage() 返回的结果并不是全是被数组占用了,还要包括一些 PHP运行本身分配的一些结构,可能用内置函数生成的数组更接近真实的空间:
  [php] view plain copy print?
  <?php
  $start = memory_get_usage();
  $a = array_fill(0, 10000, 1);
  $mid = memory_get_usage(); //10k elements array;echo 'argv:', ($mid - $start )/10000,'byte' , '<br>';$b = array_fill(0, 10000, 1);
  $end = memory_get_usage(); //10k elements array;echo 'argv:', ($end - $mid)/10000 ,'byte' , '<br>';得到:
  argv:54.5792byte
  argv:54.5784byte
  从这个结果来看似乎一个数组元素大约占用了54个字节左右。
  首先看一下32位机C语言各种类型占用的字节:
  [cpp] view plain copy print?
  #include "stdafx.h"
  //#include <stdio.h>
  int main() {
  printf("int:%d\nlong:%d\ndouble:%d\nchar*:%d\nsize_t:%d\n",sizeof(int), sizeof(long),
  sizeof(double), sizeof(char *),
  sizeof(size_t));
  return 0;
  }
  int:4
  long:4
  double:8
  har*:4
  size_t:4
  在PHP中都使用long类型来代表数字,没有使用int类型大家都明白PHP是一种弱类型的语言,它不会去区分变量的类型,没有int float char *之类的概念。
  我们看看php在zend里面存储的变量,PHP中每个变量都有对应的 zval, Zval结构体定义在Zend/zend.h里面,其结构:
  [cpp] view plain copy print?
  typedef struct _zval_struct zval;
  struct _zval_struct {
  /* Variable information */
  zvalue_value value; /* The value 1 12字节(32位机是12,64位机需要8+4+4=16) */zend_uint refcount__gc; /* The number of references to this value (for GC) 4字节 */zend_uchar type; /* The active type 1字节*/zend_uchar is_ref__gc; /* Whether this value is a reference (&) 1字节*/};
  PHP使用一种UNION结构来存储变量的值,即zvalue_value 是一个union,UNION变量所占用的内存是由最大成员数据空间决定。
  [cpp] view plain copy print?
  typedef union _zvalue_value {
  long lval; /* long value */double dval; /* double value */struct { /* string value */char *val;
  int len;
  } str;
  HashTable *ht; /* hash table value */zend_object_value obj; /*object value */} zvalue_value;
  最大成员数据空间是struct str,指针占*val用4字节,INT占用4字节,共8字节。
  struct zval占用的空间为8+4+1+1 = 14字节,其实呢,在zval中数组,字符串和对象还需要另外的存储结构,数组则是一个 HashTable:
  HashTable结构体定义在Zend/zend_hash.h.
  [cpp] view plain copy print?
  typedef struct _hashtable {
  uint nTableSize;//4
  uint nTableMask;//4
  uint nNumOfElements;//4
  ulong nNextFreeElement;//4
  Bucket *pInternalPointer; /* Used for element traversal 4*/Bucket *pListHead;//4
  Bucket *pListTail;//4
  Bucket **arBuckets;//4
  dtor_func_t pDestructor;//4
  zend_bool persistent;//1
  unsigned char nApplyCount;//1
  zend_bool bApplyProtection;//1
  #if ZEND_DEBUG
  int inconsistent;//4
  #endif
  } HashTable;
  HashTable 结构需要 39 个字节,每个数组元素存储在 Bucket 结构中:
  [cpp] view plain copy print?
  typedef struct bucket {
  ulong h; /* Used for numeric indexing 4字节 */uint nKeyLength; /* The length of the key (for string keys) 4字节 */void *pData; /* 4字节*/
  void *pDataPtr; /* 4字节*/
  struct bucket *pListNext; /* PHP arrays are ordered. This gives the next element in that order4字节*/struct bucket *pListLast; /* and this gives the previous element 4字节 */struct bucket *pNext; /* The next element in this (doubly) linked list 4字节*/struct bucket *pLast; /* The previous element in this (doubly) linked list 4字节*/char arKey[1]; /* Must be last element 1字节*/} Bucket;
  Bucket
  结构需要 33 个字节,键长超过四个字节的部分附加在 Bucket 后面,而元素值很可能是一个 zval 结构,另外每个数组会分配一个由arBuckets 指向的 Bucket 指针数组, 虽然不能说每增加一个元素就需要一个指针,但是实际情况可能更糟。这么算来一个数组元素就会占用54 个字节,与上面的估算几乎一样。
  一个空数组至少会占用 14(zval) + 39(HashTable) + 33(arBuckets) = 86个字节,作为一个变量应该在符号表中有个位置,也是一个数组元素,因此一个空数组变量需要 118个字节来描述和存储。从空间的角度来看,小型数组平均代价较大,当然一个脚本中不会充斥数量很大的小型数组,可以以较小的空间代价来获取编程上的快捷。但如果将数组当作容器来使用就是另一番景象了,实际应用经常会遇到多维数组,而且元素居多。比如10k个元素的一维数组大概消耗540k内存,而10kx 10 的二维数组理论上只需要 6M 左右的空间,但是按照 memory_get_usage的结果则两倍于此,[10k,5,2]的三维数组居然消耗了23M,小型数组果然是划不来的。

php中判断字符串是否全是中文或含有中文的实现代码: <?php
 header('Content-type:text/html; charset=utf-8');
 $str = '你好';
 if(preg_match('/^[\x{4e00}-\x{9fa5}]+$/u', $str)>0){
  echo '全是中文';
 }elseif(preg_match('/[\x{4e00}-\x{9fa5}]/u', $str)>0){
  echo '含有中文';
 }
?>

php 向数据库发送中文字符无法查询?:

你的问题可能是数据库连接时未指定字符集:$conn->query("set names utf8");

详细如下:

将中文字符转换一下,可能你的网页编码是ansi非utf-8的:

$w=iconv("gb2312","utf-8",$w);

不过我不确定这样做你能否成功。关于字符有以下几点你看下:

数据库连接时: $conn->query("set names gbk");

数据库的字符集:建议建立数据库时就指定字符集,比如gbk或者utf-8,这样你就没必要为单独的表或者字段指定字符集

网页字符:<META CONTENT="text/html; charset=gbk" HTTP-EQUIV="Content-Type" />

 保持着三者使用的字符集一样,基本能解决你的问题。

当然,在使用ajax时。js传递过来的是utf-8,如果你的php文件和数据库使用的是中文字符集如gbk,gb2312,那么就需要对该值用iconv函数转换下字符集,如:$w=iconv("utf-8","gb2312",$w);

总之,需要这几块的字符集保持一致。

PHP中,关于把字符串拆分成数组的几个函数比较: <?php
$str="1|2|3|4|5|";
$var=explode("|",$str);
print_r($var);
?>
$var=explode("|",$str);
把$str按|进行分割
php还有其他的把字符串指定字符分割成数组
str_split(string,length)参数 描述
string 必需。规定要分割的字符串。
length 可选。规定每个数组元素的长度。默认是 1。
json_decode()这个函数也可以把字符串分割成数组 (第二个参数为true才行)

如何解决 php 用 fgetcsv 读取 csv 中文字符为乱码的问题: setlocale(LC_ALL, 'zh_CN');

PHP正则提取字符串: 有{} () [] <>可以
<?php
$str = '中文abcd123${1,2,3,4,5}.jpg[123123]444<44g>44.124(j)12g4';
$search ='/[{(\[<](.*?)[})\]>]/';
preg_match_all($search,$str,$r);
print_r($r[1]);
?>

php程序如何把中文字符转换为拼音: $source = "中国";$aim = new CUtf8_PY();echo $aim -> encode( $source , 'head');echo "\r\n";echo $aim -> encode( $source , 'all'); /** * PHP 汉字转拼音 * @author Jerryli(hzjerry@gmail.com) * @version V0.20140715 * @package SPFW.core.lib.final * @global SEA_PHP_FW_VAR_ENV * @example * echo CUtf8_PY::encode('阿里巴巴科技有限公司'); //编码为拼音首字母 * echo CUtf8_PY::encode('阿里巴巴科技有限公司', 'all'); //编码为全拼音 */class CUtf8_PY { /** * 拼音字符转换图 * @var array */ private static $_aMaps = array( 'a'=>-20319,'ai'=>-20317,'an'=>-20304,'ang'=>-20295,'ao'=>-20292, 'ba'=>-20283,'bai'=>-20265,'ban'=>-20257,'bang'=>-20242,'bao'=>-20230,'bei'=>-20051,'ben'=>-20036,'beng'=>-20032,'bi'=>-20026,'bian'=>-20002,'biao'=>-19990,'bie'=>-19986,'bin'=>-19982,'bing'=>-19976,'bo'=>-19805,'bu'=>-19784, 'ca'=>-19775,'cai'=>-19774,'can'=>-19763,'cang'=>-19756,'cao'=>-19751,'ce'=>-19746,'ceng'=>-19741,'cha'=>-19739,'chai'=>-19728,'chan'=>-19725,'chang'=>-19715,'chao'=>-19540,'che'=>-19531,'chen'=>-19525,'cheng'=>-19515,'chi'=>-19500,'chong'=>-19484,'chou'=>-19479,'chu'=>-19467,'chuai'=>-19289,'chuan'=>-19288,'chuang'=>-19281,'chui'=>-19275,'chun'=>-19270,'chuo'=>-19263,'ci'=>-19261,'cong'=>-19249,'cou'=>-19243,'cu'=>-19242,'cuan'=>-19238,'cui'=>-19235,'cun'=>-19227,'cuo'=>-19224, 'da'=>-19218,'dai'=>-19212,'dan'=>-19038,'dang'=>-19023,'dao'=>-19018,'de'=>-19006,'deng'=>-19003,'di'=>-18996,'dian'=>-18977,'diao'=>-18961,'die'=>-18952,'ding'=>-18783,'diu'=>-18774,'dong'=>-18773,'dou'=>-18763,'du'=>-18756,'duan'=>-18741,'dui'=>-18735,'dun'=>-18731,'duo'=>-18722, 'e'=>-18710,'en'=>-18697,'er'=>-18696, 'fa'=>-18526,'fan'=>-18518,'fang'=>-18501,'fei'=>-18490,'fen'=>-18478,'feng'=>-18463,'fo'=>-18448,'fou'=>-18447,'fu'=>-18446, 'ga'=>-18239,'gai'=>-18237,'gan'=>-18231,'gang'=>-18220,'gao'=>-18211,'ge'=>-18201,'gei'=>-18184,'gen'=>-18183,'geng'=>-18181,'gong'=>-18012,'gou'=>-17997,'gu'=>-17988,'gua'=>-17970,'guai'=>-17964,'guan'=>-17961,'guang'=>-17950,'gui'=>-17947,'gun'=>-17931,'guo'=>-17928, 'ha'=>-17922,'hai'=>-17759,'han'=>-17752,'hang'=>-17733,'hao'=>-17730,'he'=>-17721,'hei'=>-17703,'hen'=>-17701,'heng'=>-17697,'hong'=>-17692,'hou'=>-17683,'hu'=>-17676,'hua'=>-17496,'huai'=>-17487,'huan'=>-17482,'huang'=>-17468,'hui'=>-17454,'hun'=>-17433,'huo'=>-17427, 'ji'=>-17417,'jia'=>-17202,'jian'=>-17185,'jiang'=>-16983,'jiao'=>-16970,'jie'=>-16942,'jin'=>-16915,'jing'=>-16733,'jiong'=>-16708,'jiu'=>-16706,'ju'=>-16689,'juan'=>-16664,'jue'=>-16657,'jun'=>-16647, 'ka'=>-16474,'kai'=>-16470,'kan'=>-16465,'kang'=>-16459,'kao'=>-16452,'ke'=>-16448,'ken'=>-16433,'keng'=>-16429,'kong'=>-16427,'kou'=>-16423,'ku'=>-16419,'kua'=>-16412,'kuai'=>-16407,'kuan'=>-16403,'kuang'=>-16401,'kui'=>-16393,'kun'=>-16220,'kuo'=>-16216, 'la'=>-16212,'lai'=>-16205,'lan'=>-16202,'lang'=>-16187,'lao'=>-16180,'le'=>-16171,'lei'=>-16169,'leng'=>-16158,'li'=>-16155,'lia'=>-15959,'lian'=>-15958,'liang'=>-15944,'liao'=>-15933,'lie'=>-15920,'lin'=>-15915,'ling'=>-15903,'liu'=>-15889,'long'=>-15878,'lou'=>-15707,'lu'=>-15701,'lv'=>-15681,'luan'=>-15667,'lue'=>-15661,'lun'=>-15659,'luo'=>-15652, 'ma'=>-15640,'mai'=>-15631,'man'=>-15625,'mang'=>-15454,'mao'=>-15448,'me'=>-15436,'mei'=>-15435,'men'=>-15419,'meng'=>-15416,'mi'=>-15408,'mian'=>-15394,'miao'=>-15385,'mie'=>-15377,'min'=>-15375,'ming'=>-15369,'miu'=>-15363,'mo'=>-15362,'mou'=>-15183,'mu'=>-15180, 'na'=>-15165,'nai'=>-15158,'nan'=>-15153,'nang'=>-15150,'nao'=>-15149,'ne'=>-15144,'nei'=>-15143,'nen'=>-15141,'neng'=>-15140,'ni'=>-15139,'nian'=>-15128,'niang'=>-15121,'niao'=>-15119,'nie'=>-15117,'nin'=>-15110,'ning'=>-15109,'niu'=>-14941,'nong'=>-14937,'nu'=>-14933,'nv'=>-14930,'nuan'=>-14929,'nue'=>-14928,'nuo'=>-14926, 'o'=>-14922,'ou'=>-14921, 'pa'=>-14914,'pai'=>-14908,'pan'=>-14902,'pang'=>-14894,'pao'=>-14889,'pei'=>-14882,'pen'=>-14873,'peng'=>-14871,'pi'=>-14857,'pian'=>-14678,'piao'=>-14674,'pie'=>-14670,'pin'=>-14668,'ping'=>-14663,'po'=>-14654,'pu'=>-14645, 'qi'=>-14630,'qia'=>-14594,'qian'=>-14429,'qiang'=>-14407,'qiao'=>-14399,'qie'=>-14384,'qin'=>-14379,'qing'=>-14368,'qiong'=>-14355,'qiu'=>-14353,'qu'=>-14345,'quan'=>-14170,'que'=>-14159,'qun'=>-14151, 'ran'=>-14149,'rang'=>-14145,'rao'=>-14140,'re'=>-14137,'ren'=>-14135,'reng'=>-14125,'ri'=>-14123,'rong'=>-14122,'rou'=>-14112,'ru'=>-14109,'ruan'=>-14099,'rui'=>-14097,'run'=>-14094,'ruo'=>-14092, 'sa'=>-14090,'sai'=>-14087,'san'=>-14083,'sang'=>-13917,'sao'=>-13914,'se'=>-13910,'sen'=>-13907,'seng'=>-13906,'sha'=>-13905,'shai'=>-13896,'shan'=>-13894,'shang'=>-13878,'shao'=>-13870,'she'=>-13859,'shen'=>-13847,'sheng'=>-13831,'shi'=>-13658,'shou'=>-13611,'shu'=>-13601,'shua'=>-13406,'shuai'=>-13404,'shuan'=>-13400,'shuang'=>-13398,'shui'=>-13395,'shun'=>-13391,'shuo'=>-13387,'si'=>-13383,'song'=>-13367,'sou'=>-13359,'su'=>-13356,'suan'=>-13343,'sui'=>-13340,'sun'=>-13329,'suo'=>-13326, 'ta'=>-13318,'tai'=>-13147,'tan'=>-13138,'tang'=>-13120,'tao'=>-13107,'te'=>-13096,'teng'=>-13095,'ti'=>-13091,'tian'=>-13076,'tiao'=>-13068,'tie'=>-13063,'ting'=>-13060,'tong'=>-12888,'tou'=>-12875,'tu'=>-12871,'tuan'=>-12860,'tui'=>-12858,'tun'=>-12852,'tuo'=>-12849, 'wa'=>-12838,'wai'=>-12831,'wan'=>-12829,'wang'=>-12812,'wei'=>-12802,'wen'=>-12607,'weng'=>-12597,'wo'=>-12594,'wu'=>-12585, 'xi'=>-12556,'xia'=>-12359,'xian'=>-12346,'xiang'=>-12320,'xiao'=>-12300,'xie'=>-12120,'xin'=>-12099,'xing'=>-12089,'xiong'=>-12074,'xiu'=>-12067,'xu'=>-12058,'xuan'=>-12039,'xue'=>-11867,'xun'=>-11861, 'ya'=>-11847,'yan'=>-11831,'yang'=>-11798,'yao'=>-11781,'ye'=>-11604,'yi'=>-11589,'yin'=>-11536,'ying'=>-11358,'yo'=>-11340,'yong'=>-11339,'you'=>-11324,'yu'=>-11303,'yuan'=>-11097,'yue'=>-11077,'yun'=>-11067, 'za'=>-11055,'zai'=>-11052,'zan'=>-11045,'zang'=>-11041,'zao'=>-11038,'ze'=>-11024,'zei'=>-11020,'zen'=>-11019,'zeng'=>-11018,'zha'=>-11014,'zhai'=>-10838,'zhan'=>-10832,'zhang'=>-10815,'zhao'=>-10800,'zhe'=>-10790,'zhen'=>-10780,'zheng'=>-10764,'zhi'=>-10587,'zhong'=>-10544,'zhou'=>-10533,'zhu'=>-10519,'zhua'=>-10331,'zhuai'=>-10329,'zhuan'=>-10328,'zhuang'=>-10322,'zhui'=>-10315,'zhun'=>-10309,'zhuo'=>-10307,'zi'=>-10296,'zong'=>-10281,'zou'=>-10274,'zu'=>-10270,'zuan'=>-10262,'zui'=>-10260,'zun'=>-10256,'zuo'=>-10254 ); /** * 将中文编码成拼音 * @param string $utf8Data utf8字符集数据 * @param string $sRetFormat 返回格式 [head:首字母|all:全拼音] * @return string */ public static function encode($utf8Data, $sRetFormat='head'){ $sGBK = iconv('UTF-8', 'GBK', $utf8Data); $aBuf = array(); for ($i=0, $iLoop=strlen($sGBK); $i<$iLoop; $i++) { $iChr = ord($sGBK{$i}); if ($iChr>160) $iChr = ($iChr<<8) + ord($sGBK{++$i}) - 65536; if ('head' === $sRetFormat) $aBuf[] = substr(self::zh2py($iChr),0,1); else $aBuf[] = self::zh2py($iChr); } if ('head' === $sRetFormat) return implode('', $aBuf); else return implode(' ', $aBuf); } /** * 中文转换到拼音(每次处理一个字符) * @param number $iWORD 待处理字符双字节 * @return string 拼音 */ private static function zh2py($iWORD) { if($iWORD>0 && $iWORD<160 ) { return chr($iWORD); } elseif ($iWORD<-20319||$iWORD>-10247) { return ''; } else { foreach (self::$_aMaps as $py => $code) { if($code > $iWORD) break; $result = $py; } return $result; } }}

  • 20是几个几和几个几组成的

    QQ登陆界面打不开: 检测到QQ运行环境异常,继续使用可能存在安全隐患,建议尝试重新安装QQ 错误 0x00008008以上问题,请按如下操作步骤提供日志文件,发送到邮箱706060707@qq.com,以便我们分析原因、修复可能存在的B...

    451条评论 1692人喜欢 6382次阅读 722人点赞
  • 昆山第一人民医院入职常规体检多少钱

    QQ虚假登陆界面: 用e语言简单编写就可以 ...

    983条评论 4276人喜欢 2687次阅读 295人点赞
  • ping多少不卡

    QQ登陆的4399,那账号密码是什么:  QQ密码一般6~16个字符,电脑高达18位  一般密码格式都为有规律的密码,这个比较好记,比如:  1、生日,很多人都把自己的生日作为QQ密码,就是以防忘记,密码又好记  2、手机号码,这也是常常被设置为QQ密码的...

    377条评论 1998人喜欢 4645次阅读 745人点赞
  • paris是什么牌子

    野史中的明太祖朱元璋是一个怎样的人物:   后世人们知道的历史大多都是经过史官修改过的正史,一些不为人所知的事情并没有记载下来,而这些事件即使流传下来,一般也只是以野史的方式存在。一般来说,野史攥写的极为粗陋不过却更有真实性。而朱元璋野史中有不少关于他的故...

    327条评论 1750人喜欢 1425次阅读 976人点赞
  • 身上长痱子怎么办

    4399账号绑定了qq怎么修改密码: 4399账号绑定了qq或微博之后是无法直接修改密码的。修改密码时会遇到这提示:要修改密码只能通过账号原有的注册邮箱、密保或申诉进行密码找回。而且完成密码找回操作后,账号会自动与qq、微博解除绑定。 ...

    733条评论 1287人喜欢 4530次阅读 568人点赞