- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习 Rust 编程来实现一个小程序,但我对字符串转换有点迷茫。
在我的程序中,我有一个向量如下:
let mut name: Vec<winnt::WCHAR> = Vec::new();
WCHAR
与 u16
相同在我的 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);
如果您从指向 u16
或 WCHAR
的指针开始,您需要先使用 slice::from_raw_parts
转换为切片。 .如果您有一个以 null 结尾的字符串,您需要自己找到 NUL
并适本地分割输入。
1:这实际上是一种使用类型的好方法; &str
保证为 UTF-8 编码,因此无需进行进一步检查。同样,WideCString
可能会在构造时执行一次检查,然后可以跳过以后使用时的检查。
关于string - 将 Vec<u16> 或 Vec<WCHAR> 转换为 &str,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39068718/
你信吗?我有一个这样的循环(请原谅任何错误,我不得不大量编辑大量信息和变量名称,相信我它有效)。 ...旧示例已删除,请参见下面的代码... 如果我将那些中间的 str = "Blah\(odat.c
我正在做一个本地测试来比较 C# 中 String 和 StringBuilder 的 Replace 操作性能,但是对于 String 我使用了以下代码: String str = "String
我想知道为什么str += "A"和 str = str + "A"有不同的表现。 在实践中, string str = "cool" for(int i = 0; i approximately
我有一个类型列表 [("['106.52.116.101']", 1), ("['45.136.108.85']", 1)] 并想将其转换为 [('106.52.116.101', 1), ('45.
我有一个类型列表 [("['106.52.116.101']", 1), ("['45.136.108.85']", 1)] 并想将其转换为 [('106.52.116.101', 1), ('45.
我正在遍历 HashMap并通过一些本地变量中的模式匹配将值放入其中。 委托(delegate)者 fn lyrics_no_bottles(song_template:&mut String){
如果字符串(短语)中只有元音,它(对我而言)说True;否则说 False。我不明白为什么它总是返回 False,因为 (x >= x) 总是返回 True。我感谢任何人检查此查询的解决方案。 (st
我有代码以某种方式转换字符串引用,例如取第一个字母 trait Tr { fn trim_indent(self) -> Self; } impl Tr for &'a str { f
我正在学习指针,这是我的代码。我定义了一个指向 char(实际上是字符串)的指针 *str 和一个指向 int *a 的指针,它们的定义方式相同。我认为 str 和 a 都应该是一个地址,但是当我试图
为什么我会收到错误消息?我已经正确添加了类型,对吗? Invalid index type "str" for "Union[str, Dict[str, str]]"; expected type
你知道下面两个函数是否等价吗? function validate(str) { return ( ['null','','undefined'].indexOf(str) [v, valida
我正在解决这里的 Dataquest 问题:https://app.dataquest.io/m/293/data-cleaning-basics/5/removing-non-digit-chara
我有一个字符串列表,如下所示: ["A TB", "A-R TB", "B TB", "B-R TB", "C TB", "C-R TB"...] 但字符串的顺序是随机的。我如何编写一个将元素配对的函
我正在尝试将此函数从使用 split 改为使用 str.extract (正则表达式)。 def bull_lev(x): spl = x.rsplit(None, 2)[-2].strip(
给定这样的数据结构: [{'a':1, 'b': 2}, {'c':3 }, {'a':4, 'c':9}, {'d':0}, {'d': 0, 'b':6}] 目标是解析数据以产生: {'a': 2
给定这样的数据结构: [{'a':1, 'b': 2}, {'c':3 }, {'a':4, 'c':9}, {'d':0}, {'d': 0, 'b':6}] 目标是解析数据以产生: {'a': 2
s = 'someString' s = QTreeWidgetItem(s) print(s.text(0)) # 0 being 'column' 输出: 's' 如果我对另一
黑白有什么区别: function(char* str ) function(char* str[] ) function(char str[] ) 它们是如何被调用的(通过什么类型的string/c
我试过谷歌搜索但找不到准确的答案,所以请允许我尝试在这里提问。如果问题看起来不合适,请告诉我,我会删除它。 在 JS 中,您可以通过三种不同的方式编写特定的内置功能: 字符串长度 str.toStri
我有这段代码(我的 strlen 函数) size_t slen(const char *str) { size_t len = 0; while (*str) {
我是一名优秀的程序员,十分优秀!