Пазл Инвариантная Культура Windows - PullRequest
2 голосов
/ 30 июня 2009

У меня вопрос о культуре инвариантов Windows.

Вкратце, мой вопрос:

существует ли какая-либо пара символов c1 и c2 такая, что:

ниже (c1, инвариант) = латиница ниже (c2, инвариант)

но

ниже (c1, инвариант)! = инвариант ниже (c2, инвариант)

Справочная информация:

Мне нужно хранить неизменную строчную строку (представляющую имя файла) внутри SQL Server Compact, который не поддерживает сопоставления инвариантов Windows.

В идеале я хотел бы сделать это без необходимости вытаскивать всю логику сравнения из базы данных в мое приложение.

Идея, с которой я столкнулся, заключалась в том, чтобы сохранить 2 версии всех имен файлов: одну, которая используется для отображения данных покупателю, и другую, которая используется для сравнения. Столбец сравнения будет преобразован в нижний регистр с использованием языкового стандарта Windows, а затем сохранен в базе данных.

Тем не менее, я не имею ни малейшего представления о том, какие отображения выполняет инвариантная культура, кроме того факта, что ее используют в окнах для сравнения имен файлов.

Мне интересно, возможно ли получить ложные срабатывания (или ложные отрицания) в результате этой схемы.

То есть можно ли создавать символы (ранее в нижнем регистре с использованием инвариантной культуры), которые сравниваются равными друг другу с использованием сортировки SQL-сервера, не учитывающей регистр букв латинского-общего-1, но не сравниваются равными друг другу при инвариантной культуре

Если это может произойти, то мое приложение может рассматривать 2 файла, которые, по мнению Windows, отличаются друг от друга. В конечном итоге это может привести к потере данных.

Примечание:

Мне известно, что в Windows возможно наличие файлов, чувствительных к регистру. Однако мне не нужно поддерживать эти сценарии.

Ответы [ 4 ]

3 голосов
/ 30 июня 2009

Просматривая ответы на этот вопрос:

win32-имя-файла-сравнение

, который я недавно спросил.

Я нашел косвенную ссылку на следующую страницу:

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

Предлагается использовать порядковое сравнение после неизменного верхнего регистра как лучший способ имитировать, что делает файловая система.

Так что я думаю, что если я буду использовать в базе данных «чувствительную к регистру, чувствительную к акценту» сортировку и сделаю «верхнюю» с использованием инварианта local перед сохранением файлов, у меня все будет в порядке.

Кто-нибудь знает, есть ли проблемы с этим?

0 голосов
/ 30 июня 2009

Почему бы не URL-кодировать представление имени файла в формате utf8, чтобы получить версию ascii, которую можно легко конвертировать обратно в юникод без каких-либо возможных потерь?

0 голосов
/ 30 июня 2009

"Тем не менее, я не имею никакого представления о том, какие отображения выполняет инвариантная культура, кроме того факта, что ее используют в окнах для сравнения имен файлов."

Я не думал, что Windows использовала инвариантную культуру при сравнении имен файлов. Например, если моя культура английская, тогда я могу назвать два отдельных файла турецкий и TURKİSH, но если чья-то культура турецкая, то я надеюсь, что Windows не позволит им сделать это.

0 голосов
/ 30 июня 2009

почему вы не конвертируете имена файлов в ASCII? В вашей ситуации имена файлов могут содержать символы не ascii?

...