Почти 5 лет назад Джоэл Спольски написал эту статью, «Абсолютный минимум, который должен знать каждый разработчик программного обеспечения о Unicode и наборах символов (без оправданий!)».
Как и многие, я внимательно прочитал его, понимая, что пора разобраться с этой «заменой ASCII». К сожалению, 5 лет спустя я чувствую, что вернул несколько вредных привычек в этой области. У тебя?
Я не пишу много специально международных приложений, однако я помог создать множество веб-сайтов ASP.NET, выходящих в Интернет, так что я думаю, это не оправдание.
Итак, для моей выгоды (и я верю многим другим) могу ли я получить информацию от людей по следующим вопросам:
Я должен признать, что у меня есть опыт работы с .NET, поэтому я был бы рад получить информацию о Unicode в .NET framework. Конечно, это не должно останавливать комментировать кого-либо с другим опытом.
Обновление: см. этот связанный вопрос, который ранее также задавался в StackOverflow.





Я некоторое время работал с программным обеспечением для поисковых систем - вы не поверите, сколько веб-сайтов обслуживают контент с заголовками HTTP или метатегами, которые лгут о кодировке страниц. Часто вы даже получаете документ, содержащий как символы ISO-8859, так и символы UTF-8.
Как только вы справитесь с некоторыми из таких проблем, вы начнете серьезно относиться к правильной кодировке данных, которые вы производите.
С тех пор, как я прочитал статью Джоэла и некоторые другие статьи I18n, я всегда внимательно следил за своей кодировкой символов; И это действительно работает, если вы делаете это постоянно. Если вы работаете в компании, где стандартно использовать UTF-8, и все это знают / делают это, это сработает.
Вот несколько интересных статей (помимо статьи Джоэла) на эту тему:
Цитата из первой статьи; Советы по использованию Unicode:
Эмпирическое правило: если вы никогда не просматриваете строку и не просматриваете ее, а вместо этого относитесь к ней строго как к блоку данных, вам будет намного лучше.
Даже выполнение такой простой задачи, как разделение слов или строчные строки, становится трудным, если вы хотите сделать это «в стиле Юникода».
И если вы хотите сделать это «по-юникодски», вам понадобится ужасно хорошая библиотека. Это невероятно сложно.
Изменить регистр настолько сложно, что даже API-функция Win32 CharUpper допускает, что иногда делает это неправильно, и вам следует использовать LCMapString.
.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() :(
Честно говоря, слова в верхнем регистре и тому подобное имеют для нас смысл только потому, что мы англичане и используем ASCII. Даже без юникода заставить его работать так, как ожидает пользователь, очень сложно.