将 Vec 或 Vec 转换为 &str

2023-11-22

我正在进入 Rust 编程来实现一个小程序,但我在字符串转换方面有点迷失。

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

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

WCHAR与 a 相同u16在我的 Windows 机器上。

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

我唯一能做的就是将其转换为WideString:

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

但这似乎是迈向错误方向的一步。

转换的最佳方法是什么Vec<u16> to an &str假设向量保存有效且以空字符结尾的字符串。


然后我需要将向量中包含的字符串转换为&str。但是,无论我尝试什么,我都无法使此转换正常工作。

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

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

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

If you do需要对其进行转换,那么您必须处理可能发生的错误。任意 16 位整数数组may not是有效的 UTF-16 或 UCS-2。这些编码具有很容易产生无效字符串的边缘情况。空终止是另一个方面 - Unicode 实际上允许嵌入 NUL 字符,因此空终止字符串无法容纳所有可能的 Unicode 字符!

Once you've ensured that the encoding is valid 1 and figured out how many entries in the input vector comprise the string, then you have to decode the input format and re-encode to the output format. This is likely to require some kind of new allocation, so you are most likely to end up with a String, which can then be used most anywhere a &str can be used.

有一个内置方法可以将 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);

如果您从指向 a 的指针开始u16 or WCHAR,您需要首先使用转换为切片slice::from_raw_parts。如果你有一个以空结尾的字符串,你需要找到NUL自己对输入进行适当的切片。


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Vec 或 Vec 转换为 &str 的相关文章

  • 在 Java 中比较字符串的最快方法是什么?

    在Java中比较两个字符串最快的是什么 有比等于更快的东西吗 编辑 我无能为力澄清这个问题 我有两个字符串 它们按字母顺序排序并且大小完全相同 示例 abbcee 和 abcdee 字符串最长可达 30 个字符 我不认为Sun Oracle
  • 异步任务中止时会发生什么?

    锈有async可以绑定到的方法Abortable https docs rs futures preview 0 3 0 alpha 19 futures future struct Abortable html期货 文档说 当中止时 未来
  • Python 将字符串组合成尽可能短的字符串?

    如果我有一个字符串列表 我想将它们组合成一个具有重叠字符的字符串 如果没有剩余的重叠字符串 请将其添加到末尾 这是一个过于简化的版本 input one two output twone 我正在寻找一种方法来对输入列表中的任意数量的字符串执
  • 在 String 值之后打印 int 值

    我有以下示例代码 int pay 80 int bonus 65 System out println pay bonus bonus pay 有人可以向我解释一下为什么我得到以下输出 145 6580 您的代码正在从左到右解释表达式 pa
  • 字符串文字会被编译器优化吗?

    C 编译器或 NET CLR 是否对字符串文字 常量进行了任何巧妙的内存优化 我可以发誓我听说过 字符串内化 的概念 因此在程序中的任何两位代码中 文字 这是一个字符串 实际上会指代同一个对象 大概是安全的 对于字符串来说是这样的 不可变
  • 如何按元素添加两个 Rust 数组?

    这绝对是一个初学者问题 但我搜索了半个小时后找不到任何有用的东西 我有 Rust 1 7 0 和这段代码 type coord i64 3 add two coordinates vectors pointwise that is if z
  • 为什么 JavaScript 中是 [1,2] + [3,4] = "1,23,4" ?

    我想将一个数组的元素添加到另一个数组中 所以我尝试了以下方法 1 2 3 4 它的回应是 1 23 4 到底是怎么回事 The 操作员没有为数组定义 发生的事情是 JavaScript将数组转换为字符串并将它们连接起来 Update 由于这
  • 正则表达式:如何从字符串中获取单词(C#)

    我的输入由用户发布的字符串组成 我想做的是创建一本包含单词以及它们的使用频率的字典 这意味着我想解析一个字符串 删除所有垃圾 并获取单词列表作为输出 例如 假设输入是 LOLOLOL YOU VE BEEN PWN3D 1einszwei
  • Java在字符串中看不到空格[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 因此 我正在尝试解析一些具有多行文本的文本文件 我的工作是检查所有单词并将其打印在文件中 因此 我读取了所有行 循环遍历它们并用空格分隔每
  • 为什么byteArray的长度是22而不是20?

    我们尝试从字符串转换为Byte 使用以下 Java 代码 String source 0123456789 byte byteArray source getBytes UTF 16 我们得到一个长度为 22 字节的字节数组 我们不确定这个
  • 无法移出借用内容/无法移出共享引用后面

    我不明白这个错误cannot move out of borrowed content 我收到过很多次了 每次都解决了 但一直不明白为什么 例如 for line in self xslg file iter self buffer cle
  • Python3,当 UserString 不表现为字符串时?

    在Python3中我使用UserString扩展内置字符串的功能 通常UserStrings 的行为就像strs 但与re我遇到了意想不到的情况TypeError bpython version 0 17 1 on top of Pytho
  • PHP中特殊字符的转换

    我已经尝试了很多功能 但我根本无法弄清楚这一点 无论如何 正确的方法 在称为描述的表单字段中 我可以期待各种字符 在将它们提交到数据库之前 需要将它们格式化为 HTML 实体 现在 我的代码 formdesc htmlentities PO
  • C++:字符串流有什么好处?

    谁能告诉我一些在 C 中使用字符串流的实际例子 即使用流插入和流提取运算符输入和输出到字符串流 您可以使用字符串流来转换任何实现operator lt lt 到一个字符串 include
  • Powershell 数组到带引号的逗号分隔字符串

    我有一个数组 需要输出到逗号分隔的字符串 但我还需要引号 这是我所拥有的 myArray file1 csv file2 csv a myArray join a 输出为 a最终 file1 csv file2 csv 我想要的输出是 fi
  • 在python中将文本文件解析为列表

    我对 Python 完全陌生 我正在尝试读取包含单词和数字组合的 txt 文件 我可以很好地读取 txt 文件 但我正在努力将字符串转换为我可以使用的格式 import matplotlib pyplot as plt import num
  • C++11 内部 std::string 表示形式 (libstdc++)

    std string 在 c 11 libstdc 中如何内部表示 在深入研究实现时 我发现 A string looks like this Rep M length basic string
  • python 中分割字符串以获得一个值?

    需要帮助 假设我在名为 input 的变量中有一个字符串 Sam Person name kind input split 通过执行上述操作 我得到两个具有不同字符串 Sam 和 Person 的变量 有没有办法只获取第一个值 name S
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co

随机推荐

  • 如何安全关闭游标和数据库?

    我已使用游标从数据库中获取记录 它工作得很好 但是 当我使用这段代码时 我在 Logcat 中遇到错误 public Cursor fetchAll SQLiteDatabase db this getReadableDatabase Cu
  • 找不到类型或命名空间“TextFieldParser”

    我正在尝试使用在其中找到的 TextfieldParser使用 C 读取 CSV 文件 我正在使用 VS 2010 并在 C 中执行此操作 我不断收到 找不到类型或命名空间 TextFieldParser 当我尝试添加 using 行时 它
  • PostgreSQL - 安装 JDBC 驱动程序

    我很难弄清楚应该如何在我的 debian 6 0 服务器上安装 PostgreSQL 的 JDBC 驱动程序 我已将驱动程序 jar 移至以下目录 usr local pgsql share java postgresql jar 然后教程
  • 在正则表达式中,“懒惰”和“贪婪”是什么意思?

    这两个术语是什么 贪婪的人会尽可能地消耗 从http www regular expressions info repeat html我们看到尝试将 HTML 标签与 lt gt 假设您有以下内容 em Hello World em 你可能
  • 如何让我的 Flash 对象聚焦于加载?

    我一直在尝试为我的 Flash 游戏设置此测试页面 但它拒绝关注负载 我读了一堆论坛条目 但没有让它做任何事情 我真的不敢相信这会这么难 这是我所拥有的
  • 在单个查询中使用不同值更新多行 - MySQL

    我是 MySQL 新手 我使用它在单个查询中更新具有不同值的多行 UPDATE categories SET order CASE id WHEN 1 THEN 3 WHEN 2 THEN 4 WHEN 3 THEN 5 END title
  • 如何获取进程使用的所有内存地址空间?

    我需要知道进程使用的所有内存地址空间 稍后将扫描内存空间以定位进程内的值并识别它们的位置 地址 我当前的处理过程是通过其 基地址 内存大小 获取每个模块的基地址 我正在一个已知地址处具有已知值的进程上对此进行测试 当我查找该特定地址时 我得
  • 为 RecyclerView 项目添加波纹效果

    我正在尝试将波纹效果添加到 RecyclerView 的项目中 我在网上查了一下 但找不到我需要的东西 我认为它必须是自定义效果 我已经尝试了 RecyclerView 本身的 android background 属性并将其设置为 and
  • C中的双精度等于0问题

    我正在用 C 实现一种计算自然对数的算法 double taylor ln int z double sum 0 0 double tmp 1 0 int i 1 while tmp 0 0 tmp 1 0 i pow z 1 0 z 1
  • Cobol 的优点是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我喜欢花时间研究语言的酷功
  • 如何使用 pdfbox 将 PDPage 插入另一个 PDPage

    我使用不同的工具 例如处理 来创建矢量图 这些图被写成单页或多页 pdf 我想使用 pdfbox 将这些图包含在一个类似报告的 pdf 中 我当前的工作流程包括这些 pdf 作为图像 并具有以下伪代码 PDDocument inFile P
  • 带有张量流的鼻子测试:大量调试输出,如何禁用

    当我使用nosetests通过 TensorFlow 的一些测试脚本 我从 TensorFlow 获得了大量调试输出 az azmacbookpro P crnn gt nosetests tests test TFUtil py Leve
  • d3 Sankey - 突出显示从开始到结束的所有连接路径

    我试图突出显示所有连接的链接及其目标节点的链接 直到布局结束 第一级突出显示可以轻松实现 如下所示 单击节点时 调用highlight paths 1 function highlight paths stroke opacity retu
  • R - Excel VLOOKUP 等效项 - 查找、替换 [重复]

    这个问题在这里已经有答案了 我几乎到处都找遍了 但找不到答案 R 相当于 Excel 上的 VLOOKUP VLOOKUP 允许我在整个列中查找特定值并将其应用到数据框的每一行 在本例中 我想找到特定城市所在的国家 地区 从数据库中 并在新
  • Rails 使用 select2 (和 simple_form)充当可标记的角色

    我想要一个 select2 标签下拉菜单 我可以在其中选择多个现有标签并添加新标签 我尝试了很多不同的方法 但要么 select2 框不起作用 要么只传递一个值 最后一个 这是我得到的最接近的 通过最后一个值 正如我之前提到的 普通的 se
  • 呈现具有透明度和动画的视图控制器

    我正在设置self window rootViewController modalPresentationStyle UIModalPresentationCurrentContext 在我的应用程序委托中 以便我可以呈现视图控制器并使视图
  • 使用 selenium 时如何禁用 Firefox 中的附加组件

    我在我的 Rails 项目 在 Ubuntu 10 04 系统上 中使用 Capybara selenium 现在我刚刚升级了 Firefox 当我运行我的测试时 Firefox 会加载 但它现在已经安装了所有附加组件 并且会等待我设置每个
  • 如何使用 sass 在 Bootstrap 4 中创建一组新的颜色样式

    我开始浏览精彩的 Bootstrap 4 我想知道如何向 custom scss 添加一组全新的元素颜色 示例 现在您有 btn danger text danger 等 如何创建 例如 使用随机名称 crisp 集 这样您将拥有 btn
  • ASP.Net MVC 将多个参数传递给视图

    在 ASP Net MVC 中 我想根据 renderview 查询字符串参数呈现不同的部分视图 因此 为用户提供了选择通过缩略图或详细信息查看产品的便利 我可以访问控制器中选定的参数 但我不知道如何操作 或者是否应该将其与产品列表一起传递
  • 将 Vec 或 Vec 转换为 &str

    我正在进入 Rust 编程来实现一个小程序 但我在字符串转换方面有点迷失 在我的程序中 我有一个向量如下 let mut name Vec