Текст и повседневные инструменты · Текстовый инструментарий
Почему прописные буквы — это не просто A–Z: ß, турецкое i и сопоставление регистра Юникода
· Фон
Юникод преобразование регистра локализация
Объясняет, почему верхний и нижний регистр определяется таблицами Юникода, а не арифметикой букв, за хорошо известными исключениями — ß становится SS, турецким ı без точки и греческой конечной сигмой — и что это означает для любого конвертера на основе браузера.
STRASSE и буква, которая выросла — почему прописные буквы «straße» меняют количество символов
Вставьте `straße` в конвертер и запишите его прописными буквами: JavaScript создает `STRASSE`. Результат заметно длиннее, поскольку строчная буква s преобразуется в две заглавные буквы с помощью операции по умолчанию, используемой здесь. Поэтому правило проверки, предполагающее, что преобразование регистра сохраняет количество символов, может отклонять, усекать или смещать действительный в противном случае немецкий текст.
Обратное направление не восстанавливает источник. При вводе нижнего регистра `STRASSE` получается `strasse`, а не `straße`, поскольку последовательность заглавных букв также представляет собой обычную пару букв s. Преобразование регистра, следовательно, представляет собой преобразование текста, а не обратимое кодирование. Сохраняйте исходное написание, если важны идентичность, точность отображения или точное сравнение.
Сопоставление регистра в виде таблицы, а не формулы — как Unicode определяет простые и полные сопоставления регистра для каждой буквы в регистре.
Код ASCII часто обучает удобному шаблону: латинские буквы в верхнем и нижнем регистре занимают предсказуемые диапазоны, поэтому для их соединения появляется числовое смещение. Эта модель перестает быть полезной, если текст содержит буквы за пределами этих диапазонов или если сопоставление создает более одного выходного символа. Поэтому преобразователь вызывает методы строкового регистра JavaScript вместо выполнения буквенной арифметики.
Репозиторий не предоставляет таблицы сопоставлений Unicode и не различает простые и полные сопоставления, поэтому эти детали не следует представлять как функции этого инструмента. Его наблюдаемый контракт уже: `toUpperCase()` и `toLowerCase()` делегируют движку браузера. Результаты следует тестировать в средах, где фактически будет использоваться преобразованный текст.
При преобразовании регистра используются сопоставления символов, предоставляемые механизмом, а не арифметика или таблицы, предоставляемые этим инструментом.
Результат изменения длины влияет не только на счетчик рядом с входом. Сохраненные смещения, диапазоны выбора, выделение и позиции курсора, рассчитанные до преобразования, впоследствии могут больше не указывать на предполагаемый текст. Тот же риск применим к любому рабочему процессу, который выделяет пространство вывода на основе длины ввода или предполагает, что один исходный символ всегда соответствует одному результирующему символу.
При циклическом переключении также могут теряться различия, даже если конкретный пример сохраняет ту же видимую длину. Несколько исходных вариантов написания могут сходиться в одной форме верхнего регистра, в результате чего операция нижнего регистра не имеет достаточной информации для выбора оригинала. Сравнивайте преобразованные значения только тогда, когда эта потеря приемлема; в противном случае сохраните оригиналы и используйте стратегию сравнения, разработанную с учетом требований к продукту.
Отображения, изменяющие длину, и почему обратное преобразование не всегда может восстановить источник
Греческая сигма дает другое предупреждение. В строчном греческом языке используются сигма-формы, которые могут меняться в зависимости от позиции в слове, поэтому изменение регистра не всегда может быть решено на основе одного изолированного символа. JavaScript получает полную строку, что позволяет его встроенному поведению нижнего регистра учитывать окружающий текст, а не заменять каждую заглавную сигму одним фиксированным глифом.
Тестируйте сигму внутри полных слов, а не только как односимвольный образец. Пунктуация, пробелы и границы слов являются частью входных данных, которые оценивает движок, и их редактирование может изменить результат в нижнем регистре. Для проверки локализации сохраните всю фразу, используемую интерфейсом, и сравните ее с утвержденным переводом, а не проверяйте только точки кода.
Греческая сигма показывает, что строчные буквы могут зависеть от окружающего текста.
Турецкий язык различает i с точкой и без точки таким образом, что преобразование регистра по умолчанию, независимое от локали, не моделирует поведение, специфичное для турецкого языка. Конфигурация ToolAcre явно говорит, что ее сопоставление не зависит от локали и что турецкие точки и точки i не являются особым случаем. Таким образом, правдоподобный результат не является свидетельством того, что имена, адреса или строки интерфейса были правильно преобразованы для турецких читателей.
Практический ответ — не добавлять замены после общего преобразования. Такие замены могут повредить текст на разных языках и при этом упустить контекст. Используйте операцию с учетом локали в программном обеспечении, локаль которого известна, и проверяйте контент на турецком или азербайджанском языке в этих настройках. В этом конвертере рассматривайте примеры i как демонстрацию документированного ограничения.
Турецкий с точками и без точек. Мне требуется обработка с учетом локали, которую этот конвертер не обеспечивает.
ToolAcre реализует UPPER и ниже, вызывая соответствующие строковые методы JavaScript для полного ввода. Он не передает локаль, не загружает языковой словарь и не запрашивает преобразование на стороне сервера. Таким образом, выходные данные представляют собой результат браузерного движка по умолчанию, который полезен для проверки обычного поведения приложения, но не для сертификации типографики, зависящей от языка.
Это различие имеет значение при воспроизведении ошибки. Запишите точную исходную строку, выбранное преобразование и результирующую строку вместо того, чтобы сообщать только о том, что заглавные буквы выглядят неправильно. Если производственный код использует те же методы по умолчанию JavaScript, преобразователь предлагает компактное сравнение. Если в производстве используются API-интерфейсы с учетом локали, сопоставление этой страницы не является соответствующим приемочным тестом.
Чего это не касается — правила написания заголовков для диграфов и историю столицы ẞ
Кнопка Title Case — еще одна трансформация с намеренно ограниченным контрактом. Он находит наборы букв, комбинированные знаки или апострофы, записывает первый символ в верхний регистр, а остальные — в нижний. В нем нет исключений из языкового словаря или руководства по стилю, поэтому аббревиатуры и имена собственные могут меняться, а маленькие слова, такие как `of` и `the`, пишутся с заглавной буквы, как и другие слова.
Эта статья не опирается на предложенную в наброске историю заглавных диезов или на более широкие правила для диграфов в заголовке, поскольку ни то, ни другое не установлено проверенными источниками. Эти темы могут быть ценными благодаря независимым ссылкам, но они не объясняют поставленную функцию. В этом случае надежным советом будет проверка каждого преобразованного заголовка и восстановление неправильного написания вручную.
Поведение регистра заголовков в этом инструменте без неподдерживаемой истории алфавита
Попробуйте три целенаправленные проверки в преобразователе регистра: `straße` в верхнем регистре, греческое слово в нижнем регистре, содержащее заглавную сигму, и проведите выборки i с точками и без точек в обоих направлениях. Наблюдайте за реальными строками, а не предскажите их на английском языке. Затем используйте «Отменить» между экспериментами, чтобы каждый результат начинался с исходного текста, а не с предыдущего преобразования с потерями.
Более широкий урок связан с эксплуатацией: преобразование регистра может изменить длину, стереть различия и зависеть от лингвистического контекста, который неизвестен операции по умолчанию. Используйте этот инструмент для выявления такого поведения, а не для того, чтобы обещать универсальную корректность локализации. Сохраняйте исходный текст, проверяйте полные реальные фразы и применяйте проверку с учетом локали везде, где требуется результат для конкретного языка.