php字元轉ascii
A. php yii框架怎麼設置字體編碼格式
今天在開發的時候需要將excel文件中數據導入到相關的配置文件中,我按照過去經常使用的方法,先將excel導出成csv文件,然後使用fgetcsv函數讀取文件的內容,通過Yii框架中的CConfigure類導出成配置文件,然後在檢查的時候發現導出的數組中有些值中間有一些多餘的反斜杠,這些反斜杠一般出現在繁體中文或者日文的文字中。
一開始我先檢查了csv和excel文件中的欄位,發現並沒有什麼問題,之後我查看了CConfigure類中的saveAsString函數,發現他使用了php中的var_export函數來實現導入配置文件的功能,然後,我又使用var_export輸出會出現問題的某個欄位,發現確實在字元串中添加了反斜杠,而我直接使用echo或者var_mp輸出時,則沒有這個情況發生,這個時候我明白問題是出在var_export這個函數上。
在查閱了相關的資料後我發現var_export這個函數會自動轉義,也許是這個原因導致了字元串中自動添加了反斜杠,可是字元串本身並沒有特殊字元,為什麼var_export還是會添加反斜杠,這個讓我百思不得其解,我查看了出現問題的字元串的2進制編碼,發現出現反斜杠的地方本身的單個字元的ascii碼也是反斜杠,也就是說可能是var_export在轉義時針對單個反斜杠字元進行了轉義?這個原因我最後也沒有搞明白。
不過在我不知道如何解決這個問題的時候,我突然想到我的csv的文字編碼是gbk的,因為是通過excel直接轉的格式,然後我導出的文件編碼是utf-8的格式,同時我的代碼本身也是utf-8的格式,雖然我最後通過格式轉換,成功把gbk的字元串轉換成utf-8導出,但是在轉換的過程中可能會出現問題(當時想的是這樣,不過之後考慮了一下,因為之前在gbk格式下使用var_export已經出現了問題,因此應該不是轉換過程中的問題,應該是var_export處理gbk格式的漢字字元串時產生的bug?),於是我將csv文件全部轉換成utf-8格式,重新導入文件,成功解決。
其實在解決的過程中,很早就想到可能是編碼的問題,但是一直沒有發現excel轉換的csv文件的格式問題,因為之前導出的配置文件沒有漢字,因此沒有出現過這一類的問題,於是就忽略了,不過最後雖然解決了問題,但是問題本身的原因還是不明,推測極有可能是因為gbk編碼和var_export的兼容導致的問題,果然開發中應該還是盡量使用utf-8統一編碼,應該會減少很多不明的錯誤。
2013.1.19更新:經過思考,覺得應該是對於gbk編碼的字元串使用var_export時,函數對於單個字元表示為反斜杠的字元添加了反斜杠的轉義,因此使得該處的字元變為兩個反斜杠,同時因為在顯示時使用了gbk編碼,導致添加的反斜杠作為前一個漢字字元的一部分被顯示,而原來的反斜杠字元則單獨顯示了出來。
B. 求php ascii碼 轉換成漢字
ascii碼沒有漢字這一說,ascii只表示英文和西歐字元
C. 漢字怎樣轉換十六進制php
//漢字進制轉換
//$string 傳入的漢字或其它字元
//$tobase 要轉換的進制 范圍 2~36 之間任意取值
//$back 返回形式,0 轉換成進制代碼 ; 1 將進制轉換成漢字
function ASCII($String,$tobase,$back){
if( $tobase > 1 && $tobase < 37 ){
if($back == 0){
return preg_replace('/(.)/es',"str_pad(base_convert(ord('\\1'),10,$tobase),8,'0',STR_PAD_LEFT)",$String);
}else{
return preg_replace('/(\w{8})/e',"chr(base_convert('\\1',$tobase,10))",$String);
}
}else{
return false;
}
}
//範例
$str = '我愛你';
$en = ASCII($str,2,0); // 轉換成2進制: 00
echo ASCII($en,2,1); // 轉換成漢字:我愛你
$en = ASCII($str,8,0); // 轉換成8進制: 40
echo ASCII($en,8,1); // 轉換成漢字:我愛你
$en = ASCII($str,10,0); // 轉換成10進制: 60
echo ASCII($en,10,1); // 轉換成漢字:我愛你
$en = ASCII($str,10,0); // 轉換成10進制: 60
echo ASCII($en,10,1); // 轉換成漢字:我愛你
$en = ASCII($str,16,0); // 轉換成10進制: a0
echo ASCII($en,16,1); // 轉換成漢字:我愛你
D. php如何防止sql注入
PHP防止sql注入是一個比較低級的問題了,這個問題其實在我大一上學期做第一個個人博客的時候就已經關注過了,不過簡單的說一下關於PHP防注入的方式吧。

對於現在的防注入技術其實已經成熟了,對於一個站點該關心的不是防注入了,而是大規模高並發如何處理的問題,或者關於各種其他漏洞,比如現在世界上仍然有百分之80使用redis的站點存在redis漏洞,通過redis漏洞可以直接拿到機器的訪問許可權,一般來說都是直接給你種一個挖礦機器人來。
E. 如何把一個PHP文件解密
所謂的PHP文件加密,一般有兩種方式,一是ZEND編譯,二是BASE64等編碼,理論上都不是加密,下面分別說說如何還原。
對於ZEND編譯過的代碼,用記事本打開是完全是亂碼,除了前面的很小的頭部,後面不是可見ASCII字元,有點像打開一個EXE文件的效果,是無法閱讀的。這類處理的文件一般認為是無法還原的,網上有DEZEND工具,你可以下載來試試看,能還原早期ZEND版本編譯後的代碼。
對於使用BASE64等編碼後的PHP文件,可以用記事本打開查看,所有字元都是可見ASCII字元,一般使用兩種方法加大閱讀難度:一是使用$ll111、$ooo000這樣的變數,字母L的小寫與1混在一起、字母O的小寫與數字0混在一起,不容易分辨變數名稱。二是使用BASE64編碼對原始代碼進行轉換,最後使用eval進行處理。往往兩種方式結合在一起。
第二種方式處理後的代碼是很容易還原的,方法就是把eval換為exit,在CLI(命令提示符)下執行就會顯示出eval那個語句對應的等效代碼,替換原始語句即可。有時候還原一次後還是eval語句,那需要按照同樣的方法反復處理。
F. 如何對php字元串中的每一個字元操作
http://cn2.php.net/manual/zh/function.chr.php
http://cn2.php.net/manual/zh/function.ord.php
用這兩個函數實現最好,php處理字元的能力沒有c語言那麼強。
把這句:$resultString.=$str[$i]+1;
改成:$resultString.=chr(ord($str[$i])+1);
echodecode('abcde');//輸出bcdef
echodecode('xyz');//輸出yz{
<?php
functiondecode($str){
$resultString="";
for($i=0;$i<strlen($str);$i++){
$resultString.=chr(ord($str[$i])+1);//把字元轉換成ascii碼+1再轉回去
}
return$resultString;
}
echodecode('abcde');
echo'</br>';
echodecode('xyz');
?>
G. 字元類型 變數 與字元類型變數異或的值這么求解 例如 '1'^'1' = c語言 php'1'^'2'
你舉的例子是兩個相同的字元,他們各個位(bit)的值是一樣的,所以異或後結果為0吧。
我還是舉個不同的例子吧,'1' ^ '2'
step1
字元'1'的ASCII碼值是49(10進制),
換算為16進制是0x31,
換算為2進制是00110001
step2
字元'2'的ASCII碼值是50(10進制),
換算為16進制是0x32,
換算為2進制是00110010
step3
做兩個二進制數的異或,即對應位不同的話,該位結果為1
00110001 異或
00110010
得到
00000011
即值為3(10進制)
H. TP5地址中有index.php的只要帶中文參數就報錯,怎麼解
可以用英文
不能用英文可以先把中文轉成ascii,在收到之後在轉換成中文
<?php
$instr='測試';
//A:將字元串(中文同樣實用)轉為ascii
functionstrtoascii($str){
$str=mb_convert_encoding($str,'GB2312');
//注意:我默認當前我們的php文件環境是UTF-8,如果是GBK的話mb_convert_encoding操作就不需要
$change_after='';
for($i=0;$i<strlen($str);$i++){
$temp_str=dechex(ord($str[$i]));
$change_after.=$temp_str[1].$temp_str[0];
}
returnstrtoupper($change_after);
}
//B:將ascii轉為字元串(中文同樣實用)
functionasciitostr($sacii){
$asc_arr=str_split(strtolower($sacii),2);
$str='';
for($i=0;$i<count($asc_arr);$i++){
$str.=chr(hexdec($asc_arr[$i][1].$asc_arr[$i][0]));
}
returnmb_convert_encoding($str,'UTF-8','GB2312');
//注意:我默認當前我們的php文件環境是UTF-8,如果是GBK的話mb_convert_encoding操作就不需要
}
echostrtoascii($instr);//2B2EAC4D
echoasciitostr("2B2EAC4D");//測試
I. PHP怎樣用ASCII碼寫入文件 - PHP進階討論
感謝各位,用chr()解決了,開始看chr()好像是把ASCII變為字元.odr()是把字元變為ASCII,理解反了.
J. 如何去掉PHP字元串中的中文字元
我給你個PHP截取中文字元串的方法總結,有原理,有源碼:程序一:PHP截取中文字元串方法由於網站首頁以及vTigerCRM里經常在截取中文字元串時出現亂碼(使用substr),今天找到一個比較好的截取中文字元串方法,在此與大家共享。function msubstr($str, $start, $len) {
$tmpstr = "";
$strlen = $start + $len;
for($i = 0; $i < $strlen; $i++) {
if(ord(substr($str, $i, 1)) > 0xa0) {
$tmpstr .= substr($str, $i, 2);
$i++;
} else
$tmpstr .= substr($str, $i, 1);
}
return $tmpstr;
}程序二:PHP截取UTF-8字元串,解決半字元問題/******************************************************************
* PHP截取UTF-8字元串,解決半字元問題。
* 英文、數字(半形)為1位元組(8位),中文(全形)為3位元組
* @return 取出的字元串, 當$len小於等於0時, 會返回整個字元串
* @param $str 源字元串
* $len 左邊的子串的長度
****************************************************************/
function utf_substr($str,$len)
{
for($i=0;$i<$len;$i++)
{
$temp_str=substr($str,0,1);
if(ord($temp_str) > 127)
{
$i++;
if($i<$len)
{
$new_str[]=substr($str,0,3);
$str=substr($str,3);
}
}
else
{
$new_str[]=substr($str,0,1);
$str=substr($str,1);
}
}
return join($new_str);
}
?>php utf-8 字元串截取<?
function cutstr($string, $length) {
preg_match_all("/[x01-x7f]|[xc2-xdf][x80-xbf]|xe0[xa0-xbf][x80-xbf]|[xe1-xef][x80-xbf][x80-xbf]|xf0[x90-xbf][x80-xbf][x80-xbf]|[xf1-xf7][x80-xbf][x80-xbf][x80-xbf]/", $string, $info);
for($i=0; $i<count($info[0]); $i++) {
$wordscut .= $info[0][$i];
$j = ord($info[0][$i]) > 127 ? $j + 2 : $j + 1;
if ($j > $length - 3) {
return $wordscut." ...";
}
}
return join('', $info[0]);
}
$string="242432反對感是456犯得上廣泛大使館地方7890";
for($i=0;$i<strlen($string);$i++)
{
echo cutstr($string,$i)."<br>";
}
?>
截取utf-8字元串函數為了支持多語言,資料庫里的字元串可能保存為UTF-8編碼,在網站開發中可能需要用php截取字元串的一部分。為了避免出現亂碼現象,編寫如下的UTF-8字元串截取函數關於utf-8的原理請看 UTF-8 FAQUTF-8編碼的字元可能由1~3個位元組組成, 具體數目可以由第一個位元組判斷出來。(理論上可能更長,但這里假設不超過3個位元組)
第一個位元組大於224的,它與它之後的2個位元組一起組成一個UTF-8字元
第一個位元組大於192小於224的,它與它之後的1個位元組組成一個UTF-8字元
否則第一個位元組本身就是一個英文字元(包括數字和一小部分標點符號)。以前為某網站設計的代碼(也是現在用在首頁的長度截取的函數)
Code:
<?php // Cut_Str;
//$sourcestr 是要處理的字元串
//$cutlength 為截取的長度(即字數)
function cut_str($sourcestr,$cutlength)
{
$returnstr='';
$i=0;
$n=0;
$str_length=strlen($sourcestr);//字元串的位元組數
while (($n<$cutlength) and ($i<=$str_length))
{
$temp_str=substr($sourcestr,$i,1);
$ascnum=Ord($temp_str);//得到字元串中第$i位字元的ascii碼
if ($ascnum>=224) //如果ASCII位高與224,
{
$returnstr=$returnstr.substr($sourcestr,$i,3); //根據UTF-8編碼規范,將3個連續的字元計為單個字元
$i=$i+3; //實際Byte計為3
$n++; //字串長度計1
}
elseif ($ascnum>=192) //如果ASCII位高與192,
{
$returnstr=$returnstr.substr($sourcestr,$i,2); //根據UTF-8編碼規范,將2個連續的字元計為單個字元
$i=$i+2; //實際Byte計為2
$n++; //字串長度計1
}
elseif ($ascnum>=65 && $ascnum<=90) //如果是大寫字母,
{
$returnstr=$returnstr.substr($sourcestr,$i,1);
$i=$i+1; //實際的Byte數仍計1個
$n++; //但考慮整體美觀,大寫字母計成一個高位字元
}
else //其他情況下,包括小寫字母和半形標點符號,
{
$returnstr=$returnstr.substr($sourcestr,$i,1);
$i=$i+1; //實際的Byte數計1個
$n=$n+0.5; //小寫字母和半形標點等與半個高位字元寬...
}
}
if ($str_length>$cutlength){
$returnstr = $returnstr . "...";//超過長度時在尾處加上省略號
}
return $returnstr;}截取utf-8字元串函數function FSubstr($title,$start,$len="",$magic=true)
{
/**
* powered by Smartpig
* mailto:[email protected]
*/if($len == "") $len=strlen($title);
if($start != 0)
{
$startv = ord(substr($title,$start,1));
if($startv >= 128)
{
if($startv < 192)
{
for($i=$start-1;$i>0;$i--)
{
$tempv = ord(substr($title,$i,1));
if($tempv >= 192) break;
}
$start = $i;
}
}
}
if(strlen($title)<=$len) return substr($title,$start,$len);
$alen = 0;
$blen = 0;
$realnum = 0;
for($i=$start;$i<strlen($title);$i++)
{
$ctype = 0;
$cstep = 0;
$cur = substr($title,$i,1);
if($cur == "&")
{
if(substr($title,$i,4) == "<")
{
$cstep = 4;
$length += 4;
$i += 3;
$realnum ++;
if($magic)
{
$alen ++;
}
}
else if(substr($title,$i,4) == ">")
{
$cstep = 4;
$length += 4;
$i += 3;
$realnum ++;
if($magic)
{
$alen ++;
}
}
else if(substr($title,$i,5) == "&")
{
$cstep = 5;
$length += 5;
$i += 4;
$realnum ++;
if($magic)
{
$alen ++;
}
}
else if(substr($title,$i,6) == """)
{
$cstep = 6;
$length += 6;
$i += 5;
$realnum ++;
if($magic)
{
$alen ++;
}
}
else if(preg_match("/(d+);?/i",substr($title,$i,8),$match))
{
$cstep = strlen($match[0]);
$length += strlen($match[0]);
$i += strlen($match[0])-1;
$realnum ++;
if($magic)
{
$blen ++;
$ctype = 1;
}
}
}else{
if(ord($cur)>=252)
{
$cstep = 6;
$length += 6;
$i += 5;
$realnum ++;
if($magic)
{
$blen ++;
$ctype = 1;
}
}elseif(ord($cur)>=248){
$cstep = 5;
$length += 5;
$i += 4;
$realnum ++;
if($magic)
{
$ctype = 1;
$blen ++;
}
}elseif(ord($cur)>=240){
$cstep = 4;
$length += 4;
$i += 3;
$realnum ++;
if($magic)
{
$blen ++;
$ctype = 1;
}
}elseif(ord($cur)>=224){
$cstep = 3;
$length += 3;
$i += 2;
$realnum ++;
if($magic)
{
$ctype = 1;
$blen ++;
}
}elseif(ord($cur)>=192){
$cstep = 2;
$length += 2;
$i += 1;
$realnum ++;
if($magic)
{
$blen ++;
$ctype = 1;
}
}elseif(ord($cur)>=128){
$length += 1;
}else{
$cstep = 1;
$length +=1;
$realnum ++;
if($magic)
{
if(ord($cur) >= 65 && ord($cur) <= 90)
{
$blen++;
}else{
$alen++;
}
}
}
}
if($magic)
{
if(($blen*2+$alen) == ($len*2)) break;
if(($blen*2+$alen) == ($len*2+1))
{
if($ctype == 1)
{
$length -= $cstep;
break;
}else{
break;
}
}
}else{
if($realnum == $len) break;
}
}
unset($cur);
unset($alen);
unset($blen);
unset($realnum);
unset($ctype);
unset($cstep);
return substr($title,$start,$length);
}
