2010-02-17 4 views
3

Использование компонентов Delphi 2007 и TMS для Unixode-утилов и интерфейса (переход на Delphi 2009 для поддержки Unicode не является вариантом).Сравнение и сортировка имен файлов Unicode

Я сохраняю список имен файлов в списке строк (TTntStringList). Он отсортирован и нечувствителен к регистру. Стандартная процедура сортировки использует CompareStringW (LOCALE_USER_DEFAULT, NORM_IGNORECASE, ...) для сравнения строк (и то же самое для Find). Однако это проблема, потому что это будет равно dummyss.txt с dummyß.txt (например), но на NTFS вполне законно иметь эти два файла в одной и той же папке, то есть к ним относятся разные имена.

Я понимаю, что на Vista и новее правильный способ сравнения имен файлов - использовать CompareStringOrdinal. Это верно?

Что касается систем до Vista, каков будет правильный путь? Я считаю, что это должен быть CompareStringW (LOCALE_INVARIANT, ...), но я не совсем уверен.

Благодаря

+0

Обратите внимание, что если указанный отсортированный список предназначен для просмотра пользователем, то вам, вероятно, следует использовать сортировку, которая упорядочивает номера естественным образом. – Joey

+1

Действительно, как 'StrCmpLogicalW()': http://msdn.microsoft.com/en-us/library/bb759947%28VS.85%29.aspx – mghie

+0

StrCmpLogicalW() не годится, так как он также приравнивает думмы с dummyß – Mick

ответ

3

Цитата из статьи MSDN Handling Sorting in Your Applications:

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

CompareStringOrdinal требует Windows Vista или более поздней версии.

Редактировать: Да, это seems, что в Windows Vista до Windows Vista вы можете использовать RtlCompareUnicodeString, который также используется с помощью CompareStringOrdinal и доступен с Windows NT.

+0

Как насчет предварительной Vista? Я подозреваю, что ответ заключается в использовании RtlCompareUnicodeString – Mick

+0

Да, похоже. См. Редактирование. –

Смежные вопросы