- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试定义一组 16 位切片(Rust:&[u16]
),它们是有效的 WTF-8(重新编码时),但不是有效的 UTF-8(重新编码时),所以我可以随机生成这样的切片。这是为了生成所有可能的 std::ffi::OsString
s 在不解析为 String
的 Windows 机器上.
转换&[u16] -> OsString
通过 std::os::windows::ffi::OsStringExt::from_wide
完成.这重定向到 libstd/sys_common/wtf8.rs
将操作定义为:
/// Creates a WTF-8 string from a potentially ill-formed UTF-16 slice of 16-bit code units.
///
/// This is lossless: calling `.encode_wide()` on the resulting string
/// will always return the original code units.
pub fn from_wide(v: &[u16]) -> Wtf8Buf {
let mut string = Wtf8Buf::with_capacity(v.len());
for item in char::decode_utf16(v.iter().cloned()) {
match item {
Ok(ch) => string.push_char(ch),
Err(surrogate) => {
let surrogate = surrogate.unpaired_surrogate();
// Surrogates are known to be in the code point range.
let code_point = unsafe {
CodePoint::from_u32_unchecked(surrogate as u32)
};
// Skip the WTF-8 concatenation check,
// surrogate pairs are already decoded by decode_utf16
string.push_code_point_unchecked(code_point)
}
}
}
string
}
转换OsString -> Result<String, Wtf8Buf>
通过 into_string
完成在同一个文件中:
/// Consumes the WTF-8 string and tries to convert it to UTF-8.
///
/// This does not copy the data.
///
/// If the contents are not well-formed UTF-8
/// (that is, if the string contains surrogates),
/// the original WTF-8 string is returned instead.
pub fn into_string(self) -> Result<String, Wtf8Buf> {
match self.next_surrogate(0) {
None => Ok(unsafe { String::from_utf8_unchecked(self.bytes) }),
Some(_) => Err(self),
}
}
与 next_surrogate
定义为:
#[inline]
fn next_surrogate(&self, mut pos: usize) -> Option<(usize, u16)> {
let mut iter = self.bytes[pos..].iter();
loop {
let b = *iter.next()?;
if b < 0x80 {
pos += 1;
} else if b < 0xE0 {
iter.next();
pos += 2;
} else if b == 0xED {
match (iter.next(), iter.next()) {
(Some(&b2), Some(&b3)) if b2 >= 0xA0 => {
return Some((pos, decode_surrogate(b2, b3)))
}
_ => pos += 3
}
} else if b < 0xF0 {
iter.next();
iter.next();
pos += 3;
} else {
iter.next();
iter.next();
iter.next();
pos += 4;
}
}
}
我想做的是设计一个生成 Vec<u16>
的算法这样 OsString::from_wide(vec.as_slice()).into_string().unwrap_err()
从不 panic 并返回一个OsString
. OsString
的一套s 当然应该是最大的,而不是使用平凡的常量。
为此,为了简化,我们可以定义两个操作:
encode_wide : &[u8] -> &[u16]
valid_wtf8_invalid_utf8 : () -> Gen<Vec<u8>>
其中 Gen
是某种用于生成类型化随机数据的 monad。通过映射 valid_wtf8_invalid_utf8()
给定的仿函数与 encode_wide
我们可以得到 Gen<Vec<u16>>
,反过来,我们可以得到 Gen<OsString>
.
但是 - 我不确定如何定义操作 encode_wide
和 valid_wtf8_invalid_utf8
.我可以采取一些更直接的方法而不是颠倒给定函数的逻辑吗?
自 Gen
是抽象的我不希望得到可执行代码——但伪代码或其他高级指令会很整洁。谢谢 =)
最佳答案
我不太清楚你是想生成 WTF-16\UTF-16
还是 WTF-8\UTF-8
的字符串。我认为生成一个 WTF-16 字符串而不是有效的 UTF-16 可能更容易,所以这里是:
您需要确保至少一个(16 位)“字符”是不属于代理对的代理。 (此示例还可能在字符串中生成 NUL
字符。)
extern crate rand;
use rand::Rng;
pub fn gen_wtf16_invalid_utf16<R>(r: &mut R, len: usize) -> Vec<u16>
where
R: Rng,
{
assert!(len > 0);
let mut buf = Vec::with_capacity(len);
for _ in 0..len {
buf.push(r.next_u32() as u16);
}
// make element at position `p` a surrogate that is not part
// of a surrogate pair
let p = r.gen_range(0, len-1);
// if first elem or previous entry is not a leading surrogate
let gen_trail = (0 == p) || (0xd800 != buf[p-1] & 0xfc00);
// if last element or succeeding entry is not a traililng surrogate
let gen_lead = (p == len-1) || (0xdc00 != buf[p+1] & 0xfc00);
let (force_bits_mask, force_bits_value) = if gen_trail {
if gen_lead {
// trailing or leading surrogate
(0xf800, 0xd800)
} else {
// trailing surrogate
(0xfc00, 0xdc00)
}
} else {
// leading surrogate
debug_assert!(gen_lead);
(0xfc00, 0xd800)
};
debug_assert_eq!(0, (force_bits_value & !force_bits_mask));
buf[p] = (buf[p] & !force_bits_mask) | force_bits_value;
buf
}
fn main() {
let s = gen_wtf16_invalid_utf16(&mut rand::thread_rng(), 10);
for c in &s {
println!("0x{:04x}", c);
}
}
关于utf-8 - 作为 16 位切片的格式错误的 UTF-8 的 WTF-8 字符串集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47749164/
我已经使用 vue-cli 两个星期了,直到今天一切正常。我在本地建立这个项目。 https://drive.google.com/open?id=0BwGw1zyyKjW7S3RYWXRaX24tQ
您好,我正在尝试使用 python 库 pytesseract 从图像中提取文本。请找到代码: from PIL import Image from pytesseract import image_
我的错误 /usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference
我已经训练了一个模型,我正在尝试使用 predict函数但它返回以下错误。 Error in contrasts<-(*tmp*, value = contr.funs[1 + isOF[nn]])
根据Microsoft DataConnectors的信息我想通过 this ODBC driver 创建一个从 PowerBi 到 PostgreSQL 的连接器使用直接查询。我重用了 Micros
我已经为 SoundManagement 创建了一个包,其中有一个扩展 MediaPlayer 的类。我希望全局控制这个变量。这是我的代码: package soundmanagement; impo
我在Heroku上部署了一个应用程序。我正在使用免费服务。 我经常收到以下错误消息。 PG::Error: ERROR: out of memory 如果刷新浏览器,就可以了。但是随后,它又随机发生
我正在运行 LAMP 服务器,这个 .htaccess 给我一个 500 错误。其作用是过滤关键字并重定向到相应的域名。 Options +FollowSymLinks RewriteEngine
我有两个驱动器 A 和 B。使用 python 脚本,我在“A”驱动器中创建一些文件,并运行 powerscript,该脚本以 1 秒的间隔将驱动器 A 中的所有文件复制到驱动器 B。 我在 powe
下面的函数一直返回这个错误信息。我认为可能是 double_precision 字段类型导致了这种情况,我尝试使用 CAST,但要么不是这样,要么我没有做对...帮助? 这是错误: ERROR: i
这个问题已经有答案了: Syntax error due to using a reserved word as a table or column name in MySQL (1 个回答) 已关闭
我的数据库有这个小问题。 我创建了一个表“articoli”,其中包含商品的品牌、型号和价格。 每篇文章都由一个 id (ID_ARTICOLO)` 定义,它是一个自动递增字段。 好吧,现在当我尝试插
我是新来的。我目前正在 DeVry 在线学习中级 C++ 编程。我们正在使用 C++ Primer Plus 这本书,到目前为止我一直做得很好。我的老师最近向我们扔了一个曲线球。我目前的任务是这样的:
这个问题在这里已经有了答案: What is an undefined reference/unresolved external symbol error and how do I fix it?
我的网站中有一段代码有问题;此错误仅发生在 Internet Explorer 7 中。 我没有在这里发布我所有的 HTML/CSS 标记,而是发布了网站的一个版本 here . 如您所见,我在列中有
如果尝试在 USB 设备上构建 node.js 应用程序时在我的树莓派上使用 npm 时遇到一些问题。 package.json 看起来像这样: { "name" : "node-todo",
在 Python 中,您有 None单例,在某些情况下表现得很奇怪: >>> a = None >>> type(a) >>> isinstance(a,None) Traceback (most
这是我的 build.gradle (Module:app) 文件: apply plugin: 'com.android.application' android { compileSdkV
我是 android 的新手,我的项目刚才编译和运行正常,但在我尝试实现抽屉导航后,它给了我这个错误 FAILURE: Build failed with an exception. What wen
谁能解释一下?我想我正在做一些非常愚蠢的事情,并且急切地等待着启蒙。 我得到这个输出: phpversion() == 7.2.25-1+0~20191128.32+debian8~1.gbp108
我是一名优秀的程序员,十分优秀!