當前位置:首頁 » 編程語言 » php字元集

php字元集

發布時間: 2022-02-24 13:07:40

php 輸出簡單的中文 亂碼問題

解決php中中文亂碼問題方法

  1. php文件本身的編碼與網頁的編碼應匹配


    a. 如果欲使用gb2312編碼,那麼php要輸出頭:header(「Content-Type: text/html; charset=gb2312"),靜態頁面添加<metahttp-equiv="Content-Type" content="text/html; charset=gb2312">,所有文件的編碼格式為ANSI,可用記事本打開,另存為選擇編碼為ANSI,覆蓋源文件。


    b. 如果欲使用utf-8編碼,那麼php要輸出頭:header(「Content-Type: text/html; charset=utf-8"),靜態頁面添加<metahttp-equiv="Content-Type" content="text/html; charset=utf-8">,所有文件的編碼格式為utf-8。保存為utf-8可能會有點麻煩,一般utf-8文件開頭會有BOM,如果使用session就會出問題,可用editplus來保存,在editplus中,工具->參數選擇->文件->UTF-8簽名,選擇總是刪除,再保存就可以去掉BOM信息了。

  2. php本身不是Unicode的,所有substr之類的函數得改成mb_substr(需要裝mbstring擴展);或者用iconv轉碼。

  3. 如果你的HTML文件文件出現了亂碼問題,那麼你可以在head標簽裡面加入UTF8編碼(國際化編碼):UTF-8是沒有國家的編碼,也就是獨立於任何一種語言,任何語言都可以使用的。

(1)php字元集擴展閱讀:

解決PHP 輸出簡單的中文 亂碼問題的其他方法:

在php的echo前面加入header("Content-Type:text/html;charset=gb2312")

把<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />中的UTF-8改成gb2312

㈡ PHP的字元編碼17符號代替問題,怎麼解決

近日,公司的論壇管理員發了一個帖子鏈接給我,說標題修改以後和實際的顯示不一樣。我打開之後發現,原始標題為:「手賤洗包漿,洗洗更健康」,但在title顯示成了 「手賤洗包漿,洗洗更降」。

於是乎,在本地測試環境下進行了編輯測試未發現異常,伺服器上對其它帖子也進行了編輯保存也為發現問題。

看來需要跟蹤一下源代碼了,發現上面的標題在執行了一下代碼之後發生了變化:

1 $thread['subject'] = str_replace("【",'',$thread['subject']);

2 $thread['subject'] = str_replace("】",'',$thread['subject']);

至此,可以肯定問題出在了這里,然而到底是什麼問題導致的呢,初步考慮是

1,伺服器環境有問題

2,編碼處理不一致

經過多個伺服器環境測試後,發現問題依舊,可以排除伺服器因素

之後測試編碼處理,先將要替換的字元和查詢的字元串轉成UTF-8編碼,之後進行替換測試發現問題不存在了。

於是修正上面的代碼為:

1 $rep1 = iconv('GBK', 'UTF-8', "【");

2 $rep2 = iconv('GBK', 'UTF-8', "】");

3 $thread['subject'] = iconv('GBK', 'UTF-8', $thread['subject']);

4 $thread['subject'] = str_replace(array($rep1, $rep2),array('',''), $thread['subject']);

5 $thread['subject'] = iconv('UTF-8', 'GBK', $thread['subject']);

解決問題。

終極問題分析:

由於計算機是基於二進制代碼運行的,因此php在執行替換的時候也是將非ASCII字元轉成了ASCII編碼之後進行查找替換,使用十六進制工具查看這些字元的二進制情況,結果如下:

【 的十六進制為 A1 BE

的十六進制為 A1 BF

健康的十六進制為 BD A1 BF B5

降的十六進制為 BD B5

通過以上的十六進制數據不難發現,健康的ASCII碼裡面正好存在】的ASCII碼,於是被替換,留下了降的ASCII碼。

由此可知,在字元串查找替換的時候,如果是非ASCII編碼字元串很容易出現這種問題,通過轉碼到UTF8或者Unicode編碼能否徹底的解決此問題還有待考證!

㈢ PHP字元集顯示問題!!!高手來

一看你導出來的sql文件是什麼格式的
二就是你建立的數據字元集是什麼
三就是導入的時候用的什麼字元集,
只要這三塊要注意

㈣ php字元集修改成GBK在php.ini文件里怎麼改啊

文本編輯打開文件、修改保存即可。
如果是WINDOWS伺服器,可以使用記事本修改。如果是UNIX伺服器,可以使用vi修改。
查看PHP.INI文件位置,可以使用phpinfo()函數

㈤ php創建mysql數據表,怎麼選擇UTF8字元集

一、轉碼失敗
在數據寫入到表的過程中轉碼失敗,資料庫端也沒有進行恰當的處理,導致存放在表裡的數據亂碼。
針對這種情況,前幾篇文章介紹過客戶端發送請求到服務端。
其中任意一個編碼不一致,都會導致表裡的數據存入不正確的編碼而產生亂碼。
比如下面簡單一條語句:
set @a = "文本字元串";
insert into t1 values(@a);

  • 變數 @a 的字元編碼是由參數 CHARACTER_SET_CLIENT 決定的,假設此時編碼為 A,也就是變數 @a 的編碼。

  • 2. 寫入語句在發送到 MySQL 服務端之前的編碼由 CHARACTER_SET_CONNECTION 決定,假設此時編碼為 B。

    3. 經過 MySQL 一系列詞法,語法解析等處理後,寫入到表 t1,表 t1 的編碼為 C。
    那這里編碼 A、編碼 B、編碼 C 如果不兼容,寫入的數據就直接亂碼。


    二、客戶端亂碼
    表數據正常,但是客戶端展示後出現亂碼。
    這一類場景,指的是從 MySQL 表裡拿數據出來返回到客戶端,MySQL 里的數據本身沒有問題。客戶端發送請求到 MySQL,表的編碼為 D,從 MySQL 拿到記錄結果傳輸到客戶端,此時記錄編碼為 E(CHARACTER_SET_RESULTS)。
    那以上編碼 E 和 D 如果不兼容,檢索出來的數據就看起來亂碼了。但是由於數據本身沒有被破壞,所以換個兼容的編碼就可以獲取正確的結果。
    這一類又分為以下三個不同的小類:

    1)欄位編碼和表一致,客戶端是不同的編碼
    比如下面例子, 表數據的編碼是 utf8mb4,而 SESSION 1 發起的連接編碼為 gbk。那由於編碼不兼容,檢索出來的數據肯定為亂碼。

    2)表編碼和客戶端的編碼一致,但是記錄之間編碼存在不一致的情形
    比如表編碼是 utf8mb4,應用端編碼也是 utf8mb4,但是表裡的數據可能一半編碼是 utf8mb4,另外一半是 gbk。那麼此時表的數據也是正常的,不過此時採用哪種編碼都讀不到所有完整的數據。這樣數據產生的原因很多,比如其中一種可能性就是表編碼多次變更而且每次變更不徹底導致(變更不徹底,我之前的篇章里有介紹)。舉個例子,表 t3 的編碼之前是 utf8mb4,現在是 gbk,而且兩次編碼期間都被寫入了正常的數據。

    3)每個欄位的編碼不一致,導致亂碼和第二點一樣的場景。不同的是:非記錄間的編碼不統一,而是每個欄位編碼不統一。舉個例子,表 c1 欄位 a1,a2。a1 編碼 gbk,a2 編碼是 utf8mb4。那每個欄位單獨讀出來數據是完整的,但是所有欄位一起讀出來,數據總會有一部分亂碼。


    三、LATIN1
    還有一種情形就是以 LATIN1 的編碼存儲數據
    估計大家都知道字元集 LATIN1,LATIN1 對所有字元都是單位元組流處理,遇到不能處理的位元組流,保持原樣,那麼在以上兩種存入和檢索的過程中都能保證數據一致,所以 MySQL 長期以來默認的編碼都是 LATIN1。這種情形,看起來也沒啥不對的點,數據也沒亂碼,那為什麼還有選用其他的編碼呢?原因就是對字元存儲的位元組數不一樣,比如 emoji 字元 "❤",如果用 utf8mb4 存儲,佔用 3 個位元組,那 varchar(12) 就能存放 12 個字元,但是換成 LATIN1,只能存 4 個字元。

㈥ php怎麼設置編碼

header("Content-type: text/html; charset=utf-8");
另外你的編輯器編碼也要對應哦

a. 如果欲使用gb2312編碼,那麼php要輸出頭:header(「Content-Type: text/html; charset=gb2312"),靜態頁面添加<meta http-equiv="Content-Type" content="text/html; charset=gb2312">,所有文件的編碼格式為ANSI,可用記事本打開,另存為選擇編碼為ANSI,覆蓋源文件。
b. 如果欲使用utf-8編碼,那麼php要輸出頭 :header(「Content-Type: text/html; charset=utf-8"),靜態頁面添加<meta http-equiv="Content-Type" content="text/html; charset=utf-8">,所有文件的編碼格式為utf-8。

最近需要用到iconv函數把抓取來過的utf-8編碼的頁面轉成gb2312, 發現只有用iconv函數把抓取過來的數據一轉碼數據就會無緣無故的少一些。 讓我郁悶了好一會兒,去網上一查資料才知道這是iconv函數的一個bug。iconv在轉換字元"—"到gb2312時會出錯。解決方法很簡單,就是在 需要轉成的編碼後加 "//IGNORE" 也就是iconv函數第二個參數後,如下:
iconv("UTF-8","GB2312//IGNORE",$data)
ignore的意思是忽略轉換時的錯誤,如果沒有ignore參數,所有該字元後面的字元串都無法被保存。

㈦ [php教程]php中如何設置字元集

利用PHP函數設置頁面的頭文件編碼,即可:
header("Content-Type:text/html;charset=utf-8");

㈧ php創建mysql資料庫時候如何設置字元集

我來給你做一個綜合解釋吧。
在正常情況下。
PHP腳本 HTML 已經瀏覽器 然後就是資料庫。
都有自己的字元集。何謂字元集。我想你如果是一個真正想熱衷於學PHP
那麼你應該花一定的時間去了解一下字元集的問題。
因為無論你以後做什麼項目開發什麼網站都是要牽涉到字元集。
就好比我做第一個項目。因為字元集搞的死去活來。
好進入正題。怎麼解決問題呢?
1.PHP的字元集。一般PHP網頁的是嵌套在html頁面以內。那麼如果在沒有沖突的情況下可以使用
header方面設置。比如<?php header ... ?>
2.HTML的字元集,一般是網頁的優先字元集,這個問題是牽涉到你的網站是什麼定位,比如:你的網站僅僅適合國內的客戶。那麼用gbk 或者gb2312.如果想老外也開湊湊熱鬧的話,就用utf-8.至於怎麼設置這個字元集,你可以在<meta>這個標記中看到。
3.資料庫的問題。mysql_query("set names gbk"); 這句話意思就是說,在操作資料庫的時候已這個字元集去讀寫。當然這個字元集要對應你的頁面的字元集哦。
4.瀏覽器。瀏覽器的問題是最萬惡的,因為每個瀏覽器默認的是gb2312.當然不同的瀏覽器是不同的。所以要想成為一名優秀的程序員,寫出優質的代碼。你還得去了解每個瀏覽器的差別。當然目前是不需要的,當然這個問題你慢慢學習。寫代碼的過程中會慢慢了解到的。

你要做的就是將所有使用字元集確保一致性

問題就這些吧,如果有什麼問題可以繼續問哦。凡是對PHP有熱情的人。我都會盡全力幫一下。哈哈。因為這個加物以類聚。還有這個內容絕對不是復制粘貼的。

㈨ php 怎麼增加字元集ZHS16GBK

默認編碼不一致造成問題
1、資料庫創建編碼選用一個如gb2312。
2、資料庫字元集校對選用一個gb2312,以上兩者必須一致。
3、不同編譯器或者工具如notepad、vim、editplus,它們默認文件的編碼不一致,保存的時候選擇相應的字元集保存。
4、頁面的環境不一樣造成,html中的head中meta中的charset=gb2312即可。
5、瀏覽器的設置默認編碼不一致,有的自動選擇,有的默認gb2312,許多頁面默認是utf8,造成亂碼,php文件採用header('Content-Type: text/html; charset=gb2312');告訴瀏覽器文本類型是html和字元集是gb2312.,header前面不能有任何輸出包括空格,此時可以不使用方法4.
綜上所述,亂碼的大部分原因。

㈩ php獲取字元編碼的問題

啊=>'0x3021'
這是區位碼,還是國標碼,要是的還真沒辦法.
在PHP中,可以取漢字的內碼
echo bin2hex('啊');
我也只能做到這一步,你再找接下去方法.

echo str_decode('啊');
function str_decode($strval){
$a=bin2hex($strval);
$a1=substr($a,0,2);
$a2=substr($a,2,2);
$a1=strval(decbin(hexdec($a1)));
$a2=strval(decbin(hexdec($a2)));
$c='0';
$b1=substr_replace($a1,$c,0,1);
$b2=substr_replace($a2,$c,0,1);
$b=dechex(bindec($b1)).dechex(bindec($b2));
return "ox".$b;
}
不夠簡練,你在完整下.
注意文件必須以GBK形式保存,才能取得國標碼.
思路是,先取得漢字的內碼,再根據內碼和國標碼的關系,先把內碼分成兩部分,再轉換成二進制,用替換函數把最高位換成'0',這樣就得到國標碼的二進制了,下面的過程就相反.

熱點內容
我的世界tim伺服器ip 發布:2025-01-10 08:55:40 瀏覽:343
為什麼gg都是伺服器無響應 發布:2025-01-10 08:53:27 瀏覽:587
qq消息記錄加密 發布:2025-01-10 08:52:46 瀏覽:118
掃描wifi密碼在哪裡找 發布:2025-01-10 08:52:40 瀏覽:871
股票c語言 發布:2025-01-10 08:52:31 瀏覽:78
資料庫監測 發布:2025-01-10 08:51:57 瀏覽:204
solidworks緩存 發布:2025-01-10 08:51:56 瀏覽:712
sql語言有什麼 發布:2025-01-10 08:51:48 瀏覽:976
php開發實例教程 發布:2025-01-10 08:49:29 瀏覽:497
android顯示隱藏控制項 發布:2025-01-10 08:49:23 瀏覽:742