48 votes

Caractère de séparation le plus fiable

Mettre à jour

Si vous étiez obligé d'utiliser un seul caractère dans une méthode de découpage, quel caractère serait le plus fiable?

Définition de fiable: un caractère de découpage qui ne fait pas partie des sous-chaînes individuelles découpées.

53voto

astander Points 83138

Nous utilisons actuellement

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

Je pense que c'est le son de bip, si je ne me trompe pas.

20voto

nd. Points 4738

En dehors de 0x0, qui peut ne pas être disponible (en raison de chaînes terminées par null, par exemple), les caractères de contrôle ASCII entre 0x1 et 0x1f sont de bons candidats. Les caractères ASCII 0x1c-0x1f sont même conçus pour cela et ont les noms Séparateur de fichier, Séparateur de groupe, Séparateur d'enregistrement, Séparateur d'unité. Cependant, ils sont interdits dans les formats de transport tels que XML.

Dans ce cas, les caractères des points de code d'utilisation privée unicode peuvent être utilisés.

Une dernière option serait d'utiliser une stratégie d'échappement, de sorte que le caractère de séparation puisse être entré de toute manière. Cependant, cela complique beaucoup la tâche et vous ne pouvez plus utiliser String.Split.

19voto

Guffa Points 308133

Vous pouvez utiliser en toute sécurité n'importe quel caractère comme délimiteur, à condition d'échapper la chaîne de caractères pour vous assurer qu'elle ne contient pas ce caractère.

Par exemple, choisissons le caractère 'a' comme délimiteur. (J'ai intentionnellement choisi un caractère commun pour montrer que n'importe quel caractère peut être utilisé.)

Utilisez le caractère 'b' comme code d'échappement. Nous remplaçons toute occurrence de 'a' par 'b1' et toute occurrence de 'b' par 'b2' :

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

Maintenant, la chaîne ne contient aucun caractère 'a', vous pouvez donc concaténer plusieurs de ces chaînes ensemble :

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

La chaîne ressemble maintenant à ceci :

b2b1nb1nb1ab1b1rdvb1rkab2b1rk

Vous pouvez maintenant diviser la chaîne sur 'a' et obtenir les parties individuelles :

b2b1nb1nb1
b1b1rdvb1rk
b2b1rk

Pour décoder les parties, vous effectuez le remplacement à l'inverse :

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

Donc, diviser la chaîne et décoder les parties se fait ainsi :

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

Ou en utilisant LINQ :

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

Si vous choisissez un caractère moins commun comme délimiteur, il y aura bien sûr moins d'occurrences à échapper. Le point est que la méthode s'assure que le caractère est sûr à utiliser comme délimiteur sans faire d'hypothèses sur les caractères présents dans les données que vous souhaitez mettre dans la chaîne.

8voto

rahul Points 84185

Je préfère généralement le symbole '|' comme caractère de séparation. Si vous n'êtes pas sûr de ce que l'utilisateur entre dans le texte, vous pouvez restreindre l'utilisateur à ne pas saisir certains caractères spéciaux et vous pouvez choisir parmi ces caractères le caractère de séparation.

6voto

yu_sha Points 2370

\ 0 est un bon caractère de séparation. Il est assez difficile (impossible ?) à entrer depuis le clavier et cela a du sens logique.

\ n est un autre bon candidat dans certains contextes.

Et bien sûr, les chaînes de caractères .Net sont unicode, pas besoin de vous limiter aux premiers 255. Vous pouvez toujours utiliser une lettre mongole rare ou un symbole Unicode réservé ou inutilisé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X