我有一个关于windows不变文化的问题 .
Succinctly, my question is:
是否存在任何一对字符c1和c2,以便:
lower(c1,invariant)= latin-general lower(c2,Invariant)
但
低(c1,invaraint)!=不变低(c2,不变)
Background:
我需要在SQL Server Compact内部存储一个不变的小写字符串(表示文件名),它不支持Windows不变的排序规则 .
理想情况下,我想这样做,而不必将我的所有比较逻辑从数据库中拉出来并进入我的应用程序 .
我解决这个问题的想法是存储所有文件名的2个版本:一个用于向客户显示数据,另一个用于执行比较 . 在将比较列存储在数据库中之前,将使用Windows不变区域设置将比较列转换为小写 .
但是,我真的不知道不变文化做了什么样的映射,除了它用于比较文件名的事实 .
我想知道这个方案是否有可能得到误报(或假阴性) .
也就是说,我可以使用latin-general-1不区分大小写的SQL服务器排序规则来生成相互比较相等的字符(以前使用不变文化来设置较低的字符),但是在不变文化下不能相互比较吗?
如果发生这种情况,那么我的应用程序可能会认为Windows认为不同的2个文件是相同的 . 这最终可能导致数据丢失 .
NOTE:
我知道在Windows上可能有区分大小写的文件 . 但是,我不需要支持这些场景 .
4 回答
为什么不对文件名的utf8字节表示进行URL编码以获得ascii版本,该版本可以很容易地转换回unicode而不会有任何损失?
“但是,我真的不知道不变文化会做什么样的映射,除了它用于比较文件名的事实 . ”
我不认为Windows在比较文件名时使用了不变文化 . 例如,如果我的文化是英语,那么我可以将两个单独的文件命名为turkish和TURKİSH,但如果某人的文化是土耳其语,那么我希望Windows不会让他们这样做 .
通过查看这个问题的答案:
win32-file-name-comparison
我问了一会儿 . ,
我发现了以下页面的间接链接:
http://msdn.microsoft.com/en-us/library/ms973919.aspx
它建议在不变大写之后使用序数比较作为模仿文件系统的最佳方式 .
所以我认为如果我在数据库中使用“区分大小写,区分重音”的排序规则,并在存储文件之前使用不变的本地做“上层”我应该没问题 .
有谁知道这有什么问题吗?
为什么不将文件名转换为ASCII?在您的情况下,文件名可以包含非ascii字符吗?