2016-10-15 6 views
1

Есть ли функция, чтобы сделать что-то вроде этого:Разбор строки, содержащей номер Юникода, в соответствующий символ Юникода?

fn string_to_unicode_char(s: &str) -> Option<char> { 
    // ... 
} 

fn main() { 
    let s = r"\u{00AA}"; // note the raw string literal! 
    string_to_unicode_char(s).unwrap(); 
} 

Обратите внимание, что r"\u{00AA}" использует raw string я. е. это не последовательность Unicode но 8 отдельных символов, а \u{00AA}.

Мне нужно интерпретировать/преобразовывать/анализировать эту строку и возвращать символ, если все хорошо, None в противном случае. У меня нет опыта работы с Unicode, поэтому любые идеи приветствуются.

+0

Будьте осторожны с понятием «символ юникода». Это непросто определить, и, конечно же, это не то же самое, что «char» (что является скалярным значением unicode). Например, «ɔ» - это один символ, но два 'char'. – mcarton

+0

@mcarton вы правы, но я думаю, что мне не нужны такие экзотические символы, 'unicode scalar' достаточно –

+2

Что касается обновления о необработанных строках, пожалуйста, опишите проблему, которую вы пытаетесь решить. – BurntSushi5

ответ

0

Чтобы получить символы с String, вы можете использовать метод chars(), чтобы получить итератор персонажей:

let ch : char = s.chars().next().unwrap(); 
2

Я действительно совершенно не понял ваш вопрос; мой старый ответ можно увидеть в edit logs

Есть встроенная функция для разбора строки, содержащей Юникода побег ржавчины в соответствующий юникода характер?

AFAIK, нет, нет встроенной функции, чтобы сделать это.

Ответ на вопрос «как это сделать сам» немного широк, поскольку есть много способов сделать это (и неясно, хотите ли вы также разобрать стандартные escape-последовательности, например "\n").

+0

спасибо за '& str', это очень полезное уведомление –

1

Я считаю, что функция, которую вы ищете char::from_u32:

fn string_to_unicode_char(s: &str) -> Option<char> { 
    // Do something more appropriate to find the actual number 
    let number = &s[3..7]; 

    u32::from_str_radix(number, 16) 
     .ok() 
     .and_then(std::char::from_u32) 
} 

fn main() { 
    let s = r"\u{00AA}"; // note the raw string literal! 
    let ch = string_to_unicode_char(s); 
    assert_eq!(ch, Some('\u{00AA}')); 
} 
Смежные вопросы