首頁 後端開發 php教程 php 中文字符串截取有关问题?

php 中文字符串截取有关问题?

Jun 13, 2016 am 10:21 AM
quot str string substr

php 中文字符串截取问题???
因为用substr()函数截取中文字符串会出现问题,所以我就上网找了一个函数,如下:

PHP code
<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->//中文字符串截取无乱码函数function cut_str($string, $start, $length) {   if(strlen($string)>$length){      $str = null;      $len = $start+$length;      for($i=$start;$i0xa0){           $str.=substr($string,$i,2);           $i++;        }else{            $str.=substr($string,$i,1);          }   }        return $str.'...';   }else{        return $string;   }}    
登入後複製

但是用过之后还是会出现问题,比如我截取的是“利用滤镜及图层样式制作逼真的石块字”,
PHP code
<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->$str = "利用滤镜及图层样式制作逼真的石块字";cut_str($str,0,50);
登入後複製


但是效果出来了却是这样的:“利用滤镜及图层样式制作逼真的石块?...”,除了个问号一样的字符,我郁闷啊,上网查了一下,汉子在utf-8编码中一般占3个字节,但是这个函数中这里“$str.=substr($string,$i,2);”却截取2,这是什么意思呢??始终没有弄明啊。。。。如果我把2改成3后,那句就会变成“利?甔?滻??镜?及?图?山??样?弼??制?佽??逼?眜?的?石?坝?字...”,唉,,,真的被它搞败了,哪位大侠救救我啊。。。。。。。。。

------解决方案--------------------
怎么不用mb_substr()函数
------解决方案--------------------
你要确定你的编码。截取时指定编码。
------解决方案--------------------
它是以字节计算的。gbk编码。一个中文等于2个字节。
------解决方案--------------------
当然是mb_substr了,楼主对编码看样不太懂。。。

utf8中文编码2-3个字符很常见,但非ASCII字符的单字节一定是第7位为1的,与ASCII单字节是不冲突的,GBK码也是类似的。

请用mb_substr,它会自动根据utf8编码范围识别多字节字符的。
------解决方案--------------------
这个函数只适用于gbk编码

探讨

哈哈,研究了下手册,刚搞定,就是你说的,确定一下编码,但是我想知道那个函数为啥不行啊??那个貌似是php面试的答案诶。前辈能否指点一二,特别是那里的2,utf-8中汉子明明是3-4个字符啊,而且常用的是3个字符啊。。。。。麻烦了

------解决方案--------------------
PHP code
/**************************** * subCNchar() 截取汉字 * * [$str]     [要截取的字符串] * [$start]   [截取的起始位置] * [$length]  [要截取的长度] * [$charset] [字符串编码] ****************************/function subCNchar($str, $start = 0, $length, $charset = "utf-8") {    if (strlen($str) <font color="#e78608">------解决方案--------------------</font><br>为什么不能在后面加上.....<br>echo mb_strlen($str,'utf-8')>10 ? mb_substr($str,0,10,'utf-8').'...' : $str;<br><font color="#e78608">------解决方案--------------------</font><br>加"..."见12楼,  <br><br>如果你非要改这个函数,utf8的编码很有规律,就是下面几种,除ascii码部分外,<br>第一个字节都是11开头,连续的1的个数代表了总字节数,后续字节都是10开头<br>其中汉字基本在3个字节的区.  <br>知道了这个规律,写个函数应该很容易吧?<br>U+007F	   0xxxxxxx<br>U+07FF	   110xxxxx 10xxxxxx<br>U+FFFF	   1110xxxx 10xxxxxx 10xxxxxx<br>U+1FFFFF   11110xxx 10xxxxxx 10xxxxxx 10xxxxxx<br>U+3FFFFFF  111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx<br>U+7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx<br><br><br><br>
登入後複製
探讨

那这个函数能不能改成utf-8的??mb_substr()貌似不能在未输出完的字符结尾加上“...”诶,这样影响效果,求解

------解决方案--------------------
你可以用mb_strimwidth函数
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

使用java的String.valueOf()函數將基本資料型別轉換為字串 使用java的String.valueOf()函數將基本資料型別轉換為字串 Jul 24, 2023 pm 07:55 PM

使用Java的String.valueOf()函數將基本資料型別轉換為字串在Java開發中,當我們需要將基本資料型別轉換為字串時,常見的方法是使用String類別的valueOf()函數。這個函數可以接受基本資料類型的參數,並傳回對應的字串表示。在本文中,我們將探討如何使用String.valueOf()函數進行基本資料型別轉換,並提供一些程式碼範例來

怎麼把char數組轉string 怎麼把char數組轉string Jun 09, 2023 am 10:04 AM

char陣列轉string的方法:可以透過賦值來實現,使用{char a[]=" abc d\0efg ";string s=a;}語法,讓char陣列對string直接賦值,執行程式碼即可完成轉換。

使用java的String.replace()函數替換字串中的字元(字串) 使用java的String.replace()函數替換字串中的字元(字串) Jul 25, 2023 pm 05:16 PM

使用Java的String.replace()函數替換字串中的字元(字串)在Java中,字串是不可變的對象,這意味著一旦創建了一個字串對象,就無法修改它的值。但是,你可能會遇到需要替換字串中的某些字元或字串的情況。這時候,我們可以使用Java的String類別中的replace()方法來實作字串的替換。 String類別的replace()方法有兩種重

2w字 詳解 String,yyds 2w字 詳解 String,yyds Aug 24, 2023 pm 03:56 PM

大家好,今天跟大家分享java基礎之String。 String類別的重要性就不必說了,可以說是我們後端開發用的最多的類,所以,很有必要好好聊聊它。

使用java的String.length()函數取得字串的長度 使用java的String.length()函數取得字串的長度 Jul 25, 2023 am 09:09 AM

使用Java的String.length()函數取得字串的長度在Java程式設計中,字串是一種非常常見的資料類型,我們經常需要取得字串的長度,即字串中字元的個數。在Java中,我們可以使用String類別的length()函數來取得字串的長度。下面是一個簡單的範例程式碼:publicclassStringLengthExample{publ

Golang函數的byte、rune和string型轉換技巧 Golang函數的byte、rune和string型轉換技巧 May 17, 2023 am 08:21 AM

在Golang程式設計中,byte、rune和string類型是非常基礎、常見的資料型別。它們在處理字串、檔案流等資料操作時發揮著重要作用。而在進行這些資料操作時,我們通常需要對它們進行相互的轉換,這就需要掌握一些轉換技巧。本文將介紹Golang函數的byte、rune和string類型轉換技巧,旨在幫助讀者更好地理解這些資料類型,並能夠熟練地在程式設計實踐中應用

java的String類別如何使用 java的String類別如何使用 Apr 19, 2023 pm 01:19 PM

一、認識String1.JDK中的String首先我們看看JDK中的String類別源碼,它實作了很多接口,可以看到String類別被final修飾了,這就說明String類別不可以被繼承,String不存在子類,這樣所有使用JDK的人,用到的String類別都是同一個,如果String允許被繼承,每個人都可以對String進行擴展,每個人使用的String不是同一個版本,兩個不同的人使用相同的方法,表現出不同的結果,這就導致程式碼沒辦法進行開發了繼承和方法覆寫在帶來彈性的同時,也會帶來很多子類別行為不

使用java的String.toLowerCase()函數將字串轉換為小寫 使用java的String.toLowerCase()函數將字串轉換為小寫 Jul 24, 2023 pm 11:52 PM

String.toLowerCase()函數是Java中一個非常有用且常見的字串處理函數,它可以將一個字串轉換為小寫形式。在本文中,我們將介紹該函數的使用方法,並給出一些相關的程式碼範例。首先,讓我們來看看String.toLowerCase()函數的基本語法。它沒有任何參數,只需要呼叫它。下面是範例程式碼:Stringstr="Hel

See all articles