While CStr
通常用于 FFI,我正在阅读&[u8]
它以 NUL 结尾,并确保是有效的 UTF-8,因此不需要检查。
然而,NUL 终止符不一定位于切片的末尾。有什么好的方法可以得到这个&str
?
建议使用CStr::from_bytes_with_nul
,但这会在内部引起恐慌\0
字符(当\0
不是最后一个字符)。
我将使用迭代器适配器来查找第一个零字节的索引:
pub unsafe fn str_from_u8_nul_utf8_unchecked(utf8_src: &[u8]) -> &str {
let nul_range_end = utf8_src.iter()
.position(|&c| c == b'\0')
.unwrap_or(utf8_src.len()); // default to length if no `\0` present
::std::str::from_utf8_unchecked(&utf8_src[0..nul_range_end])
}
这样做的主要优点是要求捕获所有情况(例如数组中没有 0)。
如果您想要检查格式正确的 UTF-8 的版本:
pub fn str_from_u8_nul_utf8(utf8_src: &[u8]) -> Result<&str, std::str::Utf8Error> {
let nul_range_end = utf8_src.iter()
.position(|&c| c == b'\0')
.unwrap_or(utf8_src.len()); // default to length if no `\0` present
::std::str::from_utf8(&utf8_src[0..nul_range_end])
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)