Подтвердить что ты не робот

Самый надежный разделительный символ

Обновление

Если вы были вынуждены использовать один char для метода split, который char был бы самым надежным?

Определение надежности: разделительный символ, который не является частью отдельных подстрок, разделенных.

4b9b3361

Ответ 1

В настоящее время мы используем

public const char Separator = ((char)007);

Я думаю, что это звуковой сигнал, если я не ошибаюсь.

Ответ 2

Помимо 0x0, которые могут быть недоступны (из-за строк с завершающим нулем, например), управляющие символы ASCII между 0x1 и 0x1f являются хорошими кандидатами. Символы ASCII 0x1c-0x1f даже разработаны для такой вещи и имеют имена "Сепаратор файлов", "Сепаратор групп", "Сепаратор записи", "Сепаратор устройств". Однако они запрещены в транспортных форматах, таких как XML.

В этом случае могут использоваться символы из юникод личных кодовых точек.

Один из последних вариантов - использовать стратегию экранирования, так что символ разделения может быть каким-то образом введен. Однако это усложняет задачу довольно много, и вы больше не можете использовать String.Split.

Ответ 3

Вы можете безопасно использовать любой символ, который вам нравится, в качестве разделителя, если вы избежите строки, чтобы вы знали, что она не содержит этого символа.

Пусть, например, выберите символ "a" в качестве разделителя. (Я намеренно выбрал обычный символ, чтобы показать, что любой символ можно использовать.)

Используйте символ "b" как escape-код. Мы заменяем любое вхождение "a" на "b1" и любое вхождение "b" в "b2":

private static string Escape(string s) {
   return s.Replace("b", "b2").Replace("a", "b1");
}

Теперь строка не содержит символов 'a', поэтому вы можете поместить несколько из этих строк вместе:

string msg = Escape("banana") + "a" + Escape("aardvark") + "a" + Escape("bark");

Строка теперь выглядит так:

b2b1nb1nb1ab1b1rdvb1rkab2b1rk

Теперь вы можете разбить строку на "a" и получить отдельные части:

b2b1nb1nb1
b1b1rdvb1rk
b2b1rk

Чтобы декодировать части, которые вы заменяете назад:

private static string Unescape(string s) {
   return s.Replace("b1", "a").Replace("b2", "b");
}

Итак, разделение строки и unencoding частей выполняется следующим образом:

string[] parts = msg.split('a');
for (int i = 0; i < parts.length; i++) {
  parts[i] = Unescape(parts[i]);
}

Или используя LINQ:

string[] parts = msg.Split('a').Select<string,string>(Unescape).ToArray();

Если вы выбираете менее общий символ в качестве разделителя, есть, конечно, меньше случаев, которые будут экранированы. Дело в том, что этот метод гарантирует, что символ безопасен для использования в качестве разделителя без каких-либо предположений о том, какие символы существуют в данных, которые вы хотите поместить в строку.

Ответ 4

Я обычно предпочитаю символ | 'как символ разделения. Если вы не уверены в том, что пользователь вводит в текст, вы можете запретить пользователю вводить некоторые специальные символы, и вы можете выбрать из этих символов разделительный символ.

Ответ 5

\ 0 - хороший разделительный символ. Это довольно сложно (невозможно?) Вводить с клавиатуры, и это логично.

\n - еще один хороший кандидат в некоторых контекстах.

И, конечно, строки .Net - это unicode, не нужно ограничивать себя первыми 255. Вы всегда можете использовать редкую монгольскую букву или какой-то зарезервированный или неиспользуемый символ Unicode.

Ответ 6

Это зависит от того, что вы раскалываете.

В большинстве случаев лучше всего использовать разделенные символы, которые обычно используются, например

значение, значение, значение

значение | значение | значение

ключ = значение; ключ = значение;

ключ: значение, ключ: значение;

Вы можете использовать цитированные идентификаторы с помощью запятых:

"value" , "value" , "value with, inside", "value"

Я сначала использую ,, затем |, тогда, если я не могу использовать ни один из них, я использую разделение-разрыв char §

Обратите внимание, что вы можете ввести любой ASCII char с помощью ALT+number (только на цифровой клавиатуре), поэтому § есть ALT+21

Ответ 7

Есть перегрузки в String.Split, которые берут разделители строк...

Ответ 8

Я бы сказал, что это полностью зависит от ситуации; если вы пишете простую систему чата TCP/IP, вы, очевидно, не должны использовать "\n" в качестве раскола. Но "\ 0" - хороший символ для использования из-за того, что пользователи никогда не могут используйте его!

Ответ 9

Прежде всего, в С# (или .NET) вы можете использовать несколько разделенных символов в одной операции разделения.

String.Split Method (Char[]) Ссылка здесь
Массив символов Юникода, которые ограничивают подстроки в этом экземпляре, пустой массив, который не содержит разделителей, или нулевую ссылку (Nothing в Visual Basic).

На мой взгляд, нет МОЩНОГО надежного разделительного характера, однако некоторые из них более подходят, чем другие.

Популярные разделительные символы, такие как вкладка, запятая, труба, хороши для просмотра неразделенной строки/строки.

Если это только для хранения/обработки, более безопасными символами являются, вероятно, те, которые редко используются или которые не легко вводятся с клавиатуры.

Это также зависит от контекста использования. Например. Если вы ожидаете, что данные будут содержать адреса электронной почты, "@" - нет.

Скажем, мы должны были выбрать один из ASCII set. Есть целый ряд на выбор. Например. "," ^" и некоторых непечатаемых символов. Однако будьте осторожны с некоторыми персонажами, но не все они подходят. Например. 0x00 может оказать неблагоприятное воздействие на некоторые системы.

Ответ 10

Это зависит от контекста, в котором он используется. Если вы говорите о очень общем символе разграничения, я не думаю, что есть ответ на один размер.

Я нахожу, что нулевой символ ASCII '\ 0' часто является хорошим кандидатом, или вы можете пойти с идеей nitzmahone и использовать более одного символа, тогда это может быть так же безумно, как вам хочется.

В качестве альтернативы вы можете анализировать ввод и избегать любых экземпляров вашего разделительного символа.

Ответ 11

"|" знак трубы в основном используется, когда вы передаете аргументы.. методу, принимающему только параметр типа строки. Это широко используется в SQL Server SP, где вам необходимо передать массив в качестве параметра. В основном это зависит от ситуации, в которой вы нуждаетесь.