西班牙字符串编码问题

时间:2017-07-23 23:09:25

标签: php string encoding md5 tilde

我需要帮助改变从剪贴板中复制和粘贴的字符串的编码...

奇怪的字符串是“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,以便它显示与其他字符串相同的哈希

4 个答案:

答案 0 :(得分:5)

  

为什么md5对于相同的字符串有所不同?

它们不是同一个字符串。在第一种情况下,代字号位于&#39; o&#39;:

$problematicString = "español"

在第二种情况下,代字号位于&#39; n&#39;:

$okString = "español";

这就是为什么哈希不匹配。

答案 1 :(得分:3)

原因是第一部分包含一个隐藏的unicode:

&#771;

从编辑中拉出来:

$problematicString = "espan&#771;ol";这就是它实际展示的内容。

它实际上是代字号~

这些符号是大多数用于标准英语语音转录的非ascii符号,来自Unicode图表的几个区域:来自Latin-1 Supplement,Latin Extended-A和B,IPA扩展,结合变音符号和希腊语(对于theta)。所有这些页面都受到lucida sans unicode的支持,这是一种微软与最新产品捆绑在一起的TrueType字体。令人遗憾的是,Bitstream的母亲所有TTFs Cyber​​bit都不支持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”。