首頁  >  文章  >  後端開發  >  php header亂碼問題的相關解決方法總表

php header亂碼問題的相關解決方法總表

藏色散人
藏色散人原創
2020-07-21 11:05:562604瀏覽

php header亂碼的解決方法:1、在PHP頁面中加入語句「header("Content-type: text/html; charset=utf-8");」;2、使用META標籤設定頁面編碼;3、將PHP頁面編碼進行統一。

php header亂碼問題的相關解決方法總表

php header解決亂碼問題及其他亂碼問題

推薦:《PHP教學

php的header來定義一個php頁面為utf編碼或GBK編碼 

php頁面為utf編碼 

header("Content-type: text/html; charset=utf-8");

php頁面為gbk編碼 

header("Content-type: text/html; charset=gb2312");

php頁面為big5編碼 

header("Content-type: text/html; charset=big5");

通常情況以上程式碼放在php頁面的首頁 

用header或meta實作PHP頁面編碼的差異

#一、頁面編碼 

1. 使用1dd9d9bc813bb1594796bd2b8615c022 標籤設定頁面編碼 

#這個標籤的功能是聲明客戶端的瀏覽器用什麼字元集編碼顯示該頁面,xxx可以為GB2312,GBK,UTF-8(和MySQL不同,MySQL是UTF8)等等。因此,大部分頁面可以採用這種方式來告訴瀏覽器顯示這個頁面的時候採用什麼編碼,這樣才不會造成編碼錯誤而產生亂碼。但有的時候我們會 發現有了這句還是不行,不管xxx是哪一種,瀏覽器採用的始終都是一種編碼,這個情況我後面會談到。 

請注意,e8e496c15ba93d81f6ea4fe5f55a2244是屬於html資訊的,只是一個聲明,它起作用表明伺服器已經把HTML資訊傳到了瀏覽器。 

2. header("content-type:text/html; charset=xxx"); 

這個函數header()的功能是把括號裡面的資訊發到http標頭。 

如果括號裡面的內容為文中所說那樣,那作用和3f2ae36b77c0b1762e465ca019e7bd30標籤基本上相同,大家對照第一個看發現字符都差不多的。但不同的是如果有這段 函數,瀏覽器就會永遠採用你所要求的xxx編碼,絕對不會不聽話,因此這個函數是很有用的。為什麼會這樣呢?那就得說說HTTPS標頭和HTML資訊的差 別了: 

https標頭是伺服器以HTTP協定傳送HTML資訊到瀏覽器前所送出的字串。 

因為meta標籤是屬於html資訊的,所以header()發送的內容先到達瀏覽器,通俗點就是header()的優先權高於meta(不知道可 不行)。加入一個php頁面既有header("content-type:text/html; charset=xxx"),又有1dd9d9bc813bb1594796bd2b8615c022 ,瀏覽器就只認前者http標頭而不認meta了。當然這個函數只能在php頁面內使用。 

同樣也留有一個問題,為什麼前者就絕對起作用,而後者有時候就不行?這就是接下來要談的Apache的原因了。 

3. AddDefaultCharset 

Apache 根目錄的 conf 資料夾裡,有整個Apache的設定文件httpd.conf。 

用文字編輯器開啟httpd.conf,第708行(不同版本可能不同)有AddDefaultCharset xxx,xxx為編碼名稱。這行程式碼的意思:設定整個伺服器內的網頁檔案https標頭裡的字元集為你預設的xxx字元集。有這行,就相當於給每個檔案都 加了一行header("content-type:text/html; charset=xxx")。這就明白為什麼明明meta設定了是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 
<META http-equiv="content-type" content="text/html; charset=xxx">

如果你是web程式設計師,給你的每個頁面都加個header("content-type:text/html ; charset=xxx"),保證它在任何伺服器都能正確顯示,可移植性強。 

至於那句AddDefaultCharset xxx,要不要註解就仁者見仁了。反正我是註解掉了,不過我寫頁子也要寫header(),方便放到伺服器上能正常顯示。

二、資料庫編碼 

PHP 程式在查詢資料庫之前,先執行mysql_query(“SET NAMES xxxx”);其中xxxx 是你網頁的編碼(charset= xxxx),如果網頁中charset=utf8,則xxxx=utf8,如果網頁中charset=gb2312,則xxxx=gb2312,幾乎所有WEB程序,都有一段連接資料庫的公共代碼,放在一個文件裡,在這文件裡,加入mysql_query(“set names”)就可以了。 

SET NAMES 显示客户端发送的 SQL 语句中使用什么字符集。因此,SET NAMES 'utf-8'语句告诉服务器“将来从这个客户端传来的信息采用字符集utf-8”。它还为服务器发送回客户端的结果指定了字符集。(例如,如果你使用一 个SELECT语句,它表示列值使用了什么字符集。) 

PHP页面编码统一 

MySQL数据库编码、html页面编码、PHP或html文件本身编码要全部一致。 

  1、MySQL数据库编码:建立数据库时指定编码(如gbk_chinese_ci),建立数据表、建立字段、插入数据时不要指定编码,会自动继承数据库的编码。 

数据库连接时,也有编码,可以在连接完数据库后,执行 

mysql_query(&#39;SET NAMES gbk&#39;);//将gbk换成你的编码,如utf8。

  2、html页面的编码,指的是这一行的设置: 

<meta http-equiv="Content-Type" content="text/html; charset=gbk" />

  3、PHP或html文件本身的编码:用editplus打开php文件或html文件,另存时,选择的编码,如果数据库和页面编码是gbk,则这儿的编码选择ansi;如果数据库和页面编码是utf-8,则这儿也选择utf-8。 

  4、另外要注意的是,Javascript或Flash中传递的数据是utf-8编码,如果数据库和页面编码是gbk,要进行转码,然后写入数据库。 

iconv(&#39;utf-8&#39;, &#39;gbk&#39;, $content);

5、在PHP程序中,可以加上一行,来指定PHP源程序的编码: 

header(&#39;Content-type: text/html; charset=gbk&#39;);

以上是php header亂碼問題的相關解決方法總表的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn