php計算位元組
㈠ 請教php漢字算2個位元組的問題
UTF-8的編碼,漢字算3個
㈡ php如何計算一段數據流的長度
blob取回來會是一個[字元串類型]的位元組串,用strlen獲得位元組數.
strlen()函數是沿用php2以來命名的函數,作用並不是統計字元數,而僅統計位元組byte數。
即使php7.x仍沿用strlen數位元組。
㈢ PHP獲取中英混合字元串長度的方法
今晚在寫框架的表單驗證類時,需要判斷某個字元串長度是否在指定區間內,很自然地,想到了PHP中的strlen函數。
.代碼如下:
$str
=
'Hello
world!';
echo
strlen($str); //
輸出12
然而在PHP自帶的函數中,strlen及mb_strlen都是通過計算字元串所佔位元組數來計算長度的,在不同的編碼情況下,中文所佔的位元組數是不同的。在GBK/GB2312下,中文字元佔2個位元組,而在UTF-8下,中文字元佔3個位元組。
.代碼如下:
$str
=
'你好,世界!';
echo
strlen($str); //
GBK或GB2312下輸出12,UTF-8下輸出18
而我們在判斷字元串長度時往往需要判斷的是字元的數量,而非字元串所佔位元組數,如在UTF-8下的這段PHP代碼:
.代碼如下:
$name
=
'張耕暢';
$len
=
strlen($name);
//
輸出
FALSE,因為在UTF-8下三個中文佔9個位元組
if($len
>=
3
&&
$len
<=
8){
echo
'TRUE';
}else{
echo
'FALSE';
}
那麼有什麼方便而實用的方法可以獲得含中文字元串的長度呢?可以用正則計算出中文字元的個數,在GBK/GB2312編碼下除以2,UTF-8編碼下則除以3,最後再加上非中文字元串的長度,但這樣未免太過麻煩。
WordPress這么一段代碼,借鑒如下:
.代碼如下:
$str
=
'Hello,世界!';
preg_match_all('/./us',
$str,
$match);
echo
count($match[0]); //
輸出9
思想是用正則表達式將字元串分割成單個字元,並直接用count計算出匹配到的字元數,便是我們想要的結果了。
但以上代碼在UTF-8編碼下並不能處理GBK/GB2312的中文字元串,因為GBK/GB2312的中文字元會被識別為兩個字元而計算出來的中文字元數量會翻倍,於是我想到了這么一個辦法:
.代碼如下:
$tmp
=
@iconv('gbk',
'utf-8',
$str);
if(!empty($tmp)){
$str
=
$tmp;
}
preg_match_all('/./us',
$str,
$match);
echo
count($match[0]);
可兼容GBK/GB2312及UTF-8編碼,經小量數據測試通過,但暫未確定是否完全正確,盼有大牛指點一二。
以上本意是為了框架可以兼容多種編碼格式,但一般在日常開發中,一個項目是已經可以確定為何種編碼的,因此可以使用以下函數來方便地獲取字元串長度:
.代碼如下:
int
iconv_strlen
(
string
$str
[,
string
$charset
=
ini_get("iconv.internal_encoding")
]
)
㈣ php strlen utf8一個中文算3個位元組嗎
utf8是變長編碼, 不一定是3位元組, 可能是2~3, 當然ASCII字元還是1位元組.gbk也是變長編碼, 非ASCII的2位元組, ASCII還是1位元組.這兩個編碼對於非ASCII字元, 都是多位元組的, 並且多位元組字元每個位元組都是>127的, 也就是負數(最高位是1).另外, PHP里的strlen不是依靠判斷字元串結尾的, 因為PHP是腳本語言, 它的字元串和C++的string是一樣的, 將存儲的位元組個數當作字元串長度.另外, PHP里想數數有多少個位元組用strlen, 想數數有多少個字元, 用mb系列函數, 自己去了解一下.還有些需求, 比如字元串匹配查找之類的, gbk是存在雙位元組匹配問題的, 兩個連續漢字的中間2個位元組可能被誤認為其他字元, 所以不能用strstr之類的位元組匹配函數(PHP里是純位元組匹配的, 不關心), 但utf-8是可以的, 它不會有類似的沖突, 另外最好的做法當然還是用mb系列, 安全可靠, 而且還支持猜編碼功能.
㈤ 求指教!,php如何把字元串轉化為位元組數組呢
將一個字元串分解成一個字元串數組,這種分割可能是基於某個字元,比如說是空格,逗號,分號之類的話,你可以用PHP的字元串分割函數 explode(),語法是PHP code?
1、array explode ( string separator, string string [, int limit])
函數的第一個參數是分割符,第二個就是字元串了,具體可以參考一下PHP手冊
2、
<?php
function string2bytes($str){
$bytes=array();
for ($i=0; $i < strlen($str); $i++) {
$tmp=substr($str, $i,1);
$bytes[]=bin2hex($tmp);
}
return $bytes;
}
$b=string2bytes("崑山二手車ello,world");
var_mp($b);
㈥ php怎麼判斷一個字所佔的位元組數
GB 18030的雙位元組部分完全採用了GBK的內碼系統。在此基礎上,做了四位元組擴展,四個位元組的編碼空間依次是:0x81到0xFE,0x30到0x39,0x81到0xFE,0x30到0x39。總共1,587,600個碼位
就是說你不能僅僅判斷一個位元組,如果第二個位元組的值是在0x30到0x39范圍里時,他就是4位元組的漢字了
㈦ PHP怎麼獲取字元串長度
PHP對中文字元串的處理一直困擾於剛剛接觸PHP開發的新手程序員。下面簡要的剖析一下PHP對中文字元串長度的處理:
(1)PHP自帶的函數如strlen()、mb_strlen()都是通過計算字元串所佔位元組數來統計字元串長度的,一個英文字元佔1位元組;
(2)中文則不然,做中文網站一般會選擇兩種編碼:gbk/gb2312或是utf-8。utf-8能兼容更多的字元,所以受到很多站長的喜愛。gbk與utf-8對中文的編碼不同,導致中文在gbk與utf-8編碼下所佔位元組也有差異。
㈧ php哪個函數能取得字元串長度
PHP對中文字元串的處理一直困擾於剛剛接觸PHP開發的新手程序員。下面簡要的剖析一下PHP對中文字元串長度的處理:
PHP自帶的函數如strlen()、mb_strlen()都是通過計算字元串所佔位元組數來統計字元串長度的,一個英文字元佔1位元組。
㈨ 利用PHP函數計算中英文字元串長度的方法
本文實例講述了利用PHP函數計算中英文字元串長度的方法。分享給大家供大家參考。具體實現方法如下:
一般來說大家知道英文字元佔一個位元組,而中文字元gbk占兩個字元,utf8佔三個字元,很多人印象中php計算字元串長度就是strlen()函數,其實不然,它計算的是位元組的長度而非字元的長度,那麼如何獲取一個字元串中字元的長度呢?還有有mb_strlen().
具體代碼如下:
復制代碼
代碼如下:echo
$str
=
'PHP點點通';
echo
strlen($str);
//3*1+3*3=12
echo
mb_strlen($str,
'gb2312');
//3*1+3*2=9
echo
mb_strlen($str,
'utf-8');
//6
㈩ php 幾個位元組 函數
有兩個函數可以取PHP字元串長度
----------------------------------------------------------------------
strlen — 獲取字元串長度
int strlen ( string $string )
返回給定的字元串 string 的長度。參數 string 需要計算長度的字元串。
返回值 成功則返回字元串 string 的長度;如果 string 為空,則返回 0。
----------------------------------------------------------------------
mb_strlen — 獲取字元串的長度 (PHP 4 >= 4.0.6, PHP 5)
mixed mb_strlen ( string $str [, string $encoding = mb_internal_encoding() ] )
獲取一個 string 的長度。
參數 str 要檢查長度的字元串。
encoding 參數為字元編碼。如果省略,則使用內部字元編碼。
返回值
返回具有 encoding 編碼的字元串 str 包含的字元數。 多位元組的字元被計為 1。
如果給定的 encoding 無效則返回 FALSE。
特別要注意的是:
有關中文的問題。PHP內置的字元串長度函數strlen無法正確處理中文字元串,它得到的只是字元串所佔的位元組數。對於GB2312的中文編碼,strlen得到的值是漢字個數的2倍,而對於UTF-8編碼的中文,就是3倍的差異了(在UTF-8編碼下,一個漢字佔3個位元組)。
採用mb_strlen函數可以較好地解決這個問題。mb_strlen的用法和strlen類似,只不過它有第二個可選參數用於指定字元編碼。例如得到UTF-8的字元串$str長度,可以用mb_strlen($str,'UTF-8')。如果省略第二個參數,則會使用PHP的內部編碼。內部編碼可以通過mb_internal_encoding()函數得到。需要注意的是,mb_strlen並不是PHP核心函數,使用前需要確保在php.ini中載入了php_mbstring.dll,即確保「extension=php_mbstring.dll」這一行存在並且沒有被注釋掉,否則會出現未定義函數的問題。