Подтвердить что ты не робот

Какая версия Unicode поддерживается платформой .NET и на какой версии Windows относится к классам символов?

Обновленный вопрос №

Что касается классов символов, сравнения, сортировки, нормализации и сопоставлений, какая версия или версии Unicode поддерживаются платформами .NET?

Оригинальный вопрос

Я немного смутно помню, что .NET поддерживал Unicode версии 3.0 и что внутренняя кодировка UTF-16 на самом деле не UTF-16, но на самом деле использует UCS-2, что не то же самое. Кажется, например, что символы выше U + FFFF невозможны, т.е. Считают:

string s = "\u1D7D9"; // ("Mathematical double-struck digit one") 

и сохраняет строку "ᵽ9".

В основном я ищу окончательные ответы на следующие вопросы:

  • Если это не верно UTF-16 в .NET, что это такое?
  • Какая версия Unicode поддерживается .NET?
  • Если последние версии не поддерживаются или планируются в ближайшем будущем, знает ли кто-нибудь (не) коммерческая библиотека или как я могу решить эту проблему?

¹) Я обновил вопрос, как с прохождением времени, он кажется более уместным в отношении ответов и для более широкого сообщества. Я оставил исходный вопрос, вместо которого в ответах были указаны ответы. Также старый UCS-2 (без суррогатов) использовался в современных 32-битных версиях Windows,.NET всегда использовал UTF-16 (с суррогатами) внутри.

4b9b3361

Ответ 1

Внутренне,.NET - UTF-16. В некоторых случаях, например, когда ASP.NET пишет ответ, по умолчанию он использует UTF-8. Оба они могут обрабатывать более высокие плоскости.

Причина, по которой люди иногда ссылаются на .NET как на UCS2 (я думаю, потому что вижу несколько других причин), что Char строго 16 бит, а один Char не может использоваться для представления верхних плоскостей. Char, однако, имеет перегрузки статических методов (например, Char.IsLetter), которые могут работать с символами UTF-16 с высокой плоскостью внутри строки. Строки сохраняются как истинные UTF-16.

Вы можете обращаться к высоким кодовым точкам Unicode напрямую, используя прописные буквы \U - например. "\U0001D7D9" - но опять же, только внутри строк, а не символов.

Что касается версии Unicode, из документации MSDN:

"В .NET Framework 4 информация о сортировке, обсадке, нормализации и Unicode синхронизируется с Windows 7 и соответствует стандарту Unicode 5.1."

Обновление 1:. Однако стоит отметить, что это не означает, что полностью поддерживается Unicode 5.1 - ни в Windows 7, ни в .NET 4.0

Windows 8 нацелен на Unicode 6.0 - Я предполагаю, что .NET Framework 4.5 может синхронизироваться с этим, но не нашли источников, подтверждающих это, И еще раз, это не означает, что весь стандарт реализован.

Обновление 2: Эта заметка о Roslyn подтверждает, что базовая платформа определяет поддержку Unicode для компилятора, и в ссылка на код, он объясняет, что С# 6.0 поддерживает Unicode 6.0 и выше (с нарушением изменений для идентификаторов С# в результате).

Обновление 3:. Начиная с версии .NET 4.5, новый класс SortVersion, чтобы получить поддерживаемый Unicode, вызывая статическое свойство SortVersion.FullVersion. На на той же странице Microsoft объясняет, что .NET 4.0 поддерживает Unicode 5.0 на всех платформах, а .NET 4.5 поддерживает Unicode 5.0 для Windows 7 и Unicode 6.0 в Windows 8. Это немного контрастирует официальное утверждение "что нового" здесь, в котором говорится о версии 5.x и 6.0 соответственно. Из моего собственного (редактора: Abel) опыта в большинстве случаев кажется, что в .NET 4.0 Unicode 5.1 поддерживается хотя бы для классов символов, но я не тестировал сортировку, нормализацию и сопоставления. Это похоже на то, что сказано в MSDN, как указано выше.

Ответ 2

Этот символ поддерживается. Следует отметить, что для символов Unicode с более чем 2 байтами вы должны объявить их с прописными буквами '\ U', например:

string text = "\U0001D7D9"

Если вы создаете приложение WPF с этим символом в текстовом блоке, оно должно отлично отображать символ с двумя символами.

Ответ 3

MSDN кратко описывает это здесь: http://msdn.microsoft.com/en-us/library/9b1s4yhz(v=vs.90).aspx

Я пробовал это:

    static void Main(string[] args) {
        string someText = char.ConvertFromUtf32(0x1D7D9);
        using (var stream = new MemoryStream()) {
            using (var writer = new StreamWriter(stream, Encoding.UTF32)) {
                writer.Write(someText);
                writer.Flush();
            }
            var bytes = stream.ToArray();
            foreach (var oneByte in bytes) {
                Console.WriteLine(oneByte.ToString("x"));
            }
        }
    }

И получил дамп массива байтов, содержащий правильную спецификацию и правильное представление кодового пункта \u1D7D9, для этих кодировок:

  • UTF8
  • UTF32
  • Юникод (UTF-16)

Итак, я предполагаю, что более высокие плоскости поддерживаются и что UTF-16 действительно UTF-16 (а не UCS-2)

Ответ 4

.NET Framework 4.6 и 4.5 и 4 и 3.5 и 3.0 - Стандарт Unicode, версия 5.0 .NET Framework 2.0 и 1.1 - Стандарт Unicode, версия 3.1

Полные ответы можно найти здесь в разделе Замечания.