php計算中英混輸字符串長度,php字符串處理函數

本文目錄一覽:

PHP字符串長度計算 – strlen()函數使用介紹

strlen()函數和mb_strlen()函數

在PHP中,函數strlen()返回字符串的長度。函數原型如下:

複製代碼

代碼如下:

int

strlen(string

string_input);

參數string_input為要處理的字符串。

strlen()函數返回字符串所佔的位元組長度,一個英文字母、數字、各種符號均佔一個位元組,它們的長度均為1。一個中午字符佔兩個位元組,所以一個中午字符的長度是2。例如

複製代碼

代碼如下:

?php

echo

strlen(“”);

echo

strlen(“三知開發網”);

?

「echo

strlen(“”);」的運行結果:15

「echo

strlen(“三知開發網”);」的運行結果:15

這裡有一個疑問,一個中文字符不是佔2個位元組嗎?「三知開發網」,明明是五個漢字,運行的結果怎麼會是15?

原因出在這裡:strlen()計算時,對於一個UTF-8的中文字符,會把它當做長度為3來處理。當出現中英文混排的情況下,怎麼準確的計算字符串的長度呢?這裡,得引入另外一個函數mb_strlen()。mb_strlen()函數的用法與strlen()幾乎一摸一樣,只是多了一個指定字符集編碼的參數。函數原型為:

複製代碼

代碼如下:

int

mb_strlen(string

string_input,

string

encode);

PHP內置的字符串長度函數strlen無法正確處理中文字符串,它得到的只是字符串所佔的位元組數。對於GB2312的中文編碼,strlen得到的值是漢字個數的2倍,而對於UTF-8編碼的中文,就是3倍的差異了(在UTF-8編碼下,一個漢字佔3個位元組)。

因此,下面的代碼能準確計算出中文字符串的長度:

複製代碼

代碼如下:

?php

$str

=

“三知sunchis開發網”;

echo

strlen($str).”br”;

//結果:22

echo

mb_strlen($str,”UTF8″).”br”;

//結果:12

$strlen

=

(strlen($str)+mb_strlen($str,”UTF8″))/2;

echo

$strlen;

//結果:17

?

原理分析:

strlen()計算時,對待UTF-8的中文字符長度是3,所以「三知sunchis開發網」的長度為5×3+7×1=22

在mb_strlen計算時,選定內碼為UTF8,則會將一個中文字符當作長度1來計算,所以「三知sunchis開發網」長度為5×1+7×1=12

剩下的就是純數學問題了,在此就不啰嗦了……

注意:對於mb_strlen($str,’UTF-8′),如果省略第二個參數,則會使用PHP的內部編碼。內部編碼可以通過mb_internal_encoding()函數得到。需要注意的是,mb_strlen並不是PHP核心函數,使用前需要確保在php.ini中加載了php_mbstring.dll,即確保「extension=php_mbstring.dll」這一行存在並且沒有被注釋掉,否則會出現未定義函數的問題。

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 中如何獲得中英文混合字符串長度

$str=’中文a字1符’;

echo strlen($str);

echo ‘br /’;

echo mb_strlen($str,’UTF8′);

利用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

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/286167.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-22 16:07
下一篇 2024-12-22 16:07

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python中capitalize函數的使用

    在Python的字符串操作中,capitalize函數常常被用到,這個函數可以使字符串中的第一個單詞首字母大寫,其餘字母小寫。在本文中,我們將從以下幾個方面對capitalize函…

    編程 2025-04-29
  • Python字符串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字符串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字符串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • Python中將字符串轉化為浮點數

    本文將介紹在Python中將字符串轉化為浮點數的常用方法。在介紹方法之前,我們先來思考一下這個問題應該如何解決。 一、eval函數 在Python中,最簡單、最常用的將字符串轉化為…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • 單片機打印函數

    單片機打印是指通過串口或並口將一些數據打印到終端設備上。在單片機應用中,打印非常重要。正確的打印數據可以讓我們知道單片機運行的狀態,方便我們進行調試;錯誤的打印數據可以幫助我們快速…

    編程 2025-04-29
  • 三角函數用英語怎麼說

    三角函數,即三角比函數,是指在一個銳角三角形中某一角的對邊、鄰邊之比。在數學中,三角函數包括正弦、餘弦、正切等,它們在數學、物理、工程和計算機等領域都得到了廣泛的應用。 一、正弦函…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變量時顯示的指定變量類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • Python實現計算階乘的函數

    本文將介紹如何使用Python定義函數fact(n),計算n的階乘。 一、什麼是階乘 階乘指從1乘到指定數之間所有整數的乘積。如:5! = 5 * 4 * 3 * 2 * 1 = …

    編程 2025-04-29

發表回復

登錄後才能評論