《轉》亂碼UTF8和UTF 8網頁編碼

2022-08-01 11:45:07 字數 3129 閱讀 8054

曾經被字符集間複雜的轉換搞怕了,正好新專案要求國際化,需要能夠顯示多種語言,於是一開始就規定統統使用 utf-8 編碼。

所有**檔案使用 utf-8 編碼存檔

mysql資料庫所有表,所有字段設定 collation (中文翻譯為「整理」?)屬性為 「utf8_general_ci」

所有頁面輸出

即便是這樣,php 從資料庫中讀取內容,顯示到網頁上,還是出現了亂碼,英文沒問題,中文統統都是?問號。這樣也行?艱苦卓絕的 debug 開始了……

mysql 的字符集以繁多而著名,而其預設又是 latin1 的瑞典語編碼,資料匯入匯出的時候一不留神就亂碼了。

server 伺服器級

database 資料庫級

table 表級

connection 連線級

確保每乙個級別都是使用的 utf-8 編碼。檢查了一下,貌似我沒有設定connection 連線級。前 三種字符集級別只是規定了資料儲存在 mysql 中的編碼格式,客戶端讀出資料後完全可以按照自己的意願來解讀資料。最後的 connection 連線級就是規定了客戶端以什麼編碼來解析讀取到的資料。也就是說,不論是 php **還是 db 管理軟體,在從 mysql 讀取資料之前都需要設定自己作為客戶端的編碼格式。

好吧,那麼,在任何查詢執行之前,先執行一句 set names utf-8。(使用框架進行開發的話,大多數框架應該會自動完成這一步,程式設計師一般只需要改配置檔案)

$conn

=mysql_connect

($db_host

,$db_user

,$db_password);

if(!$conn

)die

("could not connect to mysql.");

mysql_select_db

($db_name);

mysql_query

("set names 'utf-8'"

);

重新整理頁面,仍舊亂碼。

只好再繼續調查。¥#$…&%=^*&+%-#!@_@ 苦逼地一天就這樣過去了……

咦,等等,官方文件裡寫的是 set namesutf8哦,和 set namesutf-8有啥區別麼?趕緊試一下。

重新整理頁面,我擦,正常了。

搜了一下,發現被坑的人還真不少。utf-8應該是標準的寫法,在大多數場合都是有中間那個橫槓的,只是mysql這裡偏偏就非主流去掉了橫槓使用utf8。

遇到同樣問題,而本文未能幫你解決的,這篇亂碼總結可能會幫到你。

//以下是討論內容

應該使用 mysql_ set_ charset(); 不要使用sql query來設定,有風險。

1.set names與mysql_set_charset有什麼區別?

一般情況下, 使用」set names」就足夠了, 也是可以保證正確的. 那麼為什麼手冊又要說推薦使用 mysqli_set_charset(php>=5.0.5)呢。手冊裡面也沒有明確說明。我們可以看下php擴充套件的源**:

line 342

php_function(mysqli_set_charset)

mysqli_fetch_resource(mysql, my_mysql*, &mysql_link, 「mysqli_link」, mysqli_status_valid);

if (mysql_set_character_set(mysql->mysql, cs_name))

return_true;

}可以看到php的mysql擴充套件是直接呼叫了mysql的mysql_set_character_set函式,接下來看看mysql的**

line 3166:

int stdcall mysql_set_character_set(mysql *mysql, const char *cs_name)

}//以下省略

可以看到,除了呼叫real_query設定set names,還設定了mysql的charset變數。

2.這樣有什麼影響?

mysql_real_escape_string會受到影響,它與mysql_escape_string的區別就 是, 它會考慮」當前」字符集。如果僅僅使用set names,mysql_real_escape_string可能會失效。

例子:$mysqli = new mysqli(「localhost」, 「user」, 「pass」, 「test」, 3306);

/* check connection */

if (mysqli_connect_errno())

$mysqli->query(『set names gbk』); //使用set names設定字符集

$city = chr(0xbf).chr(0x5c); //0xbf5c是個有效的gbk字元,模擬使用者輸入

$city = $mysqli->real_escape_string ($city);//使用real_escape進行過濾

/* this query will fail, cause we didn』t escape $city */

if (!$mysqli->query(「insert into mycity(name) values (『$city』)」))

var_dump($city);

var_dump($mysqli->client_encoding());

$mysqli->close();

3.解決方案

mysqli_set_charset函式對php和mysql有版本要求,必須當mysql版本大於5,php版本大於5.0.5時,此函式才有 效。至於另乙個mysql_set_charset函式,則更要求php版本大於5.2.3時才能有效。對於mysql4.1以上版本,使用」set character_set_client=binary;」

推薦使用mysql_set_charset設定字符集的方案,只有在環境不允許的情況下,我們才推薦使用第二種binary編碼的方案。但是無論在什麼情況下,都禁止使用」set names」來作為設定字符集的操作。

網頁utf 8亂碼 utf8亂碼

複製 在前 在windows作業系統上使用ie作為瀏覽器時。常常會發生這樣的問題 在瀏覽使用utf 8編碼的網頁時,瀏覽器無法自動偵測 即沒有設定 自動選擇 編碼格式時 該頁面所用的編碼。即使網頁已經宣告過編碼格式 由此造成某些含有中文utf 8編碼的頁面產生空白輸出。由於utf 8為3個位元組表示...

UTF 8亂碼解決

在解決亂碼問題前,必須先搞清楚幾個相關的問題。為每個jsp頁面設定了其編碼格式 utf 8 但傳遞資料到另一頁麵時依然顯示為亂碼?首先要需要了解的是web容器預設編碼是iso 8859 1,乙個漢字占用兩個位元組,而在utf 8中乙個漢字占用三個位元組。所以在資料傳遞過程中,必須手動設定容器編碼格式...

java gbk轉utf 8亂碼問題

最近在做乙個反饋功能,把資料反饋到對方公司 我公司是gbk編碼,對方公司是utf 8編碼。因此,我需要將gbk編碼資料轉換成utf 8編碼資料,這樣對方 才不會亂碼。最簡單的方法是將httpclient的contentcharset設定為utf 8 如果contentcharset是gbk並且又不想...