本文目錄一覽:
- 1、請問下php怎麼處理截取字元串出現的亂碼問題
- 2、php中字元串變數亂碼問題
- 3、PHP 中用 explode 函數切割中文字元串,會出現亂碼.如何解決
- 4、PHP中使用substr截取字元串出現中文亂碼問題該怎麼辦
- 5、同一個PHP文件中用substr_replace函數時出現亂碼問題,用str_ireplace函數時正常,究竟問題出在哪兒了
請問下php怎麼處理截取字元串出現的亂碼問題
利用php內置方法mb_substr截取不亂碼;
1、GBK編碼截取示例:
$str
=
‘我是誰’;
//gbk編碼的字元串
echo
mb_substr($str,
0,
1,
‘gbk’);
//輸出
我
mb_substr方法比substr多一個參數,用來指定字元串編碼。
2、utf-8編碼截取示例:
[code]
$str
=
‘我abc是誰’;
//utf-8編碼的字元串
echo
mb_substr($str,
0,
2,
‘utf-8’);
//輸出
我a
[/code]
中英混合也完全沒有問題。
php中字元串變數亂碼問題
在做php類型的web程序時,文件亂碼都是由編碼問題造成的 影響這個因素有四個地方:
1. 文件本身的編碼 我們在用記事本或者editplus dw utraledit一類的工具保存文件的時候可以選擇的 記事本默認是ansi 另外還有utf8一類的選項
2. html文件的編碼 就是頁面上 meta charset=「gb2312」 這樣的
3.資料庫的編碼 就是在建立資料庫的時候選擇的 如果是中文的你可以選擇 gb2312 或者是 gbk
4.程序和資料庫連接時候的編碼 就是你說的 「set names gb2312實現的功能」
只要這四個方面都正確協調 就不會出現任何問題 當然有時候我們的一些設置可能有問題 但是也不影響程序的運行 比如資料庫方面 錯著進去 錯著出來【換句話說怎麼進去怎麼出來 雖然在裡面的時候不對 但是出來還是對的】 程序也能正常跑起來 但是從嚴格上講 這是不合適的
根據上面的分析 你的描述 我想可能是你的文件類型 保存成了utf 或者 unicode類型的
PHP 中用 explode 函數切割中文字元串,會出現亂碼.如何解決
亂碼指的是計算機系統不能顯示正確的字元,而顯示其他無意義的字元或空白,如一堆ASCII Code。所顯示出來的文字統稱為亂碼。亂碼是因為所使用的字元的源碼在本地計算機上使用了錯誤的顯示字型檔,或在本地計算機的字型檔中找不到相應於源碼所指代的字元所致。
通俗點講:
亂碼就是你打開王頁或郵箱,裡面的字不是全中文的,而是一些亂七八糟莫名其妙的無意義的字元組合在一起。主要是計算機的字型檔出錯所致。
1一般出現在網頁,用網頁上面的查看——編碼——簡體中文即可解決。
2 出現亂碼一般是Windows系統字型檔的問題,可能是系統錯誤或不正常關機造成的,也可能是某些軟體需要使用操作系統以外的字型檔造成的。解決辦法得看具體的問題,一般情況下的Windows亂碼可以通過以下三種方法解決。
第一種方法是下載 解決Windows XP SP2亂碼補丁 V1.00 (華軍軟體園)
第二種是解決Windows系統錯誤造成的亂碼問題,重啟後用F8鍵激活系統菜單,進入安全模式。等系統檢查完畢,硬碟沒有響應後再重新正常退出並重新啟動計算機,正常進入Windows,字體一般就能自動恢復。這是因為Windows在進入安全模式時會重新索引字型檔及整理菜單。
第三種解決方法用於修正軟體造成的註冊表中關於字體部分設置出錯的問題。運行「Regedit」啟動註冊表編輯器。在「HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\fontassoc」鍵下有 「Associated CharSet」和「Associated DefaultFonts」 兩個鍵。當出現漢字亂碼時,這兩個鍵中的內容就可能不正確甚至不完整。它們的正確內容應該是「Associated CharSet」內有「(默認)、ANSI(00)、GB2312(86)、OEM(FF)、SYMBOL(02)」幾項串值,鍵值分別為「(未設置鍵值)、Yes、Yes、Yes、No」,而「Associated DefaultFonts」內有「(默認)、AssocSystemFont、FontPackegeDecorative、FontPackegeDontCare、FontPackegeModern、FontPackegeRoman、FontPackegeScript、FontPackegeSwiss」幾項串值,鍵值分別為「(未設置鍵值)、simsun.ttf、宋體、宋體、宋體、宋體、宋體、宋體」。重新啟動系統後漢字就應該顯示正確了。建議您在修改前先備份註冊表,以防修改錯誤使系統出現問題。
PHP中使用substr截取字元串出現中文亂碼問題該怎麼辦
在PHP程序開發中,經常會執行字元串的截取操作,比如輸出信息列表時,標題不宜過長,列印文章摘要時,也要執行一系列的字元串截取操作。遇到這些需求時,我們經常會想到使用substr()方法來實現,substr()對全英文字元串的截取是比較適合的。
但字元串只要出現中文字元,就有可能導致PHP
substr中文亂碼,因為中文UTF-8編碼,每個漢字佔3位元組,而GB2312佔2位元組,英文佔1位元組,截取位數不準確,substr()硬生生地將
一個中文字元「鋸」成兩半,造成斷開的字元會把其後的..拉過來一起做一個字,所以出現了PHP substr中文亂碼。
substr — 取得部份字元串
語法 : string substr (string string, int start [, int length])
說明 :
substr( )傳回 string的一部份字元串,由參數 start和 length指定。
如果 start是正數,傳回的字元串將會從 string的第 start個字元開始。
Example :
?php
$rest = substr (“abcdef”, 1); // returns “bcdef”
$rest = substr (“abcdef”, 1, 3); // returns “bcd”
?
如果 start是負數,傳回的字元串將會從 string結尾的第 start個字開始。
Example :
?php
$rest = substr (“abcdef”, -1); // returns “f”
$rest = substr (“abcdef”, -2); // returns “ef”
$rest = substr (“abcdef”, -3, 1); // returns “d”
?
如果有給予參數 length而且是正數時,傳回的字元串將會從 start傳回 length個字元。
如果有給予參數 length而且是負數時,傳回的字元串將會結束於 string結尾的第 length個字元。
Example :
?php
$rest = substr (“abcdef”, 1, -1); // returns “bcde”
?
對於英文沒有問題,我們測試一個中文
?php
$rest = substr (“中國人”, 1, -1); // returns “fdsafsda” 就是亂碼了
?
這種截取字元的結果,肯定不是我們想要的結果,這種出現PHP substr中文亂碼的情況,可能會導致程序無法正常運行。解決辦法主要有兩種:
一、使用mbstring擴展庫的mb_substr()截取就不會出現亂碼了。
可以用mb_substr()/mb_strcut()這個函數,mb_substr()/mb_strcut()的用法與substr()相似,
只是在mb_substr()/mb_strcut最後要加入多一個參數,以設定字元串的編碼,但是一般的伺服器都沒打開
php_mbstring.dll,需要在php.ini在把php_mbstring.dll打開。
?php
echo mb_substr(“php中文字元encode”,0,4,”utf-8″);
?
如果未指定最後一個編碼參數,會是三個位元組為一個中文,這就是utf-8編碼的特點,若加上utf-8字符集說明,所以,是以一個字為單位來截取的。
使用的時候要注意php文件的編碼,和網頁顯示時的編碼。使用這個mb_substr方法要事先知道字元串的編碼,如果不知道編碼,就需要判斷,mbstring庫還提供了mb_check_encoding來檢驗字元串編碼,但還不完善。
PHP 自帶幾種字元串截取函數,其中常用到的就是 substr 和 mb_substr。前者在處理中文時,GBK 為 2 個長度單位,UTF 為 3 個長度單位,後者指定編碼後,一個中文即為 1 個長度單位。
substr 有時會截 1/3 個中文或半個中文,會顯示亂碼,相對來說 mb_substr 更適合我們使用。不過有時候 mb_substr
就顯得不那麼好用了。例如我要顯示一個小圖片的簡要信息,5 個中文正好,超過 5 個就截取前4再加上
」…」,這樣處理中文是沒問題了,可是處理英文或數字,這樣截取就太短了。
二、自己書寫截取函數,但效率不如用mbstring擴展庫來得高。下面是ecshop裡面的截取UTF-8編碼下字元串的函數。
function sub_str($str, $length = , $append = true)
{
$str = trim($str);
$strlength = strlen($str);
if ($length == || $length = $strlength)
{
return $str; //截取長度等於或大於等於本字元串的長度,返回字元串本身
}
elseif ($length ) //如果截取長度為負數
{
$length = $strlength + $length;//那麼截取長度就等於字元串長度減去截取長度
if ($length )
{
$length = $strlength;//如果截取長度的絕對值大於字元串本身長度,則截取長度取字元串本身的長度
}
}
if (function_exists(‘mb_substr’))
{
$newstr = mb_substr($str, , $length, EC_CHARSET);
}
elseif (function_exists(‘iconv_substr’))
{
$newstr = iconv_substr($str, , $length, EC_CHARSET);
}
else
{
//$newstr = trim_right(substr($str, , $length));
$newstr = substr($str, , $length);
}
if ($append $str != $newstr)
{
$newstr .= ‘…’;
}
return $newstr;
}
同一個PHP文件中用substr_replace函數時出現亂碼問題,用str_ireplace函數時正常,究竟問題出在哪兒了
需要從寫 該函數
if($length strlen($string) $length) {
//截斷字元
$wordscut = ”;
if(strtolower($encoding) == ‘utf-8’) {
//utf8編碼
$n = 0;
$tn = 0;
$noc = 0;
while ($n strlen($string)) {
$t = ord($string[$n]);
if($t == 9 || $t == 10 || (32 = $t $t = 126)) {
$tn = 1;
$n++;
$noc++;
} elseif(194 = $t $t = 223) {
$tn = 2;
$n += 2;
$noc += 2;
} elseif(224 = $t $t 239) {
$tn = 3;
$n += 3;
$noc += 2;
} elseif(240 = $t $t = 247) {
$tn = 4;
$n += 4;
$noc += 2;
} elseif(248 = $t $t = 251) {
$tn = 5;
$n += 5;
$noc += 2;
} elseif($t == 252 || $t == 253) {
$tn = 6;
$n += 6;
$noc += 2;
} else {
$n++;
}
if ($noc = $length) {
break;
}
}
if ($noc $length) {
$n -= $tn;
}
$wordscut = substr($string, 0, $n);
} else {
for($i = 0; $i $length – 1; $i++) {
if(ord($string[$i]) 127) {
$wordscut .= $string[$i].$string[$i + 1];
$i++;
} else {
$wordscut .= $string[$i];
}
}
}
$string = $wordscut;
}
return trim($string);
}
這個函數 就不會有亂碼了
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/201159.html