簡體   English   中英

特殊 ä ö 字符會破壞 UTF-8 編碼

[英]Special ä ö characters break UTF-8 encoding

我網站上的用戶在文本字段中輸入了特殊字符:ä ö

這些顯然不是我可以從鍵盤輸入的 ä ö 字符,因為當我將它們粘貼到程序員的記事本中時,它們分成兩部分:a¨ o¨

在我網站的服務器端,我有一個 PHP 腳本,它可以識別用戶輸入中的非法特殊字符,並在帶有preg_replace的 html 錯誤消息中突出顯示它們。

字符拆分也在那里發生,所以我得到一個普通的字母 a 和 o,帶有一個奇怪的單獨 xCC 字符,它破壞了 UTF-8 字符串編碼,結果json_encode函數失敗。

處理這些角色的最佳方法是什么? 我應該嘗試替換特殊的 ä ö 字符並用常規字符替換它們,還是可以以某種方式捕獲損壞的 UTF-8 字符並刪除或替換它們?

不是這些字符破壞了編碼,只是Unicode真的很復雜

常用的重音字母在 Unicode 標准中有自己的代碼點,在這種情況下:

  • U+00E4“帶分音符的拉丁文小寫字母 A”
  • U+00F6“帶分音符的拉丁文小寫字母 O”

但是,為了避免對所有可能性進行編碼,特別是當需要在同一個字母上放置多個變音符號(重音符號)時,Unicode 包括“組合變音符號”,例如:

  • U+0308 "組合分色"

當放置在普通字母的代碼點之后時,這些代碼點在顯示時會為其添加變音符號

正如您所見,這意味着有兩種不同的方式來表示同一個字母。 為了幫助解決這個問題,Unicode 包括在 Unicode 標准的附件中定義的“規范化形式”:

  • 規范化形式 D (NFD):規范分解
  • 規范化形式 C (NFC):規范分解,然后是規范組合
  • 歸一化形式 KD (NFKD):兼容性分解
  • 歸一化形式 KC (NFKC):兼容性分解,然后是規范組合

暫時忽略“兼容性”表單,我們有兩個選擇:

  • 分解,盡可能多地使用組合變音符號
  • 組合,盡可能多地使用特定的代碼點

因此,一種可能性是將您的輸入轉換為 NFC,這在 PHP 中可以通過intl擴展中的Normalizer來實現。

但是,並非所有組合都可以標准化為沒有單獨變音符號的形式,因此這並不能解決您的所有問題。 您還需要查看您想要允許的確切字符,可能是通過匹配 Unicode 字符屬性

您可能還想了解“字素簇”並使用相關的 PHP 函數 “字素簇”,或只是“字素”,是大多數讀者會認為的“一個字符”——例如一個帶有所有變音符號的字母,或一個完整的表意文字。

暫無
暫無

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

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