2010-11-21 49 views
0

我做了如下的事情時:PHP的htmlspecialchars()函數的錯誤嘗試使用UTF-8字符串

  1. 我有一個數據的電子表格。其中一行有一個ü字符。
  2. 我將此文件另存爲OpenOffice.org中的CSV文件。當它要求我輸入字符編碼時,我選擇UTF-8。
  3. 我用的Navicat創建一個MySQL數據庫表,InnoDB的使用UTF-8編碼utf8_general並導入CSV。
  4. 我嘗試使用PHP函數htmlspecialchars($string, ENT_COMPAT, 'UTF-8')其中$string是包含特殊字符ü字符串。

它給我一個錯誤:參數中的多字節序列無效。當我將'UTF-8'更改爲'ISO8859-1'時,不會引發錯誤,但會顯示不正確的字符。 ('未知字符'字符,看起來像<?>

如果我使用HTML表單更新數據庫中的字符串,錯誤消失並且字符顯示正確,但是,當我查看記錄時Navicat的,它看起來兩個角色:

[1/4][A with some thing on top of it]

沒有被看作是一個character.`

這是怎麼回事,這裏的事情出錯了,我能做些什麼什麼有些多字節?

回答

2

雖然我不明白這裏的「無效的多字節」錯誤來自,我敢肯定htmlspecialchars()not your culprit

For the purposes of this function, the charsets ISO-8859-1, ISO-8859-15, UTF-8, cp866, cp1251, cp1252, and KOI8-R are effectively equivalent, as the characters affected by htmlspecialchars() occupy the same positions in all of these charsets.

在我的理解,應該htmlspecialchars()做工精細的UTF-8字符串而不指定字符集。我敢打賭,無論是包含表單的HTML頁面,還是您使用的數據庫連接都不是UTF-8編碼。對於後者,嘗試發送一個

SET NAMES utf8; 

mySQL在插入之前。

+0

根據MySQL的一般查詢日誌,'utf8'實際發送到MySQL服務器組名稱。儘管在這個過程中沒有任何形式(當我更新記錄時有一種形式),但它使用HTML元標記設置爲UTF-8。 (但同樣,在使用表單之前,該錯誤已經彈出。) – 2010-11-21 13:33:11

+0

@Pelle你能否確認它實際上是發送到服務器*的連接*?並且確認,你引用的錯誤實際上是由'htmlspecialchars()'引發的? – 2010-11-21 13:33:52

+0

想通了。所有的東西都是UTF-8,除了用於選擇數據時的連接。在選擇語句修復之前放置SET NAMES UTF8。 – 2010-11-21 14:05:26

相關問題