Erlang - Eccentricity mit akzentuierten Zeichen und Stringliteral
-
26-09-2019 - |
Frage
Ich versuche, eine Funktion zu implementieren zwischen französisch Vokale und consonnants zu unterscheiden. Es sollte trivial sein, mal sehen, was ich geschrieben habe unten:
-define(vowels,"aeiouyàâéèêëôù").
is_vowel(Char) -> C = string:to_lower(Char),
lists:member(C,?vowels).
Es ist ziemlich einfach, aber es verhält sich falsch:
2> char:is_vowel($â).
false
Während die interpretierte Version funktioniert gut:
3> C = string:to_lower($â), lists:member(C,"aeiouyàâéèêëôù").
true
Was ist los?
Lösung
Die wahrscheinlichste Sache hier ist ein Konflikt von Kodierungen. Ihre Vokale Liste im kompilierten Code unterscheidet Zeichenwerte für die akzentuierte Zeichen. Sie sollten dies sehen können, indem acirc() -> $â.
in kompilierten Code und Blick auf die Zahl Ausgang definieren durch char:acirc().
gegen $â.
im Interpreter aufgerufen wird. Ich denke, dass der Compiler, dass die Quelldateien sind in der ISO-Latin-1 Codierung geht davon aus, aber der Dolmetscher wird Ihre lokalen Einstellungen konsultiert und diese Codierung verwenden, wahrscheinlich UTF-8, wenn Sie auf einer modernen Linux-Distribution sind. Siehe Verwendung von Unicode in Erlang für weitere Informationen.