我需要帮助改变从剪贴板中复制和粘贴的字符串的编码...
奇怪的字符串是“español”:
$problematicString = "español"; //copied and pasted from a filename
$okString = "español"; //typed
echo md5($problematicString)."<br>";
echo md5($okString)."<br>";
这是输出:
c9ae1d88242473e112ede8df2bdd6802
5d971adb0ba260af6a126a2ade4dd133
为什么同一个字符串的md5()
输出不同?
我尝试使用mb_convert_encoding($string, "ISO-8859-1", "UTF-8")
更改两个字符串,但输出仍然不同。
我需要以编程方式修复problematicString,以便它显示与其他字符串相同的哈希
答案 0 :(得分:5)
为什么md5对于相同的字符串有所不同?
它们不是同一个字符串。在第一种情况下,代字号位于&#39; o&#39;:
$problematicString = "español"
在第二种情况下,代字号位于&#39; n&#39;:
$okString = "español";
这就是为什么哈希不匹配。
答案 1 :(得分:3)
原因是第一部分包含一个隐藏的unicode:
̃
从编辑中拉出来:
$problematicString = "español";
这就是它实际展示的内容。
它实际上是代字号~
。
这些符号是大多数用于标准英语语音转录的非ascii符号,来自Unicode图表的几个区域:来自Latin-1 Supplement,Latin Extended-A和B,IPA扩展,结合变音符号和希腊语(对于theta)。所有这些页面都受到lucida sans unicode的支持,这是一种微软与最新产品捆绑在一起的TrueType字体。令人遗憾的是,Bitstream的母亲所有TTFs Cyberbit都不支持IPA扩展。这些值可以手动输入为字符实体,也可以分配给热键,按钮或浏览器允许的任何值。 Word97可以通过插入下的符号表访问该字体。
编写此字体的另一种方法是使用Wincalis uniedit,它会将Unicode值直接写入文件。然后“这是语音转录”用奇怪的字母汤表示,由浏览器转换成[ðɪsɪzfɘnɛɾɘklitrænskraibd](在纯文本编辑器中查看这个汤)。对于任何严肃或广泛的转录工作,像Wincalis这样的编辑器会证明很方便 - 您甚至可以自定义提供的IPA键盘。
如果您希望文件在浏览器中触发Unicode UTF-8解码,则必须在此META标记前面加上:
以下“Diacritics”:
̃ #771 nasalized
答案 2 :(得分:1)
正如@BeetleJuice所说,它们不是同一个字符串。这是理解这一点的另一种方法:将数据减少到这两个字符串:
"español";
"español";
然后对它们运行od
命令。注意十六进制字符是不同的:
0000000 6522 7073 6e61 83cc 6c6f 3b22 220a 7365
" e s p a n ̃ ** o l " ; \n " e s
0000020 6170 b1c3 6c6f 3b22 0a20
p a ñ ** o l " ; \n
0000032
答案 3 :(得分:0)
在第一个字符串中,ñ
实际上是n
和组合变音符号(http://www.fileformat.info/info/unicode/char/0303/index.htm)。在第二个字符串中,它是ñ
(http://www.fileformat.info/info/unicode/char/f1/index.htm),一个字符。您可以看到,如果您使用退格键删除字符,您将看到在第一个字符中需要2次按下,一个用于删除波形符,另一个用于删除“n”。