воскресенье, 16 мая 2010 г.

[Верхний] регистр турецкой İ (или: регистр, часть вторая)

Это перевод The [Upper]Case of the Turkish İ (or: Casing, the 2nd). Автор: Майкл Каплан.

Я думаю, что турки всё сделали верно.

В конце концов, предположим, что у нас были бы такие символы в английском:

1. I U+0049 LATIN CAPITAL LETTER I
2. i U+0069 LATIN SMALL LETTER I
3. İ U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE
4. ı U+0131 LATIN SMALL LETTER DOTLESS I

Разве мы бы не сделали такое проецирование, которое бы расположило буквы с точками и без вместе (так что #1/#4 и #3/#2 стали бы парами по регистру)? Ответьте честно: это же имеет смысл, верно?

И у нас на это даже есть хорошая причина, если вы подумаете об этом. Я имею ввиду, что "I" в слове "him" звучит не так, как в слове "nice", и оба случая отличаются от "friend", где "I" вообще не произносится. Было бы неплохо иметь несколько дополнительных букв для всех этих разных случаев. Я много говорил с носителями других языков о языках (профессиональный риск), и многие сказали, что одна из сложных вещей при изучении английского - это различные произношения одной буквы. Мы могли бы упростить многие вещи, введя усложнение в виде нескольких вариантов одной буквы...

А, ну и чёрт с ним, всё равно этого не произойдёт. Но, вероятно, вы уже увидели идею языков, которые имеют "Å" или "Ö" или "Č" или "İ" в своих рядах. И тогда, как я указал в начале этого поста, если у вас существуют все варианты "I", то будет сумасшедствием делать проецирование регистра как-то иначе...

Конечно же, как вы уже могли себе представить, такой план не слишком-то уживётся с регистронезависимыми реестром или файловыми системами (типа FAT и NTFS). Неожиданно, идея, которая показалась нам разумной в начале поста, начинает выглядеть как огромная брешь в безопасности (мне даже не нужно фантазировать; я собрал специальную версию Windows на своей машине, которая отказалась загружаться потому что они не могла найти ключ реестра "HKLM\SOFTWARE\MICROSOFT\Windows", и я слышал истории о других сборках, которые не могли найти файл WIN.ini). И я был свидетелем обзоров кода (code review), в которых десятки разработчиков сканировали тысячи файлов в .NET Framework, чтобы (среди прочего) должным образом не использовать "турецкое" приведение регистра при попытке взглянуть на файловую систему или реестр. Удивительно, каким сложным и дорогим может быть желание сделать продукт интуитивным...

Вы увидели, как я вставил правильный дизайн в последнем параграфе? Если вы сказали "да", то я чувствую себя очень умным, а если нет - то нет :-)

Правильный дизайн - использовать CultureInfo.CurrentCulture в вашем коде .NET каждый раз, когда вы хотите получить (потенциально различное) поведение регистра в турецком и иранском, например, в строках, которые увидит пользователь. В то же время, вы можете использовать CultureInfo.InvariantCulture для тех случаев, когда вы хотите инвариантное, неизменное поведение. А в неуправляемом коде вы можете использовать LCMapString с преобразованием LCMAP_UPPERCASE/LCMAP_LOWERCASE, используя или нет флаг LCMAP_LINGUISTIC_CASING соответственно.

Это просто запомнить и легко выполнять автоматически, когда вы про это узнали :-)

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

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

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

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

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

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

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