Gig*_*him 7 string utf-16 rust
编者注:此代码示例来自1.0之前的Rust版本,并且不是有效的Rust 1.0代码,但是答案仍然包含有价值的信息。
我想将字符串文字传递给Windows API。许多Windows函数使用UTF-16作为字符串编码,而Rust的本机字符串是UTF-8。
我知道Rust有utf16_units()来生成UTF-16字符迭代器,但是我不知道如何使用该函数来生成UTF-16字符串(最后一个字符为零)。
我正在生成这样的UTF-16字符串,但我确信有更好的方法来生成它:
extern "system" {
pub fn MessageBoxW(hWnd: int, lpText: *const u16, lpCaption: *const u16, uType: uint) -> int;
}
pub fn main() {
let s1 = [
'H' as u16, 'e' as u16, 'l' as u16, 'l' as u16, 'o' as u16, 0 as u16,
];
unsafe {
MessageBoxW(0, s1.as_ptr(), 0 as *const u16, 0);
}
}
Run Code Online (Sandbox Code Playgroud)
str::encode_utf16
是UTF-16值的稳定迭代器。
您只需要collect()
在该迭代器上使用即可构建Vec<u16>
,然后push(0)
在该vector上使用:
pub fn main() {
let s = "Hello";
let mut v: Vec<u16> = s.encode_utf16().collect();
v.push(0);
}
Run Code Online (Sandbox Code Playgroud)
str::utf16_units()
/ str::encode_utf16
不稳定。另一种选择是要么改为每晚(如果您正在编写程序,而不是库)是一个可行的选择),或者使用类似编码的外部包装箱:
extern crate encoding;
use std::slice;
use encoding::all::UTF_16LE;
use encoding::{Encoding, EncoderTrap};
fn main() {
let s = "Hello";
let mut v: Vec<u8> = UTF_16LE.encode(s, EncoderTrap::Strict).unwrap();
v.push(0); v.push(0);
let s: &[u16] = unsafe { slice::from_raw_parts(v.as_ptr() as *const _, v.len()/2) };
println!("{:?}", s);
}
Run Code Online (Sandbox Code Playgroud)
(或者您可以使用,from_raw_parts_mut
如果需要&mut [u16]
)。
但是,在此特定示例中,您必须注意字节序,因为UTF_16LE
编码为您提供了u16
以小字节序字节顺序表示的字节向量,而该from_raw_parts
技巧使您可以将“字节向量”视为u16
“ in”的切片您平台的字节顺序,也可能是大字节序。byteorder
如果您想要完全的可移植性,在此处使用类似crate的箱子可能会有所帮助。
这在Reddit上的讨论也可能会有所帮助。
对于静态 UTF-16 字符串,utf16_lit
crate 提供了一个易于使用的宏来在编译时执行此操作:
use utf16_lit::utf16_null;
fn main() {
let s = &utf16_null!("Hello");
println!("{:?}", s);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4218 次 |
最近记录: |