[英]Special ä ö characters break UTF-8 encoding
我網站上的用戶在文本字段中輸入了特殊字符:ä ö
這些顯然不是我可以從鍵盤輸入的 ä ö 字符,因為當我將它們粘貼到程序員的記事本中時,它們分成兩部分:a¨ o¨
在我網站的服務器端,我有一個 PHP 腳本,它可以識別用戶輸入中的非法特殊字符,並在帶有preg_replace
的 html 錯誤消息中突出顯示它們。
字符拆分也在那里發生,所以我得到一個普通的字母 a 和 o,帶有一個奇怪的單獨 xCC 字符,它破壞了 UTF-8 字符串編碼,結果json_encode
函數失敗。
處理這些角色的最佳方法是什么? 我應該嘗試替換特殊的 ä ö 字符並用常規字符替換它們,還是可以以某種方式捕獲損壞的 UTF-8 字符並刪除或替換它們?
不是這些字符破壞了編碼,只是Unicode真的很復雜。
常用的重音字母在 Unicode 標准中有自己的代碼點,在這種情況下:
但是,為了避免對所有可能性進行編碼,特別是當需要在同一個字母上放置多個變音符號(重音符號)時,Unicode 包括“組合變音符號”,例如:
當放置在普通字母的代碼點之后時,這些代碼點在顯示時會為其添加變音符號。
正如您所見,這意味着有兩種不同的方式來表示同一個字母。 為了幫助解決這個問題,Unicode 包括在 Unicode 標准的附件中定義的“規范化形式”:
暫時忽略“兼容性”表單,我們有兩個選擇:
因此,一種可能性是將您的輸入轉換為 NFC,這在 PHP 中可以通過intl
擴展中的Normalizer
類來實現。
但是,並非所有組合都可以標准化為沒有單獨變音符號的形式,因此這並不能解決您的所有問題。 您還需要查看您想要允許的確切字符,可能是通過匹配 Unicode 字符屬性。
您可能還想了解“字素簇”並使用相關的 PHP 函數。 “字素簇”,或只是“字素”,是大多數讀者會認為的“一個字符”——例如一個帶有所有變音符號的字母,或一個完整的表意文字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.