我遇到了一个我无法想到解决方案的问题。
我从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
答案 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();
}
}