Unicode码点到Rust字符串

4

我刚开始学习Rust,如果有我漏掉的简单方法,请见谅。我的一个程序在运行时获取 Unicode 代码点作为字符串,我想将这些代码点转换为包含它们所代表字符的 Rust 字符串。基本上,我正在尝试找出如何为下面的代码定义parse_unicode

fn parse_unicode(input: &str) -> String {
    input.to_string() // not working implementation
}

#[test]
fn test_parse_unicode() {
    let parsed_content = parse_unicode("1f44d");
    assert_eq!(parsed_content, String::from("\u{1f44d}"));
}

我看到有一个函数可以将字节数组转换为字符串,因此如果我自己编写代码将这些码点解析成字节数组,然后就可以将它们转换为字符串,但我希望有更符合惯用法(或者至少更容易)的方法。


你如何区分两个代码点?你的问题不太明确,目前只能返回一个字符而非字符串,请参考 https://lib.rs/crates/unicode_reader。 - Stargateur
@Stargateur,你是说在同一输入中如何区分两个码点吗?它们是由破折号分隔的,例如“1f1e6-1f1eb”。我想,如果我能够转换一个码点,那么在“-”上拆分字符串并解决其余问题将会很容易,但我应该在问题中解释清楚这一点。对此我感到非常抱歉。看起来你提供的代码基本上解决了我的问题,如果你想将其作为答案发布也可以。 - Mindful
我需要加快我的进度,因为我没有太多时间,所以我想自由地拖延。 - Stargateur
1个回答

6

Stargateur基本上用在评论中链接的代码解决了我的问题,代码如下:

use std::num::ParseIntError;

#[derive(Debug, PartialEq)]
enum Error {
    Int(ParseIntError),
    Unicode(u32),
}

fn parse_unicode(input: &str) -> Result<char, Error> {
    let unicode = u32::from_str_radix(input, 16).map_err(Error::Int)?;
    char::from_u32(unicode).ok_or_else(|| Error::Unicode(unicode))
}

#[test]
fn test_parse_unicode() {
    assert_eq!(parse_unicode("1f44d"), Ok(''));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接