2009-06-30 22 views
2

Ich habe eine Frage über die Windows Invariante Kultur.Windows Invariante Kultur Puzzle

Kurz und bündig, meine Frage ist:

existiert dort jedes Paar von Zeichen c1 und c2, so dass:

niedriger (c1, Invarianten) = latein allgemeine niedriger (c2, invarianten)

aber

niedriger (c1, invaraint)! = invariant niedriger (c2, invarianten)

Hintergrund:

Ich brauche einen invarianten String für Kleinbuchstabe speichern (einen Dateinamen darstellt) innerhalb von SQL Server Compact, die keine Fenstern invariant Sortierungen unterstützt.

Idealerweise möchte ich dies tun, ohne alle meine Vergleichslogik aus der Datenbank und in meine App ziehen zu müssen.

Die Idee, die ich zur Lösung dieses Problems hatte, war die Speicherung von zwei Versionen aller Dateinamen: einer für die Anzeige der Daten für den Kunden und einer für die Durchführung von Vergleichen. Die Vergleichsspalte würde unter Verwendung des windowsinvarianten Gebietsschemas in Kleinbuchstaben konvertiert, bevor sie in der Datenbank gespeichert wird.

Allerdings habe ich keine Ahnung, welche Art von Mappings die invariante Kultur tut, abgesehen von der Tatsache, dass Windows verwendet, um Dateinamen zu vergleichen.

Ich frage mich, ob es möglich ist, falsche Positive (oder falsche negative) als Ergebnis dieses Schemas zu bekommen.

Das heißt, kann ich Zeichen produzieren (zuvor niedriger Cased mit der invarianten Kultur), die einander unter Verwendung der Latin-General-1 case insensitive SQL-Server-Kollatierung vergleichen, aber unter der Invariante nicht gleich miteinander vergleichen Kultur?

Wenn dies passieren kann, dann kann meine App zwei Dateien betrachten, die nach Meinung von Windows unterschiedlich sind. Dies könnte letztendlich zu Datenverlust führen.

HINWEIS:

Ich bin mir bewusst, dass es möglich ist, Groß- und Kleinschreibung von Dateien unter Windows zu haben. Ich muss diese Szenarien jedoch nicht unterstützen.

Antwort

3

Durch die Antworten auf diese Frage sucht durch:.

win32-file-name-comparison

, die ich eine Weile zurück, fragte

fand ich eine indirekte Verbindung die folgende Seite:

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

Es wird vorgeschlagen, einen ordinalen Vergleich nach einem invarianten Großbuchstaben als den besten Weg zu mim zu verwenden ic was das Dateisystem tut.

Also ich denke, wenn ich als "case sensitive, akzentsensitive" Kollatierung in der Datenbank verwenden, und eine "obere" mit der invarianten lokalen vor dem Speichern der Dateien, sollte ich in Ordnung sein.

Weiß jemand, ob es irgendwelche Probleme damit gibt?

0

Warum konvertieren Sie Dateinamen nicht nach ASCII? In Ihrer Situation können Dateinamen nicht-ASCII-Zeichen enthalten?

+0

Ja. Internationale Benutzer können zum Beispiel nicht-ASCII-Zeichen verwenden, wenn sie ihre Dateien benennen. –

+0

Könnten Sie vielleicht das Problem lösen, indem Sie internationale Benutzer auf ascii beschränken? –

+0

Je nachdem, was er speichert, kann er das Problem lösen, indem er internationale Benutzer (und auch ägyptische Benutzer) auf Arabisch beschränkt. Aber er sagte, er speichert Dateinamen, und viele Dateinamen sind nicht auf Arabisch. –

0

Warum URL-Codierung der utf8-Byte-Darstellung des Dateinamens, um eine ASCII-Version zu erhalten, die ohne Probleme leicht in Unicode konvertiert werden kann?

+0

Das Problem ist nicht mit der Codierung der Daten. Ich kann Unicode-Daten in der Datenbank gut speichern. Das Problem, das ich habe, ist, dass ich Dateinamen in der Datenbank mit den gleichen Regeln vergleichen muss, die Windows zum Vergleichen von Dateinamen verwendet. Ich möchte wissen, ob es irgendwelche Zeichen gibt, wo mein Schema brechen wird. –

+0

Dann nehme ich an, Sie brauchen die Bestellung erhalten - URL-Codierung funktioniert gut, wenn Sie nur an Gleichheit interessiert sind. –

+0

Was ich brauche, ist für SQL-Server, um Dateinamen auf die gleiche Weise wie Win32 zu vergleichen. URL-Codierung wird dabei nicht helfen. –

0

"Allerdings habe ich keine Ahnung, welche Art von Mappings die invariante Kultur hat, abgesehen von der Tatsache, dass Windows die Dateinamen vergleicht."

Ich dachte nicht, dass Windows die invariante Kultur beim Vergleichen von Dateinamen verwendet.Zum Beispiel, wenn meine Kultur Englisch ist, dann kann ich zwei separate Dateien Türkisch und TURKİSH nennen, aber wenn jemand Kultur Türkisch ist, dann hoffe ich, dass Windows sie das nicht tun lässt.

+0

Da Dateiname vergleichen im Kernel ist, wette ich, dass es Sie in türkischer Umgebung tun wird. – Joshua

+0

Der Kernel führt auch Konvertierungen zwischen Unicode und ANSI/OEM durch, wobei er die Systemstandard-Kultur verwendet. Code^h^H^H^H^H. Türkisch hat eine eigene Codepage. –

+0

Ich mache mir mehr Sorgen darüber, was Win32 macht, was der Kernel tut. NTFS erlaubt mehr Sachen als was win32 macht, weil es Dinge wie Posix unterstützt. Win32 ist (normalerweise) Groß-und Kleinschreibung. –