什么是确定字符是否在Unicode范围内的最简单方法,在Rust中?

Dan*_*ath 3 unicode-string rust

我正在寻找最简单的方法来确定Rust中的字符是否在两个Unicode值之间.

例如,我想知道字符s是否在[#x1-#x8]或之间[#x10FFFE-#x10FFFF].有没有这样做的功能?

Chr*_*gan 6

最简单的方法,假设它们不是Unicode类别(在这种情况下你应该使用std::unicode)是使用常规比较运算符:

(s >= '\x01' && s <= '\x08') || s == '\U0010FFFE' || s == '\U0010FFFF'
Run Code Online (Sandbox Code Playgroud)

(如果你不知道这些东西的字面形式,可以得到8位十六进制文字\xXX,16位十六进制文字\uXXXX和32位十六进制文字\UXXXXXXXX.事实上,强制转换也可以正常工作,例如0x10FFFE as char,和会有效率;只是不太容易阅读.)

  • 请注意,整数到字符的转换是不安全的,并且可能会消失:例如,允许“0xFFFF_FFFF as char”,即使它不是有效的代码点。(此外,“std::unicode”当前是私有的;(大部分)其功能是通过“std::char”和“std:::str”访问的。) (2认同)

Dan*_*ath 6

我匹配一个字符的最简单的方法是这个

fn match_char(data: &char) -> bool {
    match *data {
        '\x01'...'\x08' |
        '\u{10FFFE}'...'\u{10FFFF}' => true,
        _ => false,
    }
}
Run Code Online (Sandbox Code Playgroud)

与一堆if语句相比,模式匹配字符对我来说是最简单的方法。它可能不是性能最好的解决方案,但它对我很有帮助。