面试题答案
一键面试-
实现思路:
- 首先,Rust的
String
默认是UTF - 8编码,要处理UTF - 16编码的字符串,需要先将其解析。可以使用encoding_rs
库来处理不同编码间的转换。 - 由于UTF - 16有大端序(BE)和小端序(LE)之分,假设这里的UTF - 16是小端序(常见情况),可以先将字节数据按小端序解析为
u16
数组,再转换为UTF - 8编码的字符串。 - 然后使用
encoding_rs
库中的GBK
编码器将UTF - 8字符串转换为GBK编码的字节数组。 - 在整个过程中,尽量复用已有的内存空间,减少不必要的中间数据分配。
- 首先,Rust的
-
核心代码片段:
use encoding_rs::GBK;
use std::convert::TryInto;
fn utf16_to_gbk(utf16_bytes: &[u8]) -> Vec<u8> {
// 假设utf16_bytes是小端序
let mut u16_values = Vec::with_capacity(utf16_bytes.len() / 2);
for i in (0..utf16_bytes.len()).step_by(2) {
let value = u16::from_le_bytes([utf16_bytes[i], utf16_bytes[i + 1]]);
u16_values.push(value);
}
let utf8_string = std::str::from_utf16(&u16_values).expect("Invalid UTF - 16 sequence");
let (gbk_bytes, _, _) = GBK.encode(utf8_string);
gbk_bytes.to_vec()
}
可以这样调用:
fn main() {
let utf16_data = &[0x48, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6F, 0x00]; // "Hello" in UTF - 16 little - endian
let gbk_result = utf16_to_gbk(utf16_data);
println!("GBK result: {:?}", gbk_result);
}