unicode文本的MD5转换


MD5 conversion of unicode text

我做了一本字典,里面有大约10万个旁遮普语的Unicode单词。有一个字母,它在unicode中的代码是ਸ਼,还有很多像 这样的字母。但在这种语言中,字母下面的句点u也可以单独键入,但unicode中有组合字母。在数据库中,word表中有单词,word_hash中有单词的md5。当我尝试用语句SELECT * FROM db WHERE word_hash = md5('word');用php搜索数据库时,没有发现包含带点字母的单词的记录。当我尝试搜索时,我发现数据库中单词的md5和搜索语法生成的md5不同。为什么会这样?我通过一个文本框输入了所有的单词,输入的md5是mysql语法。

例如:单词ਸ਼ਰਬਤ的代码是mysql查询响应的45f756f02a28b5ec48ddf369db6ad7e6,数据库中的代码是d6da1a44526c5ab1259dcc05404b1e8c

的两个替代品是ਸ਼ਸ਼

这里有不同的Unicode规范化形式。有组合字符,其中基本字符与变音符号或其他字符组合以形成替代版本,但有时此替代版本也可能作为独立字符存在。例如:

ਸ਼ GURMUKHI LETTER SHA (U+0A36)
ਸ GURMUKHI LETTER SA  (U+0A38)
 ਼ GURMUKHI SIGN NUKTA (U+0A3C)
ਸ +  ਼ (U+0A38 + U+0A3C) equivalent to ਸ਼ U+0A36

(我实际上不确定GURMUKHI SIGN NUKTA是否是正确的组合点,因为我不知道GURMUKHI,但你知道这个想法。)

对于存储和比较,您应该决定一种或另一种形式,因为通常不可能预测输入的格式。您可以使用Unicode规范化过程来实现这一点,该过程在两种形式之间进行转换。在PHP中,您可以使用Normalizer类来完成此操作。

我需要使用md5进行搜索,因为当我以规范化的形式进行搜索时,它会认为带点和不带点的字母是相同的。。

第二个问题是,你正在为一个简单的问题发明一个过于复杂的解决方案:排序规则。数据库使用排序规则进行"模糊"匹配,即对"日场"answers"日场é"一视同仁,或者在您的情况下ਸ਼"answers"ਸ".您设置了列的默认排序规则,但也可以在查询时影响它:

SELECT ... WHERE foo = 'bar' COLLATE utf8_bin;

如果想要绝对匹配,请对所选编码使用utf8_bin排序规则或其他等效的_bin(二进制)排序规则。