【发布时间】:2016-11-03 20:37:19
【问题描述】:
我正在使用 Rust 开发一个词法分析器/标记器,它需要将 UTF-8 输入文件(以 &[u8] 给出)解析为单独的 chars 以进行解析,但还必须跟踪文件中的字节位置。在稍后阶段——比如当需要在输入中报告错误时——我需要根据字节定位有问题的字符并回溯以找到其行上的相对位置。
将字节流解析为字符的惯用方法是什么(跟踪字节位置);标准库中是否有函数允许我计算后面有多少个尾随字节,或者一个字节是前导字节还是尾随字节,还是我必须根据 Unicode 标准自己实现这些?
例如:
// First to parse some input stream:
let input: &[u8] = "something";
for (chr, bytepos) in parse(input) {
// ...
}
// Later to locate a character based on the byte position and
// use is_leading_byte() to step backwards and count the number
// of characters since the start of the line:
let chr: u8 = input[some_bytepos];
chr.is_leading_byte();
chr.is_trailing_byte();
【问题讨论】:
-
听起来您要求
char_indices并将其存储到Vec(let everything: Vec<_> = input.char_indices().collect()) 中。 -
如果你有一个 UTF-8 的
&[u8],你应该把它变成一个&str。 -
你真的需要每个字符的确切字节位置吗?似乎您最好知道行首的字节位置,然后知道行内的 Unicode 字符位置。
-
@Fabian:把这个放在这里;万一你不知道。
char代表一个 Unicode 代码点,可能需要多个代码点来组成一个字素(尤其是涉及变音符号时,但不仅如此)。