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

Да, метод ContainerFromItem ничего не возвращает, даже если вы вызываете его из прямого родительского TreeViewItem.

Возможно, вам придется немного переделать. Если вы создадите все как явный TreeViewItem, вы сможете сохранить ссылку на него и установить IsSelected на нем.

23
задан John Saunders 13 April 2011 в 22:48
поделиться

3 ответа

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

20
ответ дан Paul Betts 13 April 2011 в 22:48
поделиться

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

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

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

27
ответ дан Triynko 13 April 2011 в 22:48
поделиться

И то, и другое я бы посчитал ложным. Второй вопрос будет верным, если вы спросите о количестве кодовых точек Юникода, но спросите о «длине». Длина строки - это количество ее элементов, которые являются словами. На случай, если в строке есть только кодовые точки Юникода из BMP (базовой многоязычной плоскости), длина равна количеству символов / кодов Юникода. Если есть кодовые точки из-за BMP или суррогатов-сирот (суррогаты высокого или низкого уровня, которые не отображаются в виде упорядоченной пары), длина НЕ равна количеству символов / кодовых точек.

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

1
ответ дан brighty 13 April 2011 в 22:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: