Si sus necesidades son simples, puede hacer esto con un mapa sobre los caracteres en la cadena.
quote($<) -> "<";
quote($>) -> ">";
quote($&) -> "&";
quote($") -> """;
quote(C) -> C.
allí tendría que hacer
1> Raw = "string & \"stuff\" <".
2> Quoted = lists:map(fun quote/1, Raw).
Pero Quoted
no habría una lista plana, lo que es aún válido si se va a enviar a un archivo o como una respuesta HTTP. Es decir. ver las listas de Erlang.
En versiones más recientes de Erlang, ahora hay funciones de decodificación-decodificación para multibyte utf8 para representaciones de ancho de bytes/punto de código, consulte erlang unicode module.
comentarios formateado, para hacer ejemplos de código se destacan:
Ettore: Eso es algo de lo que estoy haciendo, aunque tengo que admitir caracteres de varios bytes. Aquí está mi código:
xmlencode([], Acc) -> Acc;
xmlencode([$<|T], Acc) -> xmlencode(T, AcC++ "<"); % euro symbol
xmlencode([226,130,172|T], Acc) -> xmlencode(T, AcC++ "€");
xmlencode([OneChar|T], Acc) -> xmlencode(T, lists:flatten([Acc,OneChar])).
Aunque preferiría no reinventar la rueda si es posible.
dsmith: La cadena que está utilizando normalmente sería una lista de puntos de código Unicode (es decir, una lista de números), por lo que cualquier codificación de bytes dada es irrelevante. Solo deberías preocuparte por codificaciones específicas si trabajas directamente con binarios.
Para aclarar, el punto de código Unicode para el símbolo del euro (decimal 8364) sería un elemento único en su lista. Así que usted acaba de hacer esto:
xmlencode([8364|T], Acc) -> xmlencode(T, AcC++ "€");
Solo para asegurarse de que sabe esto: URL Encoding! = XML Encoding – ZeissS