我需要過濾一些非法字符串,如「密碼」,但我發現有人繞過了我的檢查程序。他們輸入的字符串似乎完全是「密碼」,但並不相同。 我檢查了它的Unicode,例如,「a」是8e61
,而正常的「a」是61
(十六進制)。 我的PHP文件的編碼,HTML meta內容類型和MySQL編碼是utf-8。兩個字符似乎相同,但UTF-8編碼不相同
這是怎麼發生的?爲什麼有不同代碼的視覺相同的字符? 我想知道如何過濾這些字符。 我把怪異的字符串在這裏,請複製研究: 密碼
出於某種原因,當我在這裏複製的「密碼」有問題的,它實際上顯示的ASCII之一。
我的 「密碼」 使用PHP函數BIN2HEX(),和下面獲得:
50c28e61c28e73c28e73c28e776fc28e72c28e64c28e
,而一個正常的是:
50617373776f7264.
,使其更簡單,爲「十六進制表示a」爲:
c28e61
而正常之一是:
61
歡迎來到Stack Overflow。請儘快閱讀[關於]頁面。歡迎來到Unicode的美妙世界。有很多具有多種表現形式的角色。對於一個半異域的例子,阿拉伯數字1被編碼兩次,一次是西方阿拉伯語U + 0660,一次是東部阿拉伯文U + 06F0,但符號相同;這是其他一些不同的數字。請參見[在Unicode中,爲什麼有兩個阿拉伯數字的表示形式](http://stackoverflow.com/questions/1676460/)。您必須決定是否將U + 8E61與U + 0061 _ [...繼續...] _ –
_ [...繼續...]保持一致; U + 8E61是一個統一的漢字符號。您使用的是哪個代碼頁?0x8E61不是有效的UTF-8; 0x8E是繼續字節,而0x61是LATIN SMALL LETTER A,後面跟不上繼續字節。你沒有提供我們需要的所有信息;什麼是你處理的整個字節序列?上述評論仍然準確並且或多或少相關,但您不可能將U + 8E61視爲U + 0061。 –
我複製了你的字符串,它被識別爲包含:'0x0000:50 61 73 73 77 6F 72 64 Password'。這是密碼的常規ASCII表示。所以你的複製/粘貼不會保留奇怪的字符,或者我的沒有。我正在使用Mac。你能識別你認爲你有十六進制的字節嗎? –