php 中文編碼小技巧你要知道?
這篇文章主要介紹了4個實用的PHP中文編碼小技巧,掌握之後再也不用為編碼問題苦惱了。
PHP程式設計中中文編碼問題曾經困擾很多人,導致這個問題的原因其實很簡單,每個國家(或區域)都規定了電腦資訊交換用的字元編碼集,如美國的擴展ASCII 碼,中國的GB2312-80,日本的JIS 等。作為該國家/區域內資訊處理的基礎,字元編碼集起著統一編碼的重要作用。字元編碼集依長度分為 SBCS(單字節字元集),DBCS(雙位元組字元集)兩大類。早期的軟體(尤其是作業系統),為了解決本地字元資訊的電腦處理,出現了各種本地化版本(L10N),為了區分,引進了 LANG, Codepage 等概念。但由於各個本地字符集代碼範圍重疊,相互間信息交換困難; 軟體各個本地化版本獨立維護成本較高。因此有必要將在地化工作中的共通性抽取出來,並作一致處理,將特別的在地化處理內容降到最少。這也就是所謂的國際化(118N)。各種語言訊息進一步規範為 Locale 訊息。處理的底層字元集變成了幾乎包含了所有字形的 Unicode。
現在大部分具有國際化特徵的軟體核心字元處理都是以Unicode 為基礎的,在軟體運行時根據當時的ocale/Lang/Codepage 設定確定相應的本地字元編碼設置,並依此處理本地字元。在處理過程中需要實作 Unicode 和本機字元集的相互轉換,甚或以 Unicode 為中間的兩個不同本地字元集的相互轉換。這種方式在網路環境下進一步延伸,任何網路兩端的字元資訊也需要根據字元集的設定轉換成可接受的內容。
資料庫中的字元集編碼問題
流行的關係資料庫系統都支援資料庫字元集編碼,也就是說在建立資料庫時可以指定它自己的字元集設置,資料庫的資料以指定的編碼形式儲存。當應用程式存取資料時,在入口和出口處都會有字元集編碼的轉換。對於中文數據,資料庫字元編碼的設定應保證資料的完整性。 GB2312、GBK、UTF-8 等都是可選的資料庫字元集編碼; 當然我們也可以選擇ISO8859-1 (8-bit),只是我們得在應用程式寫入資料之前先將16Bit 的一個漢字或Unicode 拆分成兩個8-bit 的字符,讀取資料之後也需要將兩個位元組合併起來,同時也要判別其中的SBCS 字符,因此我們不建議採用ISO8859-1 作為資料庫字符集編碼。這樣不但沒有充分利用資料庫本身的字符集編碼支持,同時也增加了程式設計的複雜度。程式設計時,可以先用資料庫管理系統提供的管理功能檢查其中的中文資料是否正確。
PHP 程式在查詢資料庫之前,先執行mysql_query("SET NAMES xxxx"); 其中xxxx 是你網頁的編碼(charset=xxxx),如果網頁中charset=utf8,則xxxx=utf8,如果網頁中charset=gb2312,則xxxx=gb2312,幾乎所有WEB 程序,都有一段連接資料庫的公共代碼,放在一個文件裡,在這文件裡,加入mysql_query ("SET NAMES xxxx") 就可以了。
SET NAMES 顯示客戶端傳送的 SQL 語句中使用什麼字元集。因此,SET NAMES 'utf-8' 語句告訴伺服器"將來從這個客戶端傳來的資訊採用字元集 utf-8"。它也為伺服器傳回客戶端的結果指定了字元集(例如,如果你使用一個 SELECT 語句,它表示列值使用了什麼字元集)。
定位問題時常用的技巧
定位中文編碼問題通常採用最笨的也是最有效的辦法―在你認為有嫌疑的程序處理後打印字符串的內碼。透過列印字串的內碼,你可以發現什麼時候中文字符被轉換成Unicode,什麼時候Unicode 被轉回中文內碼,什麼時候一個中文字成了兩個Unicode 字符,什麼時候中文字符串被轉成了一串問號,什麼時候中文字串的高位元被截掉了…
取用適當的樣本字串也有助於區分問題的類型。如:"aa啊 aa?@aa" 等中英相間,GB、GBK特徵字元均有的字串。一般來說,英文字元無論怎麼轉換或處理,都不會失真(如果遇到了,可以嘗試著增加連續的英文字母長度)。
解決各種應用的亂碼問題
# 1) 使用標籤設定頁面編碼
################################################################################################################################################################這個標籤的作用是聲明客戶端的瀏覽器用什麼字元集編碼顯示該頁面,xxx 可以為 GB2312、GBK、UTF-8(和 MySQL 不同,MySQL 是 UTF8)等等。因此,大部分頁面可以採用這種方式來告訴瀏覽器顯示這個頁面的時候採用什麼編碼,這樣才不會造成編碼錯誤而產生亂碼。但有的時候我們會發現有了這句還是不行,不管 xxx 是哪一種,瀏覽器採用的始終都是一種編碼,這個情況我後面會談到。
請注意, 是屬於 HTML 資訊的,只是一個聲明,只表示伺服器已經把 HTML 資訊傳到了瀏覽器。
2) header("content-type:text/html; charset=xxx");
這個函數header() 的作用是把括號裡面的資訊發到http 標頭。如果括號裡面的內容為文中所說那樣,那作用和 標籤基本上相同,大家對照第一個看發現字符都差不多的。但不同的是如果有這段函數,瀏覽器就會永遠採用你所要求的 xxx 編碼,絕對不會不聽話,因此這個函數是很有用的。為什麼會這樣呢?那就得說說 http 標頭和 HTML資訊的差別了:
http 標頭是伺服器以 http 協定傳送 HTML 資訊到瀏覽器前所送出的字串。而 標籤是屬於 HTML 資訊的,所以 header() 發送的內容先到達瀏覽器,通俗點就是 header() 的優先權高於 (不知道可不可以這樣講)。假如一個PHP頁面既有header("content-type:text/html; charset=xxx"),又有,瀏覽器就只認前者 http 標頭而不認 meta 了。當然這個函數只能在PHP頁面內使用。
同樣也留有一個問題,為什麼前者就絕對起作用,而後者有時候就不行呢?這就是接下來要談的Apache 的原因了。
3) AddDefaultCharset
Apache 根目錄的 conf 資料夾裡,有整個 Apache 的設定檔 httpd.conf。
用文字編輯器開啟 httpd.conf,第 708 行(不同版本可能不同)有 AddDefaultCharset xxx,xxx為編碼名稱。這行程式碼的意思:設定整個伺服器內的網頁檔案 http 標頭裡的字元集為你預設的 xxx字元集。有這行,就等於是為每個檔案加了一行 header("content-type:text/html; charset=xxx")。這就明白為什麼明明 設定了是 utf-8,可瀏覽器總是採用 gb2312 的原因。
如果網頁裡有 header("content-type:text/html; charset=xxx"),就把預設的字元集改為你設定的字元集,所以這個函數永遠有用。如果把 AddDefaultCharset xxx 前面加個"#",註解掉這句,而且頁面裡不含 header("content-type…"),那這個時候就輪到 meta 標籤起作用了。
以下列出以上的優先順序:
.. header("content-type:text/html; charset=xxx")
# .. AddDefaultCharset xxx
# ..
如果你是web 程式設計師,建議給你的每個頁面都加個header("content-type:text/html; charset=xxx"),這樣就可以保證它在任何伺服器都能正確顯示,可移植性也比較強。
4)PHP.ini 中的 default_charset 配置:
php.ini 中的 default_charset = "gb2312" 定義了PHP的預設語言字元集。一般建議註解掉此行,讓瀏覽器根據網頁頭中的 charset 來自動選擇語言而非做一個強制性的規定,這樣就可以在同台伺服器上提供多種語言的網頁服務。
結束語
其實PHP開發中的中文編碼並沒有想像的那麼複雜,雖然定位和解決問題沒有定規,各種運行環境也各不盡然,但後面的原理是一樣的。了解字符集的知識是解決字符問題的基礎。不過,隨著中文字元集的變化,不只是PHP編程,中文資訊處理的問題還是會存在一段時間的。
以上是php 中文編碼小技巧你要知道?的詳細內容。更多資訊請關注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有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

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

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

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

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

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

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。
