簡體   English   中英

utf8中'混亂的字符'列表

[英]List of 'messed up characters' in utf8

我的一個客戶有一個網站,主機公司已經完全搞砸了整個數據庫上的字符集。 我們之前遇到過麻煩的角色,但現在它只是一場戲劇!

到目前為止,我已將charset = utf-8添加到頁面內容類型,並將mysql連接的charset設置為utf8。 現在是時候替換所有角色了。 到目前為止,我發現的是:

ö = ö
ë = ë
é = é

數據庫中的數據正在更新,如下所示:

UPDATE table SET `fieldname` = REPLACE(`fieldname`, 'ö', 'ö');

現在我只需要找到一個完整的字符列表,這些字符被搞砸了。 我嘗試了一個MySQL查詢搜索field LIKE '%Ã%'但這會返回數據庫中的所有記錄。

谷歌也只是在其他人遇到麻煩的一些主題中顯示了幾個字符(大多數是上面的3個字符),但似乎沒有一個完整的這些字符列表(或者至少是最常見的)我可以用來查找並替換我的客戶端的所有數據。

如果有人知道這樣的位置或者能夠完成我的列表,我將作為回報創建一個包含這些字符的頁面以幫助其他人(除非已經有一個我不知道某個地方的列表)。

// EDIT

這將是最常見的歐洲人物,如éèë,áàä,öóò,ï,ü,也許是ringel-S(德國雙S)。 對於像ñ或ã這樣的聳人聽聞的標志而言,並非如此,但如果它們在某個地方的列表中會非常受歡迎。

// EDIT 2

我使用本文第1部分中的2個ALTER查詢更新了MySQL數據庫和表: http://developer.loftdigital.com/blog/php-utf-8-cheatsheethttp://developer.loftdigital.com/blog/php-utf-8-cheatsheet 我到目前為止還沒有使用mb_函數,並且沒有像看起來那樣進行任何MB配置。

標題都在文件中設置為utf-8(我仍然需要檢查一些ajax腳本的標題,不確定是否需要,但這樣做不會有害)。 並且文件全部保存為UTF8而沒有BOM。 此外,通過將charset設置為utf-8來更新PHPFreakMailer。

Bad enough ,我還有這些奇怪的角色。 我不認為他們會自己離開,但至少值得希望如此:-)那么我應該采取的最后一步是什么? 繼續使用REPLACE查詢並手動更改所有奇怪的字符?

提前致謝!

這有點瘋狂; 你覺得“¶”是什么字符集?

它看起來實際上是一個正確的UTF-8序列(因為它是兩個字節),你只是將它顯示為ISO-8559-1。

編輯

根據您的評論,我認為以下是:

認為 (但實際上並非100%確定)正確的UTF-8二進制序列存儲在數據庫中。 但由於該表標記為ISO-8559-1,並且您要求自動轉換字符集。 所以它認為它是ISO-8559-1(看起來像¶),但后來嘗試將其轉換為UTF-8。

你應該能夠驗證這一點,如果strlen('Ã'')是4,而不是2.如果長度確實是2,那么你的瀏覽器編碼會以某種方式搞砸。

要解決此問題,請不要將MySQL設置為對字符進行編碼。

選項2

數據也可以在表格中“雙重編碼”。 要檢查這一點,只需檢查數據庫上的字符串長度。 如果'Ã'是4個字節長,這就是問題所在。

在這種情況下,我的建議是不要試圖制作一個大的“混亂的人物”地圖。 你應該只需要'utf8_decode'字符串。 通常這個函數會輸出一個ISO-8559-1字符串,但在你的情況下..它應該是原來有效的UTF-8字符串。

我希望這有效!

EDIT2

確實如此有效我認為發生的是選項2.用簡單的(php)術語來表達:

$output = utf8_encode(utf8_encode('string'));

所以一個utf8_decode()就足夠了。

在運行遷移腳本之前測試一下:)

如果他們強制改變字符,為什么你的數據庫沒有被轉換? 您的表格仍然是舊的字符集(請參閱表格信息中的phpMyAdmin)。

如果數據顯示在您的phpMyAdmin中或僅顯示在您的網頁上,數據是否有誤? - >您的名稱和歸類應該更改,以及標題和文件類型(安全文件為utf-8)。

或嘗試:

ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

只有當MySQL中沒有選項時,我才會開始替換字符。

既然你用“php”標記了這個問題,我假設你用PHP讀取數據庫及其值? 如果是這樣,如果您無法再控制數據庫,請查看mb_convert_encoding

更好的解決方案是修復數據和表格字符集之間的不一致。 備份數據庫(以防萬一),並將所有表列更改為UTF-8。 注意 :使用MySQL時,僅改變表的字符集是不夠的,你必須按列進行操作。

你為什么不用: ä = ä ä = äö = ö ö = ö ,......

htmlentities(); 在PHP中,它會將所有特殊字符轉換為實體。
我認為這是最簡單的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM