php不支援unicode是什麼意思
php不支援unicode是指PHP字串不保存字元的編碼訊息,所以原生操作函數,並不知道二進位資料該如何對應文本,只能假設一個字元對應單一位元組;這樣在處理英文等ascii碼時就夠用,但對於中文等多字節字符,就會出錯。
本文操作環境:windows7系統、PHP7.1版,DELL G3電腦
php不支援unicode是什麼意思?為什麼說PHP不支援Unicode編碼?
#常看到有說法:PHP不支援Unicode,或是說PHP在底層不支援Unicode。雖然我知道PHP編碼很蛋疼,各種字串處理函數都非常不規範,但也還能顯示中文,一直沒搞清楚這個不支援Unicode是什麼意思。花了一些時間來梳理這方面的資訊。
先從一個例子來引入:
一個PHP腳本如下,假設檔案的編碼是UTF-8:
//文件编码UTF-8 echo strlen("中文"); // 6 echo substr("中文",0,1) // 乱码 echo substr("中文",0,3) // 中
很奇怪吧,從上面看,似乎把一個漢字當成了3個字。這就要從PHP對於字串的儲存說起了。
我總結了一下,如下:
PHP的字串,是由位元組(byte)組成的陣列構成的。也就是說,類似C語言 char a[3] = "abc" 這樣,一個字元佔據一個位元組。
除此之外,並沒有儲存文字的編碼訊息,也就是說PHP並不知道這些字串的二進位數據,應該對應怎樣的編碼。
再進一步,PHP會依照腳本檔案的編碼,來決定字串的編碼。就例如:$string = "中文";,如果腳本檔案是UTF-8,就會把中文的UTF-8的編碼:E4B8ADE69687給保存起來。
再進一步,如前說所,PHP並不保存字串的編碼資訊。所以即便中文保存為:E4B8ADE69687,在字串原生函數看來,都只是一串二進制數。所以,PHP原生字串函數只能操作單字節字元!就是把一個位元組當做一個字元來處理!
如果想明白了上面幾點,上面的程式碼例子就自然明白了:
//文件编码UTF-8 echo bin2hex("中文"); // 可以看到,"中文"对应的二进制就是:e4b8ade69687 echo strlen("中文"); // 所以按照单字节来统计长度,就是6 echo substr("中文",0,1) // 取0到1个字节,也就是e4,并不对应某个字符的编码,所以乱码 echo substr("中文",0,3) // 取0到3个字节,刚好把`中`的编码取出来
同理,如果把檔案編碼換成GBK或別的,再實驗也會得到類似的結果,只不過GBK一個漢字佔2位元組。
那麼到現在,基本上可以明白了PHP底層不支援unicode到底說的是什麼了,總結如下:
PHP字串不保存字元的編碼訊息,所以原生操作函數,並不知道二進位資料該如何對應文本,只能【假設】一個字元對應單一位元組。這樣在處理英文等ascii碼時夠用了,但對於中文等【多字節字元】,就會出錯了。
而作為反面,我們可以看看所謂底層支援Unicode的語言的情況:
var string = "中文" console.log(string.length); // 2 string.substr(0,1) // 中
可以看到,在JS中,能正確識別和處理多字節字符。也就是在儲存時,把文字的編碼訊息也一併儲存。 (這裡我猜測是保存的是文本的Unicode值,並不太確定,因為不了解JS的底層原理)
那麼這裡就有疑問了,PHP中如何才能正確處理多字節字元呢?答案就是mbstring擴充(具體可看:http://php.net/manual/zh/book.mbstring.php)。所謂mbstring,也就是:multi-byte string ,多位元組字串。
這套擴充功能中,有一系列與原生字串函數對應的函數,能用來正確處理多位元組字元的情況。如:strlen 對應 mb_strlen … 這些對應函數中,基本和原生函數一致,只不過通常多了一個可選參數:編碼。
舉例如下:
// 脚本类型为UTF-8 echo strlen("中文"); // 6 echo mb_strlen("中文","UTF-8"); //2 使用mb_strlen ,并传入编码 utf-8, 就会把二进制E4B8ADE69687当做utf-8的处理能正确处理 echo mb_strlen("中文"); //2 如果不传编码UTF-8,则函数会自动确定编码,文档说:如果省略,则使用内部字符编码。所以这里也当做UTF-8来处理。 echo mb_strlen("中文","GBK"); //3,如果传入编码GBK,则:e4b8ade69687会被当做gbk来处理,一个gbk字符占2字节,所以为:3
推薦學習:《PHP影片教學》
以上是php不支援unicode是什麼意思的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。
