Rust中u8转char后打印出现转义的原因咨询
问题:u8转char后打印出现转义的原因?
我编写了一个基于u8数组构建字符串的函数:当u8值为0或10时,推入特定字符;否则将数值转为char推入。但打印函数结果时,数值出现转义。
转换函数代码
fn convert_result_to_string(guess_result: &[u8; SEQ_LEN]) -> String { let mut output = String::new(); for (i, num) in guess_result.iter().enumerate() { if *num == 0 { output.push_str("*"); } else if *num == 10 { output.push_str("$"); } else { output.push(*num as char); } if i < SEQ_LEN-1 { output.push(' '); } } output }
调用代码
let test = [0, 5, 6, 10, 7]; let o = convert_result_to_string(&test); println!("o: {:?}", o);
输出结果
o: "* \u{5} \u{6} $ \u{7}"
请问为什么5、6、7会被转义?
原因与解决方法
转义的本质原因
u8值5、6、7对应的是ASCII控制字符(分别是ENQ、ACK、BEL),这类字符没有可见的图形化表现形式。Rust使用{:?}(Debug格式化)打印字符串时,会自动将不可见的控制字符转义为\u{X}格式的Unicode码点,方便开发者明确识别这些特殊字符。如果需要打印数字字符'5'/'6'/'7'
当前代码是直接把u8数值转成char,这会映射到ASCII对应位置的控制字符,而非数字字符。要得到'0'-'9'的字符,需要给u8值加上b'0'的偏移:// 替换原else分支的代码 output.push((*num + b'0') as char);这样u8值5就会转换为字符'5',打印时不再出现转义。
如果需要保留控制字符且避免Debug转义
若你确实需要使用这些控制字符,只是不想看到转义输出,可以用Display格式化({})代替Debug格式化:println!("o: {}", o);不过控制字符本身不可见,打印后可能显示为空白或终端特定符号,具体效果取决于终端的处理逻辑。
内容的提问来源于stack exchange,提问作者Sterling
相关产品推荐
相关产品推荐

