C# Разбиение строки по пробелу пропускает один пробел
Код: string[] result = inputString.Split(" ");
Кусок оригинальной строки 15:14:49.523 INFORMATION Версия программы:.
Проблемная подстрока (игнорирует пробел): INFORMATION Версия.
В исходнике все пробелы одинаковые и равны 1. Мешающих знаков форматирования тут быть не может.
Что это такое?
Ответы (1 шт):
Видимых пробелов [весьма распространенных] существует как минимум - два.
Это Пробел и Неразрывный пробел.
Их код-пойнты (Юникод): Ux0020, Ux00A0;
Отсюда следует, что массив чаров в функцию Split, это:
// Ux0020 - SPACE
// Ux00A0 - NO-BREAK SPACE
char[] visibleSpaceSplitter = new char[] { 0x0020, 0x00A0 };
Тогда ваш код, это:
string[] result = inputString.Split(visibleSpaceSplitter);
Unicode Technical Site, Code Charts:
{Range 0000–007F}, C0 Controls and Basic Latin
{Range 0080–00FF}, C1 Controls and Latin-1 Supplement
{Range 2000–206F}, General Punctuation
П.С.: Видимых пробелов - четыре вида, есть ещё Группа пробелов и Рядом стоящий пробел, но они совершенно не распространены, это:
// Interval {Ux2000 - Ux200A}
// Ux2007 - FIGURE SPACE
// Ux202F - NARROW NO-BREAK SPACE
Эти пробелы можно включить в парсер, но в очень редких случаях.
Итого, если собрать полный список, это:
// Unicode Standard, Version 17.0
//
// Visible Spaces:
//
// [1] Ux0020 - SPACE
// [2] Ux00A0 - NO-BREAK SPACE
// [3] Interval {Ux2000 - Ux200A} - Spaces
// [4] Ux202F - NARROW NO-BREAK SPACE
//
// В последующие версии (17.0+) видимые пробелы
// могут быть добавлены в стандарт ещё и ещё.
// Пожалуйста, поддерживайте актуальный (latest) стандарт
// в своём коде.
П.П.С.: Меняя массив разбиения строки visibleSpaceSplitter - можете получать разные разбиения входной строки, зависящей от разных пробелов в этой строке. Иногда это очень очень удобно. Использование разных пробелов и приводит к разным контролируемым разбиениям.