Если ваши потребности просты, вы можете сделать это с картой над символами в строке.
quote($<) -> "<";
quote($>) -> ">";
quote($&) -> "&";
quote($") -> """;
quote(C) -> C.
Тогда вы бы сделали
1> Raw = "string & \"stuff\" <".
2> Quoted = lists:map(fun quote/1, Raw).
Но Quoted
будетне быть простым списком, который все еще хорошо, если вы собираетесь отправить его в файл или в виде http-ответа.Т.е. смотрите io-списки Эрланга.
В более поздних выпусках Erlang теперь есть функции кодирования-декодирования для многобайтовых представлений utf8 в широкие байты / кодовые точки, см. Модуль erlang unicode .
Переформатированные комментарии, чтобы выделить примеры кода:
ettore : Это то, что я делаю, хотя я должен поддерживать многобайтовые символы.Вот мой код:
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])).
Хотя я бы предпочел не изобретать велосипед, если это возможно.
dsmith : Используемая строка обычно будет спискомкодовых точек Unicode (т. е. список чисел), и поэтому любое данное байтовое кодирование не имеет значения.Вам нужно будет беспокоиться только об определенных кодировках, если вы работаете напрямую с двоичными файлами.
Для пояснения, код Unicode для символа евро (десятичное 8364) будет единственным элементом в вашем списке.Так что вы бы просто сделать это:
xmlencode([8364|T], Acc) -> xmlencode(T, Acc ++ "€");