Вы еще свободно владеете Unicode?

Почти 5 лет назад Джоэл Спольски написал эту статью, «Абсолютный минимум, который должен знать каждый разработчик программного обеспечения о Unicode и наборах символов (без оправданий!)».

Как и многие, я внимательно прочитал его, понимая, что пора разобраться с этой «заменой ASCII». К сожалению, 5 лет спустя я чувствую, что вернул несколько вредных привычек в этой области. У тебя?

Я не пишу много специально международных приложений, однако я помог создать множество веб-сайтов ASP.NET, выходящих в Интернет, так что я думаю, это не оправдание.

Итак, для моей выгоды (и я верю многим другим) могу ли я получить информацию от людей по следующим вопросам:

  • Как "избавиться" от ASCII раз и навсегда
  • Основное руководство при работе с Unicode.
  • Рекомендуемые (недавние) книги и веб-сайты по Unicode (для разработчиков).
  • Текущее состояние Unicode (через 5 лет после статьи Джоэлса)
  • Будущие направления.

Я должен признать, что у меня есть опыт работы с .NET, поэтому я был бы рад получить информацию о Unicode в .NET framework. Конечно, это не должно останавливать комментировать кого-либо с другим опытом.

Обновление: см. этот связанный вопрос, который ранее также задавался в StackOverflow.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
12
0
683
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я некоторое время работал с программным обеспечением для поисковых систем - вы не поверите, сколько веб-сайтов обслуживают контент с заголовками HTTP или метатегами, которые лгут о кодировке страниц. Часто вы даже получаете документ, содержащий как символы ISO-8859, так и символы UTF-8.

Как только вы справитесь с некоторыми из таких проблем, вы начнете серьезно относиться к правильной кодировке данных, которые вы производите.

Ответ принят как подходящий

С тех пор, как я прочитал статью Джоэла и некоторые другие статьи I18n, я всегда внимательно следил за своей кодировкой символов; И это действительно работает, если вы делаете это постоянно. Если вы работаете в компании, где стандартно использовать UTF-8, и все это знают / делают это, это сработает.

Вот несколько интересных статей (помимо статьи Джоэла) на эту тему:

Цитата из первой статьи; Советы по использованию Unicode:

  • Примите Unicode, не сопротивляйтесь; это, вероятно, правильный поступок, и если бы это было не так, вам, вероятно, все равно пришлось бы поступить.
  • Внутри вашего программного обеспечения храните текст как UTF-8 или UTF-16; то есть выберите одно из двух и придерживайтесь его.
  • По возможности обмениваться данными с внешним миром, используя XML; это избавляет от множества потенциальных проблем.
  • Постарайтесь сделать ваше приложение основанным на браузере, а не писать собственный клиент; браузеры действительно неплохо справляются с текстами мира.
  • Если вы используете чужой библиотечный код (а вы, конечно, используете), предполагайте, что его обработка Unicode нарушена, пока не будет доказано, что это правильно.
  • Если вы занимаетесь поиском, постарайтесь передать лингвистические проблемы и проблемы с персонажами тому, кто их понимает.
  • Сходите на Amazon или где-нибудь и купите последнюю версию печатного стандарта Unicode; он содержит довольно хорошо все, что вам нужно знать.
  • Потратьте некоторое время на изучение веб-сайта Unicode и изучение того, как работают диаграммы кода.
  • Если вам придется серьезно поработать с азиатскими языками, купите книгу О'Рейли по этой теме Кена Лунде.
  • Если у вас Macintosh, бегите и возьмите инструмент проверки шрифтов Unicode от Lord Pixel. Совершенно круто.
  • Если вам действительно придется разобраться с данными, сходите на одну из конференций по Unicode, проводимых два раза в год. Идут все эксперты, и если вы не знаете, что вам нужно знать, вы сможете найти там кого-нибудь, кто знает.

Эмпирическое правило: если вы никогда не просматриваете строку и не просматриваете ее, а вместо этого относитесь к ней строго как к блоку данных, вам будет намного лучше.

Даже выполнение такой простой задачи, как разделение слов или строчные строки, становится трудным, если вы хотите сделать это «в стиле Юникода».

И если вы хотите сделать это «по-юникодски», вам понадобится ужасно хорошая библиотека. Это невероятно сложно.

Честно говоря, слова в верхнем регистре и тому подобное имеют для нас смысл только потому, что мы англичане и используем ASCII. Даже без юникода заставить его работать так, как ожидает пользователь, очень сложно.

Arafangion 07.07.2011 12:01

Изменить регистр настолько сложно, что даже API-функция Win32 CharUpper допускает, что иногда делает это неправильно, и вам следует использовать LCMapString.

Ian Boyd 19.10.2011 21:18

.NET Framework использует кодировку Windows по умолчанию для хранения строк, которая оказывается UTF-16. Если вы не укажете кодировку при использовании большинства классов текстового ввода-вывода, вы напишете UTF-8 без спецификации и прочитаете, сначала проверив спецификацию, а затем предположив UTF-8 (я точно знаю, что StreamReader и StreamWriter ведут себя так Это довольно безопасно для «тупых» текстовых редакторов, которые не понимают спецификации, но для более умных, которые могут отображать UTF-8, или ситуации, когда вы фактически пишете символы вне стандартного диапазона ASCII.

Обычно это незаметно, но может интересным образом вскинуть голову. Вчера я работал с кем-то, кто использовал сериализацию XML для сериализации объекта в строку с помощью StringWriter, и он не мог понять, почему кодировка всегда была UTF-16. Поскольку строка в памяти будет иметь кодировку UTF-16 и это обеспечивается .NET, это единственное, что может сделать структура сериализации XML.

Итак, когда я пишу что-то, что не является просто одноразовым инструментом, я указываю кодировку UTF-8 с помощью спецификации. Технически в .NET вы всегда будете случайно распознавать Unicode, но только если ваш пользователь знает, что ваша кодировка определяется как UTF-8.

Это заставляет меня немного плакать каждый раз, когда я вижу, как кто-то спрашивает: «Как мне получить байты строки?» и предлагаемое решение использует Encoding.ASCII.GetBytes() :(

Другие вопросы по теме