Windows不变文化拼图

时间:2009-06-30 00:29:38

标签: c# sql-server windows filesystems culture

我对windows不变文化有疑问。

简洁地说,我的问题是:

是否存在任何一对字符c1和c2:

lower(c1,invariant)= latin-general lower(c2,Invariant)

lower(c1,invaraint)!= invariant lower(c2,invariant)

背景

我需要在SQL Server Compact内部存储一个不变的小写字符串(表示文件名),它不支持Windows不变校对。

理想情况下,我希望这样做,而不必将我的所有比较逻辑从数据库中拉出来并进入我的应用程序。

我解决这个问题的想法是存储所有文件名的2个版本:一个用于向客户显示数据,另一个用于执行比较。在将比较列存储到数据库中之前,将使用Windows不变区域设置将比较列转换为小写。

但是,我真的不知道不变文化做了什么样的映射,除了它用于比较文件名的事实。

我想知道这个方案是否有可能得到误报(或假阴性)。

也就是说,我是否可以使用latin-general-1不区分大小写的SQL Server整理来生成相互比较相等的字符(以前使用不变文化来设置较低),但在不变文化下不能相互比较?

如果发生这种情况,那么我的应用程序可能会认为Windows认为不同的2个文件是相同的。这最终可能导致数据丢失。

注意:

我知道Windows上可能有区分大小写的文件。但是,我不需要支持这些场景。

4 个答案:

答案 0 :(得分:3)

通过查看这个问题的答案:

win32-file-name-comparison

我问了一会儿。

我在以下页面找到了间接链接:

http://msdn.microsoft.com/en-us/library/ms973919.aspx

它建议在不变大写之后使用序数比较作为模仿文件系统的最佳方式。

所以我认为如果我在数据库中使用“区分大小写,区分重音”的排序规则,并在存储文件之前使用不变的本地做“上层”我应该没问题。

有人知道这有什么问题吗?

答案 1 :(得分:0)

为什么不将文件名转换为ASCII?在你的情况下,文件名可以包含非ascii字符吗?

答案 2 :(得分:0)

为什么不对文件名的utf8字节表示进行URL编码以获得ascii版本,可以很容易地将其转换回unicode而不会造成任何损失?

答案 3 :(得分:0)

“但是,我真的不知道不变文化会做什么样的映射,除了它用于比较文件名的事实。”

我不认为Windows在比较文件名时使用了不变文化。例如,如果我的文化是英语,那么我可以将两个单独的文件命名为turkish和TURKİSH,但如果某人的文化是土耳其语,那么我希望Windows不会让他们这样做。