2015-11-30 3 views
3

Я собираю твиты из twitter с помощью erlang, и я пытаюсь сохранить только хэштеги в базе данных. Однако, когда я преобразовываю битстроны в строки списка, все твиты без латинского письма преобразуются в странные символы. Есть ли способ проверить, содержит ли строка только буквенно-цифровые символы в erlang?Есть ли способ проверить, является ли строка буквенно-цифровым в erlang

+0

Не лучше ли решить основную проблему? Для правильной конвертации строковых битов в utf8 не используйте 'binary_to_list', а' unicode'-модуль. –

+0

Извините, я сосать в erlang. Что вы имеете в виду? Могу ли я конвертировать только твиты с латинскими буквами, которые нужно перечислить с помощью юникодного модуля? – Tilion

+0

Нет, это означает, что если вы хотите иметь дело с битовой строкой, закодированной в utf8 (при этом все специальные символы отображаются правильно), используйте соответствующий модуль. –

ответ

3

Самый простой способ - использовать регулярные выражения.

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" 
+0

Да, я пробовал конвертировать с юникодом в список, и он работает. Спасибо. Однако я думаю, что мне нужны только буквенно-цифровые твиты. – Tilion

0

для латинских символов вы можете использовать эту функцию:

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. 

для прочего кодирования, вы можете добавить свой код кода и добавить его.

+0

Спасибо! Это именно то, что мне нужно! – Tilion

2

Есть три io_lib функции специально для этого:

  • io_lib:printable_list/1
  • io_lib:printable_latin1_list/1
  • io_lib:printable_unicode_list/1

Вот an example of one in use:

-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

 Смежные вопросы

  • Нет связанных вопросов^_^