我正在寻找最简单的方法来确定Rust中的字符是否在两个Unicode值之间。什么是最简单的方法来确定一个字符是否在Unicode范围内,在Rust中?
例如,我想知道字符s
是否在[#x1-#x8]
或[#x10FFFE-#x10FFFF]
之间。有没有这样做的功能?
我正在寻找最简单的方法来确定Rust中的字符是否在两个Unicode值之间。什么是最简单的方法来确定一个字符是否在Unicode范围内,在Rust中?
例如,我想知道字符s
是否在[#x1-#x8]
或[#x10FFFE-#x10FFFF]
之间。有没有这样做的功能?
为我匹配字符最简单的方法是这样的
fn match_char(data: &char) -> bool {
match *data {
'\x01'...'\x08' |
'\u{10FFFE}'...'\u{10FFFF}' => true,
_ => false,
}
}
模式相匹配的角色对我来说是最简单的途径,比起一堆if
声明。它可能不是最高性能的解决方案,但它为我提供了很好的服务。
最简单的方法,假设他们是不是Unicode类别(在这种情况下,你应该使用std::unicode
)是使用常规的比较操作:
(s >= '\x01' && s <= '\x08') || s == '\U0010FFFE' || s == '\U0010FFFF'
(如果你不知道的这些东西的文字形式,一个得到8位十六进制文字\xXX
,16位十六进制文字\uXXXX
和32位十六进制文字\UXXXXXXXX
。事实上,铸造也可以很好地工作,例如0x10FFFE as char
,并且一样有效;不太容易阅读)。
请注意,整数到字符的转换是不安全的,可能会消失:例如尽管它不是有效的代码点,但允许“0xFFFF_FFFF as char”。 (另外'std :: unicode'目前是私有的;(大部分)它的功能是通过'std :: char'和'std ::: str'来访问的。) – huon
性能应该和我的答案一样。就我个人而言,在这种情况下,我更喜欢我的技术(如果有非布尔输出或更多的可能性,我会使用匹配),但两者都可以。 –
它对我来说是可读性。我有很多这些条件(意见不同 - 令人震惊),为了便于阅读,我要么选择匹配模式的路线,要么为了速度而使用'char - '\ x01'<= 7'来查看速度[aosabook-xml光(http://aosabook.org/en/posa/parsing-xml-at-the-speed-of-light.html) –