Mysql

文件名,ASCII unicode 轉義序列到 UTF8

  • April 6, 2013

我不確定我是否在這裡抓住了這個問題,所以如果我沒有這麼說,我會編輯標題。

我的問題如下:

我有一個 Ubuntu 12.04 伺服器(UTF-8 語言環境),使用者通過 Web 應用程序或 shell 將文件上傳到該伺服器。所以我無法控制命名約定。然後將這些名稱放入 UTF8 MYSQL 數據庫表中。

不幸的是,有些文件似乎包含我的數據庫不喜歡的特殊字元。

一個這樣的例子是́e(eU+0301) 代替é(U+00E9)。我的數據庫不喜歡這一點,並將此類實例替換為e?. 外殼本身在ls使用時正確顯示了資訊,或者在目前文件夾路徑中顯示了損壞的“不存在”符號。而且我還看到了E??代替́E(EU+0301) 之類的東西(僅供參考應該是É(U +00C9))

這是一個令人頭疼的問題,因為我什至似乎無法find對具有此類字元的文件執行命令。

所以我的第一個問題是:是否有一個 shell 命令可以用來在上傳時轉換文件名?(我可以在文件夾上遞歸執行的東西)理想情況下,它將它們轉換為適當的等價物,但我不在乎是否必須用任意字元(例如“_”)替換任何此類 unicode 序列。

提前致謝。

我試圖回答這個問題,但最終我寫了一篇關於 UTF-8 和字元轉換的小文章。(即因此我覺得這個問題很遺憾,非常接近題外話)

簡短的版本是您不能以理智的方式執行此操作,因為您沒有可靠的方法來強制編碼之間的字元。HTTP 和其他編碼感知協議/格式提供編碼作為有效負載的一部分。文件名沒有,沒有文件系統元數據指示名稱的編碼方式。

這是一個過程問題。您無法控制上傳文件的人將如何使用文件名中的字元位,因此除了使用您獲得的原始字節之外,您無法對其進行任何操作。

你有三個選擇:

  • 執行一個自動化程序,將文件名中包含無效 UTF-8 連續字元的任何內容都丟棄。您仍然會得到不正確地表達為您的編碼的文件名,但至少程序不會嘔吐。理想情況下,您的數據庫應該具有UTF-8 編碼
  • 將文件名按原樣儲存在數據庫中,並且不允許在 UTF-8 和數據庫中的目標編碼之間發生任何強制轉換。您的數據庫必須使用單字節編碼,如果解釋為 UTF-8,這些字元串可能無效。
  • 完全重新架構你正在做的事情。

引用自:https://serverfault.com/questions/496895