¿Cuál es la mejor práctica para manejar espacios en blanco al permitir que el usuario edite la configuración, los pares nombre = valor?

8

Por ejemplo, permite que el usuario defina la variable de ruta notoria. ¿Cómo lo interpretas apppath = C:\Program Files\App?

Esto parece una práctica adoptada por el lenguaje de programación para ignorar los espacios en blanco y los deja alrededor de la marca de igualdad para facilitar la lectura, pero podría ser un valor variable válido con espacios en blanco en la aplicación (considere, es un sufijo).

Incluso las teclas pueden contener espacios en blanco, ¿no?

¿Cuál es la mejor práctica general para mi aplicación? Si tengo:

key-example = value-example

debería interpretar el ser clave "key-example"o "key-example "y el valor de ser "value-example"o " value-example"?

Val
fuente
He leído tu pregunta dos veces y todavía no la entiendo. ¿Podría reformularlo un poco o mostrar algún código junto con lo que está tratando de lograr?
Jay Zelenkov
¿Qué lenguaje de programación estás usando para analizar el archivo?
Tulains Córdova
2
@ user61852: ¿por qué debería importar eso? Los requisitos para el archivo de configuración deben ser completamente independientes del lenguaje de programación. Piense en cinco programas diferentes escritos en cinco idiomas diferentes, todos compartiendo el mismo archivo de configuración.
Doc Brown
1
@ user61852 No importa. Traté de usarlo :en lugar de =porque lo uso exclusivamente en javascript (aunque mi pregunta no se limita a mi aplicación, por lo tanto, es irrelevante preguntar sobre su idioma), pero esto no me ayudó a leer la configuración como objeto JSON . JSON requiere todos los valores citados, lo cual es una carga innecesaria para el usuario.
Val
@valtih pregunté porque algunos idiomas ya tienen una API para archivos de configuración. Por ejemplo, Java tiene una clase de Propiedades que maneja ese tipo de archivos de clave / valor.
Tulains Córdova

Respuestas:

14

Como usuario , no espero que el espacio en blanco a ambos lados del signo igual cambie el valor de la clave o el valor. Vea esta pregunta relacionada en unix.SE también sobre lo confusa que puede ser la situación.

No lo haga más difícil para sus usuarios, recorte los espacios en blanco de la clave y el valor. Si el espacio en blanco inicial tiene un caso de uso real para cualquiera de ellos, entonces deje que el usuario ajuste la clave o el valor entre comillas.

dotancohen
fuente
2
Esta es la única respuesta que realmente responde la pregunta.
Carreras de ligereza en órbita
11

Depende de usted definir las reglas para su aplicación.

Por ejemplo, puede definir que:

  • Los espacios en blanco antes o después de ignorar el signo de igualdad,

  • El espacio en blanco dentro de la clave está prohibido,

  • El espacio en blanco dentro del valor solo se puede usar si el valor está entre comillas, entonces:

    say-hello = Hello, World!
    

    está prohibido, mientras que:

    say-hello = "Hello, World!"
    

    está permitido, lo que también hace posible tener prefijos de espacio en blanco:

    say-hello = "    Indentation is sweet."
    

Definir un formato puede ser una tarea compleja. Por ejemplo:

  • ¿Cómo escapas de las citas?

  • ¿Cómo escapas del personaje de escape que usas para escapar de las comillas?

  • ¿Cómo manejas los valores vacíos?

  • ¿Cuál es la longitud máxima de una clave? ¿Qué pasa con un valor?

  • ¿Cómo manejas los valores multilínea?

  • ¿Qué pasa con los caracteres Unicode de espacios en blanco que no sean un espacio (como un carácter de espacio sin interrupción)?

  • ¿Qué pasa con los caracteres Unicode que generalmente no se muestran en la pantalla ? Por ejemplo, ¿cómo maneja las categorías Unicode Cf o Zl?

  • ¿Cuáles son los caracteres permitidos en la clave? Por ejemplo, es:

    '
    

    una clave valida?

  • ¿Debería funcionar la siguiente línea? ¹

    say-hello ꘌ "Hello, World!"
    

    Sugerencia: el signo de igualdad no es un signo de igualdad, sino el carácter 0xa60c (alargador de sílaba Vai). Aunque pocas personas usarían este símbolo en lugar de la igualdad, el caso más frecuente es una copia y pega de Microsoft Word (observe de cerca las comillas):

    say-hello = “Hello, World!”
    
  • etc.

Es por eso que, a menos que esté completamente seguro de que puede definir un formato y describirlo de manera precisa y detallada, utilice un formato que ya exista .

JSON o XML son formatos de uso común que puede usar en casi todos los lenguajes de programación. Incluso puede abstraer el formato subyacente utilizando una base de datos. Redis , por ejemplo, es una solución popular para la tienda de valores clave.


Users Los usuarios de Chrome que usan Windows probablemente verán un signo de interrogación en un cuadrado. Con otros navegadores o con Chrome en Linux, el personaje aparece como un signo de igualdad y puede ser fácilmente engañoso: la única diferencia visual es que hay una pequeña diferencia en el espacio entre las barras horizontales.

Arseni Mourzenko
fuente
Bueno, se lo especificaré al usuario. Tenía en mente una línea simple por formato de par clave / valor separado por igualdad. Es decir, cada línea se divide =y las citas no son el problema, mientras que no está claro con espacios en blanco porque prefiero tenerlos y esto crea ambigüedad. Decir que los espacios en blanco iniciales / finales están recortados es suficiente. Gracias.
Val
@valtih: Especialmente recortar espacios en blanco al final es bueno, en mi opinión. La mayoría de los usuarios no se darían cuenta de que estaría allí, ya que es esencialmente invisible.
Bart van Ingen Schenau 01 de
@mainma Ese signo de igual tamaño de gran tamaño se representa perfectamente en mi casilla win7 en todo lo que he probado que es consciente de Unicode.
Dan está tocando el violín
@DanNeely: eso es raro. En Windows 8.1, Chrome muestra un signo de interrogación en un cuadrado.
Arseni Mourzenko 01 de
1
@MainMa Chrome siempre ha tenido problemas con la recuperación de Unicode en Windows. Ese ha sido un problema conocido prácticamente durante toda su existencia (¿~ 5 años?); aquí está (¿uno de?) el error, y bien podría no solucionarse en este punto. Funciona bien en Firefox e IE.
Bob