gpt4 book ai didi

string - 将 Vec 或 Vec 转换为 &str

转载 作者:行者123 更新时间:2023-11-29 07:46:08 28 4
gpt4 key购买 nike

我正在学习 Rust 编程来实现一个小程序,但我对字符串转换有点迷茫。

在我的程序中,我有一个向量如下:

let mut name: Vec<winnt::WCHAR> = Vec::new(); 

WCHARu16 相同在我的 Windows 机器上。

我交出Vec<u16>到用数据填充它的 C 函数(作为指针)。然后我需要将向量中包含的字符串转换为 &str .但是,无论我尝试什么,我都无法使这种转换正常进行。

我唯一设法开始工作的是将它转换为 WideString :

 widestr = unsafe { WideCString::from_ptr_str(name.as_ptr()) };

但这似乎是朝着错误的方向迈出了一步。

转换 Vec<u16> 的最佳方法是什么?到&str假设向量包含一个有效且以 null 结尾的字符串。

最佳答案

I then need to convert the string contained in the vector into a &str. However, no matter, what I try, I can not manage to get this conversion working.

没有办法使其成为“免费”转换。

&str 是用 UTF-8 编码的 Unicode 字符串。这是一种面向字节的编码。如果您使用的是 UTF-16(或不同但通用的 UCS-2 编码),则无法将一个作为另一个来读取。这相当于尝试将 JPEG 图像读取为 PDF。两个数据 block 都可能是一个字符串,但编码很重要。

第一个问题是“你真的需要这样做吗?”。很多时候,您可以从一个函数中获取数据并将其铲回另一个函数中,而无需查看它。如果您能摆脱困境,那可能是最佳答案。

如果您确实需要转换它,那么您必须处理可能发生的错误。任意 16 位整数数组可能是有效的 UTF-16 或 UCS-2。这些编码具有很容易产生无效字符串的边缘情况。 Null 终止是另一个方面 - Unicode 实际上允许嵌入 NUL 字符,因此以 null 终止的字符串不能包含所有可能的 Unicode 字符!

一旦确保编码有效 1 并计算出输入向量中有多少条目组成字符串,那么您必须解码输入格式并重新编码为输出格式。这可能需要某种新的分配,因此您很可能会得到一个 String,然后它可以在大多数可以使用 &str 的地方使用。

有一个内置方法可以将 UTF-16 数据转换为字符串:String::from_utf16 .请注意,它返回一个 Result 以允许这些错误情况。还有 String::from_utf16_lossy , 用 Unicode 替换字符替换无效的编码部分。

let name = [0x68, 0x65, 0x6c, 0x6c, 0x6f]; 

let a = String::from_utf16(&name);
let b = String::from_utf16_lossy(&name);

println!("{:?}", a);
println!("{:?}", b);

如果您从指向 u16WCHAR 的指针开始,您需要先使用 slice::from_raw_parts 转换为切片。 .如果您有一个以 null 结尾的字符串,您需要自己找到 NUL 并适本地分割输入。


1:这实际上是一种使用类型的好方法; &str 保证为 UTF-8 编码,因此无需进行进一步检查。同样,WideCString 可能会在构造时执行一次检查,然后可以跳过以后使用时的检查。

关于string - 将 Vec<u16> 或 Vec<WCHAR> 转换为 &str,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39068718/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com