MST

星途 面试题库

面试题:Rust字符串在不同编码标准间的高效转换

假设你有一个包含多种语言字符的Rust字符串,需要将其从UTF - 16编码转换为GBK编码,并且要考虑性能优化,例如减少内存分配次数。描述你的实现思路并给出核心代码片段。
46.0万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 实现思路

    • 首先,Rust的String默认是UTF - 8编码,要处理UTF - 16编码的字符串,需要先将其解析。可以使用encoding_rs库来处理不同编码间的转换。
    • 由于UTF - 16有大端序(BE)和小端序(LE)之分,假设这里的UTF - 16是小端序(常见情况),可以先将字节数据按小端序解析为u16数组,再转换为UTF - 8编码的字符串。
    • 然后使用encoding_rs库中的GBK编码器将UTF - 8字符串转换为GBK编码的字节数组。
    • 在整个过程中,尽量复用已有的内存空间,减少不必要的中间数据分配。
  2. 核心代码片段

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);
}