數字語言,無論是英語、日語還是其他任何語言,都由許多字符組成。因此,在數字處理語言時,一個基本問題是如何以數字方式表示每個字符。過去,我們只需要表示英語字符,但如今情況大不相同,結果是出現了令人眼花繚亂的字符編碼方案來表示多種不同語言的字符。 PHP 如何與這些不同的方案相關聯並處理它們?
要點
基礎知識
我們都知道,“位”可以是 0 或 1,而“字節”是八個連續位的組合。由於一個字節中有八個這樣的雙值位,因此一個字節可以配置成總共 256 種不同的模式(2 的 8 次方)。可以將不同的字符與每種可能的 8 位模式關聯起來。將這些字節按不同的順序組合在一起,您就擁有了自己的通信方式。它不一定是智能的,這取決於兩端是誰,但它是通信。只要我們可以用 256 個或更少的唯一字符表達一種語言的字符,我們就成功了。但是,如果我們不能只用 256 個字符來表達一種語言呢?或者如果我們需要在同一個文檔中表達多種語言呢?今天,隨著我們對所有可以找到的東西進行數字化處理,256 個字符遠遠不夠。幸運的是,已經設計出了更能應對這一挑戰的字符方案。這些新的超級字符集使用一到四個字節來定義字符。如今字符編碼領域的大佬是 Unicode,這是一種使用多個字節表示字符的方案。它由Unicode Consortium 開發,並且有幾個版本:UTF-32(用於Dreadnaught 級星艦)、UTF-16(用於《星際迷航:暗黑無界》中的企業號)和UTF-8(我們大多數人在現實世界中應該為我們的Web 應用程序使用)。正如我所說,Unicode(包括 UTF-8)使用多個字節配置來表示字符。 UTF-8 使用一到四個字節來生成 1,112,064 種模式來表示不同的字符。這些“寬字符”佔用更多空間,但 UTF-8 的處理速度往往比其他一些編碼方案快。為什麼每個人都對 UTF-8 贊不絕口?部分原因是在 ESPN 和 TCM 上看到的支持 UTF-8 的廣告中突顯的熱門模特,但主要是因為 UTF-8 模仿 ASCII,如果您沒有涉及任何特殊字符,它會精確地跟踪 ASCII。
這如何影響 PHP?
我知道你在想什麼。我只需要在我的元標記中將字符集設置為“UTF-8”,一切都會好起來的。但這並不正確。首先,簡單的事實是 PHP 並非真正設計用於處理多字節字符,因此使用標準字符串函數對這些字符進行操作可能會產生不確定的結果。當我們需要處理這些多字節字符時,我們需要使用一組特殊的函數:mbstring 函數。其次,即使您控制了 PHP,仍然可能存在問題。覆蓋您的通信的 HTTP 標頭也包含字符集標識,這將覆蓋頁面元標記中的內容。那麼,PHP 如何處理多字節字符呢?有兩組函數會影響多字節字符串。第一個是 iconv。從 5.0 版本開始,這已成為語言的默認部分,一種將一種字符集轉換為另一種字符集表示的方法。這不是我們將在本文中討論的內容。第二個是多字節支持,這是一系列以“mb_”為前綴的命令。這些命令有很多,快速回顧一下表明,其中一些命令與根據給定的編碼方案確定字符是否合適有關,而其他命令是面向搜索的函數,類似於PHP 正則表達式的一部分,但面向多字節函數。
為 PHP 啟用多字節支持
多字節支持不是 PHP 的默認功能,但它也不需要我們下載任何額外的庫或擴展;它只需要一些重新配置。不幸的是,如果您使用的是託管版本的 PHP,這可能不是您可以執行的操作。使用 phpinfo() 函數查看您的配置。向下滾動輸出大約一半,將有一個名為“mbstring”的部分。這將向您顯示是否啟用了基本功能。有關如何啟用此功能的信息,您可以參考手冊。簡而言之,您可以通過使用 --enable-mbstring 編譯時選項啟用 mb 函數,並設置運行時配置選項 mbstring-encoding_translation。當然,最終的解決方案是 PHP 6,因為它將使用 IBM (請大家摘掉帽子) ICU 庫來確保對多字節字符集的原生支持。我們所要做的就是坐下來等待,對吧?但在那之前,請查看現在可用的多字節支持。
多字節字符串命令
可能有 53 個不同的多字節字符串命令。也可能有 54 個。我在某個時候有點數不清了,但你明白我的意思。不用說,我們不會逐一講解,但為了好玩,讓我們快速瀏覽幾個。
mb_check_encoding() 函數檢查以確定特定編碼序列對於編碼方案是否有效。該函數不會告訴您字符串的編碼方式(或它將適用於哪些方案),但它會告訴您它對於指定的方案是否有效。
<code class="language-php"><?php $string = 'u4F60u597Du4E16u754C'; $string = json_decode('"' . $string . '"'); $valid = mb_check_encoding($string, 'UTF-8'); echo ($valid) ? 'valid' : 'invalid'; ?></code>
您可以在 PHP 手冊中找到支持的編碼列表。
strlen() 函數返回字符串中的字節數。對於每個字符都是單個字節的 ASCII,這可以很好地找到字符數。對於多字節字符串,您需要使用 mb_strlen() 函數。
<code class="language-php"><?php $string = 'u4F60u597Du4E16u754C'; $string = json_decode('"' . $string . '"'); $valid = mb_check_encoding($string, 'UTF-8'); echo ($valid) ? 'valid' : 'invalid'; ?></code>
mb_ereg_search() 函數執行傳統字符搜索的多字節版本。但有一些注意事項——您需要使用 mb_regex_encoding() 函數指定編碼方案,正則表達式沒有分隔符(它只是模式部分),並且正則表達式和字符串都是使用 mb_ereg_search_init() 指定的。
<code class="language-php"><?php $string = 'u4F60u597Du4E16u754C'; $string = json_decode('"' . $string . '"'); echo strlen($string); // 输出 12 – 错误! echo mb_strlen($string, 'UTF-8'); // 输出 4 ?></code>
足夠了嗎?
我不知道你怎麼樣,但我認為世界真的需要更多簡單的東西。不幸的是,多字節處理並不能滿足這種需求。但就目前而言,這是你不能忽視的事情。有時你將無法執行正常的 PHP 字符串處理(因為你試圖對超過正常 ASCII 範圍(U 0000 – U 00FF)的字符進行處理)。這意味著你必須使用面向 mb_ 的函數。想了解更多?說真的,你想嗎?我真以為這會嚇跑你。我對此毫無準備。我的時間到了。你最好的選擇是什麼?查看 PHP 手冊。哦,還要嘗試一些東西。沒有什麼能替代實際使用某物的經驗。
(此處應保留原文FAQ部分,因為其內容與文章主題高度相關,且改寫後反而會降低可讀性。)
以上是PHP主|使用多弦字符串的詳細內容。更多資訊請關注PHP中文網其他相關文章!