среда, 14 июля 2010 г.

How [case-]insensitive (извиняюсь перед Френком Синатра)

Это перевод How [case-]insensitive (apologies to Frank Sinatra). Автор: Майкл Каплан.

В одном из моих предыдущих постов про регистр (Отстаньте от моего [нижнего] регистра! (или: регистр, часть первая) и [Верхний] регистр турецкой İ (или: регистр, часть вторая)) Tor Lillqvist заметил, что я сделал несколько подсказок к таблице регистра и NTFS. Он спросил:
Пост "Отстаньте от моего [нижнего] регистра" упоминает немного эту проблему, но с другой стороны, остаётся впечатление, что регистронезависимость NTFS обрабатывается кодом в ядре Windows.

Если я всё понял правильно, то, на самом деле, на каждом NTFS диске существует скрытый файл, называемый $UpCase. Этот файл содержит uppercase-маппинг для символов из BMP в их варианты верхнего регистра в *один символ* (поэтому немецкая ess-zet в имени файла не станет SS, и т.д.).

Этот файл создаётся, когда том форматируется и, я полагаю, никогда не модифицируется в дальнейшем, даже когда на диск ставится новая версия Windows? Было бы интересно узнать, как же формируется содержание этого файла, и как оно менялось в разных версиях системы, зависит ли маппинг от локали пользователя (или локали машины) во время форматирования и т.д. Я пробовал задавать этот вопрос на microsoft.public.win2000.file_system, но не получил ответа...

Ну, у нас действительно существует такой волшебный скрытый системный файл 10, также известный как $UpCase. Вообще-то вы можете много узнать про него из Google (я только что посмотрел (a) доступные ресурсы в интернете (b) спецификацию на NTFS и (c) исходный код NT - и я совершенно определённо могу сказать, что описания в интернете понять намного проще!).

В любом случае, этот файл ($UpCase) содержит копию той самой uppercase-информации, которая определяется NLS. Эта информация записывается на диск по время его форматирования.

Таблица для верхнего регистра NLS обновляется редко - фактически, она меняется только когда в стандарт Unicode добавляются новые кодовые точки, что является весьма редким событием для букв, которые имеют два регистра.

То, что Tor заметил насчёт проекции в один символ - верно, и это справедливо вообще для любого проецирования NLS (а не только NTFS).

Любые настройки локалей на машине никогда не имеют эффекта на эти данные.

Смотря на этот файл в различных версиях Windows (просто беглый взгляд, я мог пропустить детали):
Заглядывая в будущее:

Я большой поклонник завершения исправления для грузинского (удаления кривого lowercase-маппинга), что в любом случае не будет иметь влияния на файловую систему (которая хранит и использует только приведение к верхнему регистру).

Я также поклонник идеи взять все эти новые символы, добавленные в Unicode с последнего обновления таблицы (поскольку очевидная частичная чувствительность NTFS к регистру становится всё более видимой с увеличением числа пропущенных символов). К примеру, это принесёт нам такие вещи как U+01bf (ƿ, a.k.a. LATIN LETTER WYNN), которая пока не с нами, но которая должна проецироваться на U+01f7 (Ƿ, a.k.a. LATIN CAPITAL LETTER WYNN).

Ну, этот последний факт - это основная причина, почему NTFS хранит таблицу $UpCase отдельно, независимо от таблиц NLS. Потому что вы должны быть уверены, что файлы, которые вы сохранили на диск, будут доступны завтра или когда вы обновите свою операционную систему.

А ещё в моём списке желаний значится API-функция, которая давала бы доступ к таблице регистра файловой системы - не только для NTFS, а вообще для любой, даже чувствительной к регистру, типа CDFS. Но вообще-то пока не ясно, может ли такая функция вообще существовать, принимая во внимания отличия файловых систем. Но я думаю, именно поэтому список желаний называется списком желаний :-)

1 - Также известная как Windows 2000
2 - Также известная как Windows XP
3 - Также известная как Windows Server 2003


This post brought to you by "ѝ" and "Ѝ" (U+045d a.k.a. CYRILLIC SMALL LETTER I WITH GRAVE and U+040d a.k.a CYRILLIC CAPITAL LETTER I WITH GRAVE)
Ни один из спонсоров этого поста не попал в таблицы регистра NLS и они кажутся немного расстроены этим фактом!

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.