2 Stimmen

Erlang - Exzentrizität mit akzentuierten Zeichen und String-Literal

Ich versuche, eine Funktion zur Unterscheidung zwischen französischen Vokalen und Konsonanten zu implementieren. Es sollte trivial sein, mal sehen, was ich aufgeschrieben habe:

-define(vowels,"aeiouyàâéèêëôù").

is_vowel(Char) -> C = string:to_lower(Char),
                  lists:member(C,?vowels).

Es ist ziemlich einfach, aber es verhält sich nicht korrekt:

2> char:is_vowel($â).
false

Die gedolmetschte Version funktioniert zwar gut:

3> C = string:to_lower($â), lists:member(C,"aeiouyàâéèêëôù").
true

Was ist hier los?

2voto

Geoff Reedy Punkte 33293

Wahrscheinlich handelt es sich hier um einen Konflikt zwischen den Kodierungen. Ihre Vokalliste im kompilierten Code verwendet unterschiedliche Zeichenwerte für die akzentuierten Zeichen. Sie sollten in der Lage sein, dies zu erkennen, indem Sie definieren acirc() -> $â. in Ihrem kompilierten Code und sehen Sie sich die Zahl an, die durch den Aufruf von char:acirc(). gegen $â. im Dolmetscher. Ich denke, dass der Compiler davon ausgeht, dass die Quelldateien in ISO-Latin-1 kodiert sind, aber der Interpreter wird Ihre Gebietsschemaeinstellungen konsultieren und diese Kodierung verwenden, wahrscheinlich UTF-8, wenn Sie eine moderne Linux-Distribution verwenden. Siehe Verwendung von Unicode in Erlang für weitere Informationen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X