您現在的位置是:電腦技術吧?>? 故障問題 ??>??出現亂碼的原因,亂碼怎么解決??>??正文詳情

出現亂碼的原因,亂碼怎么解決

賴河靈2019-12-03 09:02:09 人圍觀
簡介小票機亂碼怎么回事由于PHP中trim會導致代碼混亂,這里有一個簡單的介紹:運行以下代碼:$tag=Internet product,;$text=rtrim($tag,);pr亂碼是什么意思

關于PHP中trim 會導致亂碼的原因,下面小編給大家詳細介紹:

運行以下代碼:$tag=互聯網產品、;$text= rtrim($tag,);print_r($text);我們可能以為會得到的結果是互聯網產品,實際結果是互聯網產

為什么會這樣呢?

科普PHP 里使用mb_前綴的都是多字節函數 http://php.net/manual/zh/ref....比如$str=abcd;print_r(strlen($str).\n);// 4print_r(mb_strlen($str).\n);// 4$str=周夢康;print_r(strlen($str).\n);// 9print_r(mb_strlen($str).\n);// 3mb_系列函數是以多個字節組成的一個字符為顆粒度來操作的,不帶mb_則是按實際的字節數來操作的。

原理trim函數文檔string trim ( string$str[, string$character_mask= \t\n\r\0\x0B] )該函數不是多字節函數,也就是說,漢字這樣的多字節字符,會拿其頭或尾的單字節來和后面的$character_mask對應的char數組進行匹配,如果在后面的數組中,則刪掉,繼續匹配。

比如:echoltrim(bcdf,abc);// df如下面的 demo 中的函數string_print_char所示:0xe3 0x80 0x81三字節組成,0xe5 0x93 0x81三字節組成。

所以在執行rtrim的時候,通過字節比對,會將0x81去掉,導致了最后出現了亂碼。

源碼探究查看 PHP7 的源碼,然后提煉出下面的小 demo ,方便大家一起學習,其實PHP源碼的學習并不難,每天進步一點點。

//// main.c// trim//// Created by 周夢康 on 2017/10/18.// Copyright 2017年 周夢康. All rights reserved.//#includestdio.h#includestdlib.h#includestring.hvoid string_print_char(char *str);void php_charmask(unsigned char *input, size_t len, char *mask);char *ltrim(char *str,char *character_mask);char *rtrim(char *str,char *character_mask);int main(int argc, charconst*argv[]){printf(%s\n,ltrim(bcdf,abc));string_print_char();// e5 93 81string_print_char();// e3 80 81printf(%s\n,rtrim(互聯網產品、,));return0;}char *ltrim(char *str,char *character_mask){char *res;char mask[256];register size_t i;int trimmed = 0;size_t len =strlen(str);php_charmask((unsigned char*)character_mask,strlen(character_mask), mask);for(i = 0; i len; i ) {if(mask[(unsigned char)str[i]]) {trimmed ;}else{break;}}len -= trimmed;str = trimmed;res = (char *) malloc(sizeof(char) * (len 1));memcpy(res,str,len);returnres;}char *rtrim(char *str,char *character_mask){char *res;char mask[256];register size_t i;size_t len =strlen(str);php_charmask((unsigned char*)character_mask,strlen(character_mask), mask);if(len 0) {i = len - 1;do{if(mask[(unsigned char)str[i]]) {len--;}else{break;}}while(i-- != 0);}res = (char *) malloc(sizeof(char) * (len 1));memcpy(res,str,len);returnres;}void string_print_char(char *str){unsigned long l =strlen(str);for(int i=0; i l; i ) {printf(hhx\t,str[i]);}printf(\n);}void php_charmask(unsigned char *input, size_t len, char *mask){unsigned char *end;unsigned char c;memset(mask, 0, 256);for(end= input len; input end; input ) {c = *input;mask[c]= 1;}}如果覺得 demo 還不夠清晰的,復制下來,自己執行一次吧~C 語言基礎較差的同學也不用擔心,我準備后面專門寫一個PHP小白學習 C 語言的系列入門短文哈。

解決方案那么我們就依葫蘆畫瓢,用 php 本身的多字節函數來實現下吧:functionmb_rtrim($string,$trim,$encoding){$mask= [];$trimLength= mb_strlen($trim,$encoding);for($i= 0;$i$trimLength;$i ) {$item= mb_substr($trim,$i, 1,$encoding);$mask[] =$item;}$len= mb_strlen($string,$encoding);if($len 0) {$i=$len- 1;do{$item= mb_substr($string,$i, 1,$encoding);if(in_array($item,$mask)) {$len--;}else{break;}}while($i-- != 0);}returnmb_substr($string, 0,$len,$encoding);}mb_internal_encoding(UTF-8);$tag=互聯網產品、;$encoding= mb_internal_encoding();print_r(mb_rtrim($tag,,$encoding));當然你也可以使用正則來做。

通過上面的函數學習,單字節函數和多字節函數,你學會了嗎?

PHP7 相關源碼PHP_FUNCTION(trim){php_do_trim(INTERNAL_FUNCTION_PARAM_PASSTHRU, 3);}PHP_FUNCTION(rtrim){php_do_trim(INTERNAL_FUNCTION_PARAM_PASSTHRU, 2);}PHP_FUNCTION(ltrim){php_do_trim(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);}staticvoid php_do_trim(INTERNAL_FUNCTION_PARAMETERS, int mode){zend_string *str;zend_string *what = NULL;ZEND_PARSE_PARAMETERS_START(1, 2)Z_PARAM_STR(str)Z_PARAM_OPTIONALZ_PARAM_STR(what)ZEND_PARSE_PARAMETERS_END();ZVAL_STR(return_value, php_trim(str, (what ? ZSTR_VAL(what) : NULL), (what ? ZSTR_LEN(what) : 0), mode));}PHPAPI zend_string *php_trim(zend_string *str, char *what, size_t what_len, int mode){constchar *c = ZSTR_VAL(str);size_t len = ZSTR_LEN(str);register size_t i;size_t trimmed = 0;char mask[256];if(what) {if(what_len == 1) {char p = *what;if(mode 1) {for(i = 0; i len; i ) {if(c[i] == p) {trimmed ;}else{break;}}len -= trimmed;c = trimmed;}if(mode 2) {if(len 0) {i = len - 1;do{if(c[i] == p) {len--;}else{break;}}while(i-- != 0);}}}else{php_charmask((unsigned char*)what, what_len, mask);if(mode 1) {for(i = 0; i len; i ) {if(mask[(unsigned char)c[i]]) {trimmed ;}else{break;}}len -= trimmed;c = trimmed;}if(mode 2) {if(len 0) {i = len - 1;do{if(mask[(unsigned char)c[i]]) {len--;}else{break;}}while(i-- != 0);}}}}else{if(mode 1) {for(i = 0; i len; i ) {if((unsigned char)c[i] = (c[i] == || c[i] ==\n|| c[i] ==\r|| c[i] ==\t|| c[i] ==\v|| c[i] ==\0)) {trimmed ;}else{break;}}len -= trimmed;c = trimmed;}if(mode 2) {if(len 0) {i = len - 1;do{if((unsigned char)c[i] = (c[i] == || c[i] ==\n|| c[i] ==\r|| c[i] ==\t|| c[i] ==\v|| c[i] ==\0)) {len--;}else{break;}}while(i-- != 0);}}}if(ZSTR_LEN(str) == len) {returnzend_string_copy(str);}else{returnzend_string_init(c, len, 0);}}/* {{{ php_charmask* Fills a 256-byte bytemask with input. You can specify a range like a..z,* it needs to be incrementing.* Returns: FAILURE/SUCCESS whether the input was correct (i.e. no range errors)*/staticinline int php_charmask(unsigned char *input, size_t len, char *mask){unsigned char *end;unsigned char c;int result = SUCCESS;memset(mask, 0, 256);for(end= input len; input end; input ) {c=*input;if((input 3 end) input[1] ==. input[2] ==. input[3] = c) {memset(mask c, 1, input[3] - c 1);input =3;}elseif((input 1 end) input[0] ==. input[1] ==.) {/* Error, try to be as helpful as possible:(a range ending/starting with . wont be captured here) */if(end-len = input) {/* there was no left char */php_error_docref(NULL, E_WARNING,Invalid ..-range, no character to the left of ..);result = FAILURE;continue;}if(input 2 =end) {/* there is no right char */php_error_docref(NULL, E_WARNING,Invalid ..-range, no character to the right of ..);result = FAILURE;continue;}if(input[-1] input[2]) {/* wrong order */php_error_docref(NULL, E_WARNING,Invalid ..-range, ..-range needs to be incrementing);result = FAILURE;continue;}/* FIXME: better error (a..b..c is the only left possibility?) */php_error_docref(NULL, E_WARNING,Invalid ..-range);result = FAILURE;continue;}else{mask[c]=1;}}returnresult;}/* }}} */

版權聲明:本文由 賴河靈 整理編輯。

原標題:亂碼,電腦亂碼是什么原因

轉載注明出處:http://www.dn9ww09s.icu/fault/15023.html

文章評論

    共有條評論來說兩句吧...

    用戶名:

    驗證碼:

作者推薦

  • 時間變慢,wifi用一段時間速度慢

    時間變慢,wifi用一段時間速度慢 相關圖片風扇越轉越慢是什么原因我們的MySQL服務運行了一段時間后,由于某種原因,速度變慢了。如何找到原因?一。在數據庫性能評估中,關鍵指標是非常重要的。用它們來評價數據庫的性能...

  • 給用戶授權,數據庫創建用戶并授權

    給用戶授權,數據庫創建用戶并授權 相關圖片oracle創建用戶并授權管理員創建用戶的語法:1234createuser`username'@host[identifiedby[password]`password'];usernamesql創建用戶并授權...

  • PHP集成環境,PHP集成環境推薦

    PHP集成環境,PHP集成環境推薦 相關圖片linux php集成環境Phpwamp下載:單擊Phpwamp下載或單擊鏈接:http://www.dngsw.cn/soft/bckf-103731。htmlphwamp與其他集成環網站開發集成環境...

  • sql server命令,sqlserver

    sql server命令,sqlserver 相關圖片sqlserver數據庫我們知道,SQL server重啟分為兩個步驟:1。停止網絡停止MSSqlServer 2。重新啟動net start MSSqlServer 3。補充MySQsql的命令...

  • 存儲過程中調用存儲過程,存儲過程中調用另一個存儲過程

    存儲過程中調用存儲過程,存儲過程中調用另一個存儲過程 相關圖片mybatis中如何調用存儲過程Access是一種優秀的客戶機/服務器前端開發工具,具有易于學習、使用方便、界面友好、開發簡單、與其他數據庫靈活的接口等優點。然而,處理大量數據的速度...

  • mdf數據恢復軟件,mdf數據庫文件恢復工具恢復

    mdf數據恢復軟件,mdf數據庫文件恢復工具恢復 相關圖片文件恢復工具1:運行use master;在(filename='d:program filesmrosoft sqlservermssql10.mssql)上創建數據庫測mdf刪掉數據庫恢復...

  • 宏編程,宏怎么設置

    宏編程,宏怎么設置 相關圖片什么是宏編程軟件在某些情況下,僅當特定條件為真時,才可能希望在宏中執行一個或多個操作。例如,如果使用宏驗證窗體中的數據,則可能需要顯示響應某些記錄的輸入值的信息,...

  • 數據庫字段,數據庫增加字段

    數據庫字段,數據庫增加字段 相關圖片數據庫主鍵如何在access中重置“自動編號”字段值。在access中刪除表中的某些或所有行時,“自動編號”字段不會自動重置。若要重置“自動編號”字段值并刷新引用表中的“SQL數據庫...

  • 數據庫性能優化方法,什么是數據庫

    數據庫性能優化方法,什么是數據庫 相關圖片建立數據庫的步驟一。Password為數據庫提供了一個隨機而復雜的名稱,以避免被猜測下載。這種方法以前很流行,因為每個人都對自己的代碼有信心。但是,隨著錯誤提示導致數據庫地址...

  • 顯示行號,取消星號顯示

    顯示行號,取消星號顯示 相關圖片vi怎樣顯示行號一。工具選項2。文本編輯器所有語言的通用檢查行號vs顯示代碼行號...

熱評文章

  • 過硬的素質,過硬的能力素質

    過硬的素質,過硬的能力素質 相關圖片專業素質過硬10個。Rebar希望使響應式開發更容易、更高效,并保持CSS樣式的有序性。為了實現這些功能,開發人員設置了一個斷點列表,并為每個斷點設置了單獨的網格設置和容器政治...

  • php和java,php和java哪個好

    php和java,php和java哪個好 相關圖片php有必要轉java嗎編程語言是用來定義計算機程序的形式語言。它是一種被標準化的交流技巧,用來向計算機發出指令。一種計算機語言讓程序員能夠準確地定義計算機所需要使用的數據...

  • phpcurl,php使用curl

    phpcurl,php使用curl 相關圖片curl是php自帶的嗎在這里,我想和大家分享一下PHP對模擬登錄函數的簡單實現,包括PHP使用curl實現模擬登錄的相關操作技巧。作為你的參考,我希望能幫助你。一。Curl實現了模擬php cur...

  • 過硬的能力素質,業務素質過硬

    過硬的能力素質,業務素質過硬 相關圖片打造一支素質過硬網格系統與許多類似的工具/材料相同。“系統”這個詞使它看起來很高。事實上,大多數網格系統只是一系列縱橫交錯的細線。很簡單嗎?看起來是的。然而,之所以...

  • checkbox樣式修改,怎么修改checkbox的樣式

    checkbox樣式修改,怎么修改checkbox的樣式 相關圖片checkbox不能點擊使用復選框控制后續元素復選框控件可以根據鼠標的單擊來切換其狀態,并且:checked pseudo類可以在CSS中用于設置選中狀態下復選框的樣式。使用CSS中的html checkbox...

  • 渲染網頁,網頁渲染過程

    渲染網頁,網頁渲染過程 相關圖片html5渲染如何提高CSS網頁的渲染效率?CSS學習過程中有很多細節需要注意,這些細節也是影響CSS網頁渲染效率的重要因素。黑貓對前人提出的提高CSS網頁渲染效率的方法進行頁面渲染原理...

  • 模板代碼,html網頁導航欄代碼

    模板代碼,html網頁導航欄代碼 相關圖片淘代碼如何生成本文的例子描述了用純CSS實現的兩級下拉式導航菜單的簡單代碼。與您分享以供參考。具體如下:這是一個純CSS菜單,具有兩級下拉導航效果。它是最簡潔的CSS導航菜單...

  • 簡單的二級菜單代碼,html菜單代碼

    簡單的二級菜單代碼,html菜單代碼 相關圖片html菜單模塊代碼本文以CSS實現雙語菜單效果代碼為例。與您分享以供參考。詳情如下:這是一個CSS雙語菜單,你必須喜歡。它支持鼠標效果。先看效果,肯定會讓你滿意的。使用背景圖...

  • 文件引用格式,引用文件規定的格式

    文件引用格式,引用文件規定的格式 相關圖片js引用另一個文件的方法CSS外部引用使用外部CSS文件,一般瀏覽器都有緩存功能,所以用戶不需要每次都下載這個CSS文件。與內部參考文獻和內部參考文獻相比,外部參考文獻在節省帶寬...

  • position有哪些屬性,position四個屬性

    position有哪些屬性,position四個屬性 相關圖片position屬性值position屬性決定如何定位元素。大約有五個值:每個頁面可以看作一個層堆棧,如下圖所示。當“位置”設置為“相對”時,元素仍處于正常流中,并且位置為“正常位置...

關注微信

变脸官网查询