Некорректная обработка IndexOf или же нет?

133
01 января 2020, 19:20

Данный код возвращает 0, хотя по документации должен возвращать -1. Я что-то не правильно делаю? Версия .NET - 4.7.1.

Console.WriteLine("Dddd".IndexOf("⚽️", 0));
Answer 1

Также вспоминается такой неочевидный "баг". И такой, буквально на днях на хабре опять мелькнуло. В общем, строки — это не так просто, а когда дело доходит до обработки тонкостей юникода это становится ещё сложнее.

Вообще, Джон Скит писал, что некоторые юникодные символы ломают .IndexOf.

Смотри его ссылку на рекомендации по обработке строк.

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

Вообще, у вас в строке два символа. Один — это собственно то, что мы видим глазом:

⚽ e2 9a bd

А вот второй — невидимый, но если вы выделите его в Linqpad, то видно будет что есть ещё один:

(Можете проверить — любого из них достаточно, чтобы сломать IndexOf)

Ещё лучше видно через специализируемые инструменты, наподобие такого.

Это признак комбинирования символа через Variation Selectors, почти такой же как и комбинируемые символамы

Пример использования можете посмотреть в вопросе про текст Zalgo.

READ ALSO
Bluetooth low energey с чего начать

Bluetooth low energey с чего начать

Есть цель создать приложение, под heart rate monitor, который работает по BLEВ идеале хочу написать на C#

115
ObservableCollection не обновляется в DataGrid WPF

ObservableCollection не обновляется в DataGrid WPF

Споткнулся на обновлении DataGrid при добавлении элемента в ObservableCollectionЕсть некий класс Material:

124
Наследование от модели без записи в БД EF6

Наследование от модели без записи в БД EF6

Заполняю datagridview вот так:

132
Установить высоту элементов ListBox равную самому высокому элементу

Установить высоту элементов ListBox равную самому высокому элементу

В списке находятся превьюшки с подписямиПодписи должны выравниваться по нижнему, а превьюшки по верхнему краю своего контейнера

99