Страницы

Поиск по вопросам

четверг, 5 декабря 2019 г.

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

#c_sharp #строки #unicode


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

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

    


Ответы

Ответ 1



Также вспоминается такой неочевидный "баг". И такой, буквально на днях на хабре опять мелькнуло. В общем, строки — это не так просто, а когда дело доходит до обработки тонкостей юникода это становится ещё сложнее. Вообще, Джон Скит писал, что некоторые юникодные символы ломают .IndexOf. Смотри его ссылку на рекомендации по обработке строк. Если вам нужно, чтобы работало в соответствии с рекомендациями, то необходимо указывать культуру строки. Вообще, у вас в строке два символа. Один — это собственно то, что мы видим глазом: ⚽ e2 9a bd А вот второй — невидимый, но если вы выделите его в Linqpad, то видно будет что есть ещё один: (Можете проверить — любого из них достаточно, чтобы сломать IndexOf) Ещё лучше видно через специализируемые инструменты, наподобие такого. Это признак комбинирования символа через Variation Selectors, почти такой же как и комбинируемые символамы Пример использования можете посмотреть в вопросе про текст Zalgo.

Комментариев нет:

Отправить комментарий