过去我在解析GUID时遇到了一些问题在处理跨平台时,短连字符有时会被长连字符取代。导致对看起来完全有效的GUID的解析尝试失败。
那么我们将如何解决这个问题?
答案 0 :(得分:6)
如果您担心GUID中出现异常字符,那么查找和替换单个类型的异常字符可能还不够。以下将删除任何,它们不是十六进制字符:
var sanitisedGuid = Regex.Replace(unsanitisedGuid, "[^A-Fa-f0-9]", string.Empty);
// not A-Za-z, thanks @thakrage
这应该只留下GUID绝对必需的字符,然后您可以使用"N"
格式说明符进行解析:
if (Guid.TryParseExact(sanitisedGuid, "N", out guid))
...
如果这些字母或数字中的一个本身是homoglyph,这将不会有帮助。
var unsanitisedGuid = "аbϲԁеf-0123456789-0123456789-012345";
看起来完全有效但不是
。答案 1 :(得分:2)
所以一个好的做法是在尝试解析它之前清理字符串。
我使用以下方法,并希望它可以帮助那些人。
String strGUID = responseFromServer.Replace('\u2010', '\u002D');
这将用以下方式使用所需的短连字符替换长连字符:
if (Guid.TryParseExact(strGUID , "D", out identifier))
{
ReportFile reportFile = this._reportFileService.FindByIdentifier(identifier);
if (reportFile != null)
{
fileBytes = reportFile.FileBytes;
fileName = reportFile.FileName;
success = true;
}
else
{
throw new Exception("Failed to load ReportFile for Identifier: " + identifier);
}
break;
}
希望这会有所帮助: - )
答案 2 :(得分:2)
如果你完全剥离任何不受欢迎的角色,那么你仍然可以解析guid。连字符主要用于可视化格式,而不是数据的一部分,因此.NET可以非常容易地解析不带连字符的字符串。这意味着你可以在解析之前删除所有非字母数字字符,它应该解析得很好。
这是一个概念验证程序。
var guid = Guid.NewGuid();
Regex re = new Regex("[^a-fA-F0-9]");
Console.WriteLine(guid.ToString());
var stripped = re.Replace(guid.ToString(),"");
Console.WriteLine(stripped);
Guid newGuid;
if (Guid.TryParse(stripped, out newGuid))
{
Console.WriteLine(newGuid.ToString());
}
else
{
Console.WriteLine("failed");
}
正如您所看到的,它会生成一个新的guid,用所有内容替换所有无效字符,然后从中创建一个新的guid。
这在某些方面有一些优势。 Unicode指定了许多不同的连字符,如果由于某种原因你得到其中的一些,这将是有效的,你不必专门处理它们中的每一个(有关多个连字符的例子,请参阅http://en.wikipedia.org/wiki/Hyphen#Unicode)。它的缺点是任何包含正好32个有效字符的字符串,即使它不像guid也会成功解析。
您是否使用此方法或更具体的方法在很大程度上取决于您对输入可能与标准的距离的期望。如果你可以保证只有这一点偏离标准你需要担心,那么Ben Pretorius的回答显然就是那个。如果你得到的输入可能有其他偏差,但你知道它总是至少要尝试一个guid,那么这可能会有效。
如果您希望人们可以使用“Anna”之类的话,请致电01234 567890或07777 777 777,以便我们聊聊。妈妈。“那么你肯定不想使用这种方法。该字符串将在我的方法下解析为guid。 :)