導航:首頁 > 編程語言 > phpiconvsubstr

phpiconvsubstr

發布時間:2024-03-16 21:09:14

php裡面函數iconv_substr什麼意思

返回字元串的字元數統計

㈡ 怎麼用PHP把unicode轉成utf8

function unescape($str) {
$str = rawurldecode($str);
preg_match_all("/(?:%u.{4})|&#x.{4};|&#\d+;|.+/U",$str,$r);
$ar = $r[0];
//print_r($ar);
foreach($ar as $k=>$v) {
if(substr($v,0,2) == "%u"){
$ar[$k] = iconv("UCS-2BE","UTF-8",pack("H4",substr($v,-4)));
}
elseif(substr($v,0,3) == "&#x"){
$ar[$k] = iconv("UCS-2BE","UTF-8",pack("H4",substr($v,3,-1)));
}
elseif(substr($v,0,2) == "&#") {

$ar[$k] = iconv("UCS-2BE","UTF-8",pack("n",substr($v,2,-1)));
}
}
return join("",$ar);
}
echo unescape("紫星藍");
今天有用戶反饋,表單系統用戶提交的數據中文會亂碼。測試發現問題出在 iconv 轉換上。
iconv('UCS-2', 'GBK', '中文')
Google 搜索發現,原因是 linux 伺服器上 UCS-2 編碼方式與 Winodws 不一致。
於是,我改成 iconv('UCS-2BE', 'GBK', '中文') 試試,中文正常了

以下是有關兩個平台 UCS-2 編碼的潛規則:

1, UCS-2 不等於 UTF-16。 UTF-16 每個位元組使用 ASCII 字元范圍編碼,而 UCS-2 對每個位元組的編碼可以超出 ASCII 字元范圍。UCS-2 和 UTF-16 對每個字元至多佔兩個位元組,但是他們的編碼是不一樣的。

2, 對於 UCS-2, windows 下默認是 UCS-2LE。用 MultibyteToWidechar(或者A2W)生成的是 UCS-2LE 的 unicode。windows記事本可以將文本保存為 UCS-2BE,相當於多了層轉換。

3, 對於 UCS-2, linux 下默認是 UCS-2BE。用iconv(指定UCS-2)來轉換生成的是 UCS-2BE 的 unicode。如果轉換windows平台過來的 UCS-2, 需要指定 UCS-2LE。

4, 鑒於windows和linux等多個平台對 UCS-2 的理解不同(UCS-2LE,UCS-2BE)。MS 主張 unicode 有個引導標志(UCS-2LE FFFE, UCS-2BE FEFF),以表明下面的字元是 unicode 並且判別 big-endian 或 little-endian。 所以從 windows 平台過來的數據發現有這個前綴,不用慌張。

5, linux 的編碼輸出,比如從文件輸出,從 printf 輸出,需要控制台做適當的編碼匹配(如果編碼不匹配,一般和該程序編譯時的編碼有若干關系),而控制台的轉換輸入需要查看當前的系統編碼。比如控制台當前的編碼是 UTF-8, 那麼 UTF-8 編碼的東西能正確顯示,GBK 就不能;同樣,當前編碼是 GBK, 就能顯示 GBK 編碼,後來的系統應該更智能的處理好更多的轉換了。不過通過 putty 等終端還是需要設置好終端的編碼轉換以解除亂碼的煩惱。
PHP中對漢字進行UNICODE編碼和解碼的實現
//將內容進行UNICODE編碼
function unicode_encode($name)
{
$name = iconv('UTF-8', 'UCS-2', $name);
$len = strlen($name);
$str = '';
for ($i = 0; $i < $len - 1; $i = $i + 2)
{
$c = $name[$i];
$c2 = $name[$i + 1];
if (ord($c) > 0)
{ // 兩個位元組的文字
$str .= '\u'.base_convert(ord($c), 10, 16).base_convert(ord($c2), 10, 16);
}
else
{
$str .= $c2;
}
}
return $str;
}
$name = 'MY,你大爺的';
$unicode_name=unicode_encode($name);
echo '<h3>'.$unicode_name.'</h3>';
// 將UNICODE編碼後的內容進行解碼
function unicode_decode($name)
{
// 轉換編碼,將Unicode編碼轉換成可以瀏覽的utf-8編碼
$pattern = '/([\w]+)|(\\\u([\w]{4}))/i';
preg_match_all($pattern, $name, $matches);
if (!empty($matches))
{
$name = '';
for ($j = 0; $j < count($matches[0]); $j++)
{
$str = $matches[0][$j];
if (strpos($str, '\\u') === 0)
{
$code = base_convert(substr($str, 2, 2), 16, 10);
$code2 = base_convert(substr($str, 4), 16, 10);
$c = chr($code).chr($code2);
$c = iconv('UCS-2', 'UTF-8', $c);
$name .= $c;
}
else
{
$name .= $str;
}
}
}
return $name;
}
echo 'MY,\u4f60\u5927\u7237\u7684 -> '.unicode_decode($unicode_name);

㈢ 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讀取目錄下所有文件內容並顯示

<?php

function printFile($filepath)

{

//substr(string,start,length)函數返回字元串的一部分;start規定在字元串的何處開始 ;length規定要返回的字元串長度。默認是直到字元串的結尾。

//strripos(string,find,start)查找 "php" 在字元串中最後一次出現的位置; find為規定要查找的字元;start可選。規定開始搜索的位置

//讀取文件後綴名

//$filetype = substr ( $filename, strripos ( $filename, "." ) + 1 );

//判斷是不是以txt結尾並且是文件

#if ($filetype == "txt" && is_file ( $filepath . "/" . $filename ))

if ( is_file ( $filepath))

{

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

echo $filename."內容如下:"."<br/>";

$fp = fopen ( $filepath, "r" );//打開文件

#while (! feof ( $f )) //一直輸出直到文件結尾

$i = 1;

while ($i < 10)

{

$line = fgets ( $fp );

echo $line."<br/>";

$i = $i +1;

}

fclose($fp);

}

}

(此處空一行)

function readFileRecursive($filepath)

{

if (is_dir ( $filepath )) //判斷是不是目錄

{

$dirhandle = opendir ( $filepath );//打開文件夾的句柄

if ($dirhandle)

{

//判斷是不是有子文件或者文件夾

while ( ($filename = readdir ( $dirhandle ))!= false )

{

if ($filename == "." or $filename == "..")

{

//echo "目錄為「.」或「..」"."<br/>";

continue;

}

//判斷是否為目錄,如果為目錄遞歸調用函數,否則直接讀取列印文件

if(is_dir ($filepath . "/" . $filename ))

{

readFileRecursive($filepath . "/" . $filename);

}

else

{

//列印文件

printFile($filepath . "/" . $filename);

echo "<br/>";

}

}

closedir ( $dirhandle );

}

}

else

{

printFile($filepath . "/" . $filename);

return;

}

}

(此處空一行)

header("content-type:text/html;charset=utf-8");

#echo "Hello World"."<br/>";

$filepath = "C:/phpStudy/PHPTutorial/WWW/test/results"; //想要讀取的目錄

readFileRecursive($filepath )

?>

(4)phpiconvsubstr擴展閱讀:

php還可以讀取文件夾下所有圖片,方法如下

hostdir=dirname(__FILE__).'/data/upload/admin/20170517/'; //要讀取的文件夾

(此處空一行)

$url = '/data/upload/admin/20170517/'; //圖片所存在的目錄

(此處空一行)

$filesnames = scandir($hostdir); //得到所有的文件

(此處空一行)

// print_r($filesnames);exit;

//獲取也就是掃描文件夾內的文件及文件夾名存入數組 $filesnames

(此處空一行)

$www = 'http://www.***.com/'; //域名

(此處空一行)

foreach ($filesnames as $name) {

$aurl= "<img width='100' height='100' src='".$www.$url.$name."' alt = '".$name."'>"; //圖片

echo $aurl . "<br/>"; //輸出他

㈤ 如何將phpinfo字元串類型轉換

php中iconv、mb_convert_encoding函數字元編碼轉換詳解如下:

iconv函數庫能夠完成各種字元集間的轉換,是php編程中不可缺少的基礎函數庫。

$string="親愛的朋友歡迎訪問博客,希望給您帶來一點點的幫助!";
iconv("utf8","gbk",$string)//將字元串string編碼由utf8轉變成gbk;
echo[MathProcessingError]str=′好,歡迎訪問博客,該博客記錄一個程序員的成長過程!′;echo′<br/>′;echoiconv(′GB2312′,′UTF−8′,str);//將字元串的編碼從GB2312轉到UTF-8
echo'<br/>';
echoiconv_substr([MathProcessingError]str,1,1,′UTF−8′);//按字元個數截取而非位元組printr(iconvgetencoding());//得到當前頁面編碼信息echoiconvstrlen(str,'UTF-8');//得到設定編碼的字元串長度
//也有這樣用的
[MathProcessingError]content=iconv("UTF−8","gbk//TRANSLIT",content);

1、iconv不是php的默認函數,也是默認安裝的模塊。需要安裝才能用的。

如果是windows2000+php,你可以修改php.ini文件,將extension=php_iconv.dll前的";"去掉,同時你要你的原php安裝文件下的iconv.dll到你的winnt/system32下(如果你的dll指向的是這個目錄,我本地的沒有操作這一步)

在linux環境下,用靜態安裝的方式,在configure時加多一項 --with-iconv就可以了,phpinfo看得到iconv的項。(Linux7.3+Apache4.06+php4.3.2);

到此php中的iconv 介紹完畢

2、用iconv函數把抓取來過的utf-8編碼的頁面轉成gb2312, 發現只有用iconv函數把抓取過來的數據一轉碼數據就會無緣無故的少一些。原因是這樣的:

string iconv ( string in_charset, string out_charset, string str )

注意:第二個參數,除了可以指定要轉化到的編碼以外,還可以增加兩個後綴://TRANSLIT 和 //IGNORE,其中 //TRANSLIT 會自動將不能直接轉化的字元變成一個或多個近似的字元,//IGNORE 會忽略掉不能轉化的字元,而默認效果是從第一個非法字元截斷。 被截斷了,當然就會少了;

可以這樣修改iconv("UTF-8","GB2312//IGNORE",$string) 會忽略掉不能轉化的字元;

  1. PHP中的mb_convert_encoding與iconv函數介紹

  2. mb_convert_encoding這個函數是用來轉換編碼的,和iconv函數差不多。

  3. 英文一般不會存在編碼問題,只有中文數據才會有這個問題。比如用Zend Studio或Editplus寫程序時,用的是gbk編碼,如果數據需要入資料庫,而資料庫的編碼為utf8時,這時就要把數據進行編碼轉換,不然進到資料庫就會變成亂碼。

  4. 做一個GBK To UTF-8

    <?php
    header("content-Type:text/html;charset=Utf-8");//設置字元的編碼是utp-8
    echomb_convert_encoding("你系我的友仔","UTF-8","GBK");
    ?>
  5. 再做GB2312 To Big5

<?php
header("content-Type:text/html;charset=big5");
echomb_convert_encoding("朋友","big5","GB2312");
?>

不過要使用上面的函數需要安裝但是需要先enable mbstring 擴展庫,道理還是一樣的,修改php.ini。

PHP中的另外一個函數iconv也是用來轉換字元串編碼的,與上函數功能相似。

下面還有一些詳細的例子:

iconv—
(PHP4>=4.0.5,PHP5)
mb_convert_encoding—Convertcharacterencoding
(PHP4>=4.0.6,PHP5)
  1. stringmb_convert_encoding(stringstr,stringto_encoding[,mixedfrom_encoding]
  2. 需要先enable mbstring 擴展庫,在 php.ini里將; extension=php_mbstring.dll 前面的 ;

  3. 去掉mb_convert_encoding 可以指定多種輸入編碼,它會根據內容自動識別,但是執行效率比iconv差太多;

  4. 那為何還要講解 這個 mb_convert_encoding()函數呢?答案如下:

  5. 發現iconv在轉換字元」—」到gb2312時會出錯,如果沒有ignore參數,所有該字元後面的字元串都無法被保存。不管怎麼樣,這個」—」都無法轉換成功,無法輸出。

  6. 另外mb_convert_encoding沒有這個bug.

一般情況下用 iconv,只有當遇到無法確定原編碼是何種編碼,或者iconv轉化後無法正常顯示時才用mb_convert_encoding 函數.

閱讀全文

與phpiconvsubstr相關的資料

熱點內容
最新民生通訊app從哪裡下載 瀏覽:378
如何在發簡訊時給自己手機號加密 瀏覽:773
擴展單片機ram定址方式是什麼 瀏覽:318
phpide是什麼 瀏覽:752
單片機相關軟體 瀏覽:818
eclipse如何編譯c11 瀏覽:286
加密游戲app 瀏覽:73
vs2010編譯嵌套太深 瀏覽:980
程序員面試注意事項 瀏覽:740
scratch編譯為h5 瀏覽:208
威聯通套件編譯 瀏覽:232
清刻pdf 瀏覽:982
可編程延時發生器 瀏覽:93
濱州用伺服器織夢要怎麼上傳文件 瀏覽:866
java7與java8 瀏覽:958
真空壓縮袋什麼材質好 瀏覽:935
excel批量見建文件夾 瀏覽:558
黑馬程序員就業班筆記 瀏覽:370
單片機供電自鎖電路設計 瀏覽:56
pythongui測試工具 瀏覽:835