奇怪的UTF8字符串比较

时间:2010-09-03 14:08:44

标签: php xml string utf-8

我遇到UTF8字符串比较的问题,我真的不知道,它开始让我头痛。请帮帮我 基本上我有一个用UTF8编码的xml文档中的字符串:'MinaTidigareanställningar'
当我将该字符串与我自己键入的完全相同的字符串进行比较时:'MinaTidigareanställningar'(也在UTF8中)。结果是假的!
我不知道为什么。太奇怪了。有人可以帮我吗?

3 个答案:

答案 0 :(得分:21)

This seems somewhat relevant。为了简化,有几种方法可以用Unicode(因此是UTF8)获取相同的文本:例如,这个:ř可以写成一个字符ř或两个字符:{{1} }和合并 r

您最好的选择是normalizer class - 将两个字符串规范化为相同的规范化形式并比较结果。

在其中一条评论中,您将显示字符串的这些十六进制表示形式:

ˇ

请注意我标记的部分,显然这个问题有两个部分。

  • 首先,观察this question on the meaning of byte sequence "c2a0" - 由于某种原因,您的输入被转换为XML文件具有正常空间的不可破坏空间。请注意,在“Mina”之后的两种情况下都有正常的空间。不知道如何处理PHP中的 ,除了用普通空格替换所有空格。

  • 关于第二种情况,我在上面概述了这种情况:4d696e61205469646967617265 20 616e7374 c3a4 6c6c6e696e676172 // from XML 4d696e61205469646967617265 c2a0 616e7374 61cc88 6c6c6e696e676172 // typed ^^-----------------^^^^1 ^^^^^^2 ä(U + 00E4“LATIN SMALL LETTER A WITH DIAERESIS” - 一个字符,两个字节),而c3a4a(U + 0061“LATIN SMALL LETTER A” - 一个字符,一个字节)而61将是组合变音符号"(U + 0308“结合DIAERESIS“ - 两个字符,三个字节)。在这里,normalization library应该是有用的。

答案 1 :(得分:2)

让我们盲目地尝试:也许两个UTF-8字符串都没有相同的底层表示(您可以将带有重音符号的字符作为序列或唯一字符)。你应该使用两个UTF8字符串的十六进制转储,有人可能会帮助。

答案 2 :(得分:0)

mb_detect_encoding($ s,“UTF-8”)==“UTF-8”? :$ s = utf8_encode($ s);