Что возвращает свойство .NET String.Length? Суррогатная нейтральная длина или полная длина символа - программирование
Подтвердить что ты не робот

Что возвращает свойство .NET String.Length? Суррогатная нейтральная длина или полная длина символа

Документация и язык различаются между VS 2008 и 2010:


Документация VS 2008

Внутри текст хранится как сборка только для чтения объектов Char, каждая из которых представляет один символ Юникода, закодированный в UTF-16.... Длина строки представляет количество символов, независимо от того, сформированы ли символы из суррогатных пар Unicode или нет. Чтобы получить доступ к отдельным кодовым точкам Unicode в строке, используйте объект StringInfo. - http://msdn.microsoft.com/en-us/library/ms228362%28v=vs.90%29.aspx


Документация VS 2010

Внутри текст хранится как последовательный доступ только для чтения к объектам Char.... Свойство Length строки представляет количество содержащихся в нем Char объектов, а не количество символов Unicode. Чтобы получить доступ к отдельным кодовым точкам Unicode в строке, используйте объект StringInfo. - http://msdn.microsoft.com/en-us/library/ms228362%28v=VS.100%29.aspx

Язык, используемый в обоих случаях, не имеет четкого различия между "символом", "символом Unicode" , "Char class", "суррогатной парой Unicode" и "кодовой точкой Unicode".

Язык в документации VS2008, в котором указано, что "строка представляет количество символов, независимо от того, сформированы ли символы из суррогатных пар Unicode или нет", как представляется, определяет "символ" как объект, который может быть результатом Юникод-суррогатная пара, которая предполагает, что она может представлять собой 4-байтную последовательность, а не 2-байтную последовательность. В нем также вначале указывается, что объект "char" кодируется в UTF-16, что предполагает, что он может представлять суррогатную пару (4 байта вместо 2). Я уверен, что это неправильно.

Документация VS2010 немного точнее. Он проводит различие между "char" и "символом Unicode" , но не между "символом Unicode" и "кодовой точкой Unicode". Если кодовая точка относится к половине суррогатной пары, а "символ Юникода" представляет полную пару, то класс "char" назван неправильно и вообще не ссылается на "символ Юникода" (который они определяют это не так), и это действительно кодовая точка Unicode.

Итак, оба утверждения справедливы? (Да, я думаю.)

  • String.Length представляет длину кодовой строки Unicode и
  • String.Length не представляет ни длину символа Юникода, ни то, что мы будем считать истинной длиной символа (количество символов, которое будет отображаться), а количество объектов "char", каждое из которых представляет собой Unicode (не символ Юникода).
4b9b3361

Ответ 1

String.Length не учитывает суррогатные пары, он учитывает только символы UTF-16 (т.е. символы всегда 2 байта) - суррогатные пары считаются двумя символами.

Ответ 2

String.Length не учитывает суррогатные пары; однако метод StringInfo.LengthInTextElements делает.

StringInfo.SubstringByTextElements похож на String.Substring, но он работает с "текстовыми элементами", такими как суррогатные пары и комбинированные символы, а также обычные символы. Функциональность обоих этих методов основана на методе StringInfo.ParseCombiningCharacters, который извлекает начальный индекс каждого текстового элемента и сохраняет его в частном массиве.

".NET Framework определяет текстовый элемент как единицу текста, который отображается как один символ, то есть графема. Текстовый элемент может быть базовым символом, суррогатной парой или комбинационным символом последовательность." - http://msdn.microsoft.com/en-us/library/system.globalization.stringinfo.aspx

Ответ 3

И я считаю ложным. Второй вопрос был бы правдой, если бы вы спросили о подсчете кодов unicode, но вы спросили о "длине". Строковая длина - это количество ее элементов, которые являются словами. На всякий случай, если в строке BMP (Basic Multilingual Plane) есть только кодовые страницы Unicode, длина равна числу символов Unicode/кодовых точек. Если есть коды из-за BMP или осиротевших суррогатов (высокие или низкие суррогаты, которые не отображаются как упорядоченная пара), длина НЕ равна числу символов/кодовых точек.

Прежде всего, строка - это куча слов, список слов, массив слов или поток слов. Его содержание - это 16-битные слова и это. Чтобы назвать элемент "char" или "wchar", это грех в отношении символов Unicode. Поскольку символ юникода может иметь кодовую точку больше 0xFFFF, он не может быть сохранен в типе шириной 16 бит, и если этот тип называется char или wchar это еще хуже, потому что он может только когда-либо удерживать коды, ограниченные 0xFFFF, что соответствует стандарт unicode 1.0, которому nowerdays исполнилось 20 лет. Чтобы сохранить даже самый высокий код кодировки unicode в одном типе данных, этот тип должен иметь 21 бит, но такого типа нет, поэтому мы будем использовать 32-битный тип. На самом деле существует статический метод (класса char!), Который называется ConvertToUtf32(), который делает именно это, он может возвращать низкий кодовой код ASCII или даже самый высокий код кодировки unicode, в результате чего последний подразумевает, что этот метод может обнаружить суррогатная пара в позиции строки.