由于编码,相同的字符串被认为是不相等的

时间:2016-05-20 09:37:43

标签: c# sharepoint encoding csom

我遇到了一个我无法想到解决方案的问题。

我从CSV文件中获取数据以使用CSOM在SharePoint Online中创建术语 - 到目前为止一切顺利。 我实际上是在一个新的术语集中重新创建一个完整的术语层次结构,所以我经常需要从Term获得一个TermCollection并且这样做后我使用parent = rootTerms.FirstOrDefault(t => t.Name == name);已加载TermCollection

一切都按计划进行,特别是字符串除外。当我收到字符串“Rémunération& avantages”时,我会在rootTerms集合中查找它但我找不到任何内容,尽管我在调试中检查了字符串在集合中。

经过一番思考后,我明白这两个字符串并不完全相同,因为集合中的字符串是“Rémunération&avantages”。正如您所看到的,&符号不会显示与以前相同的字体,似乎。

所以事情就是这样:集合中的字符串已添加到我设置的术语中,使用我在集合中寻找的完全相同的字符串。但是,当我使用CSOM从SharePoint返回字符串时,&符号不再相同了。原始字符串中的一个编码为 38 ,而来自SharePoint的一个编码为 65286

我有很多关于编码的问题以及SharePoint为什么会这样做等等。但最终,我只需要String.Equals(或等效的)在这种情况下返回true和类似的情况。我显然无法为该角色添加一个检查,因为在同一个案例中可能还有其他人。

有没有人有关于此行为的信息和/或我如何设法做我想做的事情?

感谢您阅读所有这些内容,我倾向于解释整个故事,而不仅仅是需要了解的内容,并且会产生以下内容:-p

1 个答案:

答案 0 :(得分:-1)

在比较之前尝试在字符串上使用Normalize

这样的事情可以接受吗?

<强>更新

好的,默认规范化不起作用,因为它们是2个不同的unicode字符。但NormalizationForm.FormKD似乎可以解决问题。我还发现了另一种通过将它们首先转换为ASCII来实现字符串不正常的方法。检查这些解决方案中的一个是否适合您

internal class Program
{
    [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
    private static extern int memcmp(byte[] b1, byte[] b2, long count);

    private static bool ByteArrayCompare(byte[] b1, byte[] b2)
    {
        return b1.Length == b2.Length && memcmp(b1, b2, b1.Length) == 0;
    }

     private static void Main(string[] args)
    {
        var s1 = "Rémunération & avantages";
        var s2 = "Rémunération & avantages";
        Console.WriteLine(s1.Normalize(NormalizationForm.FormKD) == s2.Normalize(NormalizationForm.FormKD));
        var str1 = Encoding.GetEncoding(437).GetBytes(s1);
        var str2 = Encoding.GetEncoding(437).GetBytes(s2);
        Console.WriteLine(ByteArrayCompare(str1, str2));
        Console.ReadLine();
    }
}