C# Разбиение строки по пробелу пропускает один пробел

Код: string[] result = inputString.Split(" ");

Кусок оригинальной строки 15:14:49.523 INFORMATION Версия программы:.

Проблемная подстрока (игнорирует пробел): INFORMATION Версия.

В исходнике все пробелы одинаковые и равны 1. Мешающих знаков форматирования тут быть не может.

Что это такое?


Ответы (1 шт):

Автор решения: InterceptorTSK

Видимых пробелов [весьма распространенных] существует как минимум - два.

Это Пробел и Неразрывный пробел.

Их код-пойнты (Юникод): 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 - можете получать разные разбиения входной строки, зависящей от разных пробелов в этой строке. Иногда это очень очень удобно. Использование разных пробелов и приводит к разным контролируемым разбиениям.

→ Ссылка