Erlang - эксцентричность с акцентированными символами и строковым литералом - PullRequest
2 голосов
/ 10 июня 2010

Я пытаюсь реализовать функцию, чтобы различать французские гласные и согласные. Это должно быть тривиально, давайте посмотрим, что я записал:

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

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

Это довольно просто, но ведет себя некорректно:

2> char:is_vowel($â).
false

Хотя интерпретированная версия работает хорошо:

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

Что происходит?

1 Ответ

2 голосов
/ 10 июня 2010

Наиболее вероятная вещь здесь - конфликт кодировок.Ваш список гласных в скомпилированном коде использует различные значения символов для акцентированных символов.Вы должны увидеть это, определив acirc() -> $â. в своем скомпилированном коде и посмотрев на вывод числа, вызвав char:acirc(). против $â. в интерпретаторе.Я думаю, что компилятор предполагает, что исходные файлы находятся в кодировке ISO-Latin-1, но интерпретатор сверится с настройками вашей локали и будет использовать эту кодировку, вероятно, UTF-8, если вы находитесь в современном дистрибутиве Linux.См. Использование Unicode в Erlang для получения дополнительной информации.

...