Я собираю твиты из twitter с помощью erlang, и я пытаюсь сохранить только хэштеги в базе данных. Однако, когда я преобразовываю битстроны в строки списка, все твиты без латинского письма преобразуются в странные символы. Есть ли способ проверить, содержит ли строка только буквенно-цифровые символы в erlang?Есть ли способ проверить, является ли строка буквенно-цифровым в erlang
ответ
Самый простой способ - использовать регулярные выражения.
StringAlphanum = "1234abcZXYM".
StringNotAlphanum = "1ZXYMÄ#kMp&?".
re:run(StringAlphanum, "^[0-9A-Za-z]+$").
>> {match,[{0,11}]}
re:run(StringNotAlphanum, "^[0-9A-Za-z]+$").
>> nomatch
Вы можете легко сделать функцию из нее ...
isAlphaNum(String) ->
case re:run(String, "^[0-9A-Za-z]+$") of
{match, _} -> true;
nomatch -> false
end.
Но, на мой взгляд, лучше всего было бы решить основные проблемы, правильной интерпретации Юникода двоичных строк ,
Если вы хотите правильно представлять символы Юникода, не используйте binary_to_list
. Вместо этого используйте unicode-module. Unicode-двоичные строки не могут быть интерпретированы как двоичные, кодировка символов UTF-8, например, имеет некоторые особые ограничения, которые предотвращают это. Например: самый старший бит в первом символе определяет, если это многобайтовый символ.
Я взял следующий пример из this site, позволяет определить UTF8-String:
Utf8String = <<195, 164, 105, 116, 105>>.
Интерпретированный naiveley в двоичной форме она дает:
binary_to_list(Utf8String).
"äiti"
Интерпретированный с юникода-поддержка:
unicode:characters_to_list(Utf8String, utf8).
"äiti"
Да, я пробовал конвертировать с юникодом в список, и он работает. Спасибо. Однако я думаю, что мне нужны только буквенно-цифровые твиты. – Tilion
для латинских символов вы можете использовать эту функцию:
is_alpha([Char | Rest]) when Char >= $a, Char =< $z ->
is_alpha(Rest);
is_alpha([Char | Rest]) when Char >= $A, Char =< $Z ->
is_alpha(Rest);
is_alpha([Char | Rest]) when Char >= $0, Char =< $9 ->
is_alpha(Rest);
is_alpha([]) ->
true;
is_alpha(_) ->
false.
для прочего кодирования, вы можете добавить свой код кода и добавить его.
Спасибо! Это именно то, что мне нужно! – Tilion
Есть три io_lib функции специально для этого:
io_lib:printable_list/1
io_lib:printable_latin1_list/1
io_lib:printable_unicode_list/1
-spec show_message(wx:wx_object(), unicode:chardata() | term()) -> ok.
show_message(WxParent, Message) ->
Format = case io_lib:printable_unicode_list(Message) of
true -> "~ts";
false -> "~tp"
end,
Modal = wxMessageDialog:new(WxParent, io_lib:format(Format, [Message])),
_ = wxMessageDialog:showModal(Modal),
ok = wxMessageDialog:destroy(Modal).
Ознакомьтесь с документами io_lib: http://www.erlang.org/doc/man/io_lib.html#printable_list-1
Не лучше ли решить основную проблему? Для правильной конвертации строковых битов в utf8 не используйте 'binary_to_list', а' unicode'-модуль. –
Извините, я сосать в erlang. Что вы имеете в виду? Могу ли я конвертировать только твиты с латинскими буквами, которые нужно перечислить с помощью юникодного модуля? – Tilion
Нет, это означает, что если вы хотите иметь дело с битовой строкой, закодированной в utf8 (при этом все специальные символы отображаются правильно), используйте соответствующий модуль. –