- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在从 Rust 从 Python 移植一个库,发现有一行我无法找到正确的“翻译”:
right = s.index(sep, left)
其中 right
是在 left
之后的字符串 s
中找到的第一个 sep
实例的索引>.
这里可以看到一个简单的例子:
Python 3
>>> s = "Hello, my name is erip and my favorite color is green."
>>> right = s.index("my", 10) # Find index of first instance of 'my' after index 10
>>> print right
27
>>> print s[27:]
my favorite color is green.
我在 Rust 中的尝试是:
// s: &str, sep: &str, left: usize
let right = s[left..].find(sep).unwrap() + left;
这将在 left
之后的字节中搜索 sep
。这seems to work使用 ASCII 字符时。不过,使用 Unicode 时似乎存在问题:
Python 3
>>> s = "Hello, mÿ name is erip and mÿ favorite color is green."
>>> right = s.index("mÿ", 10)
>>> print(right)
27
fn main() {
let sep: &str = "mÿ";
let left: usize = 10;
let s: &str = "Hello, mÿ name is erip and mÿ favorite color is green.";
let right = s[left..].find(sep).unwrap() + left;
println!("{}", right); //prints 28
}
我意识到 Python 2 也会给出 28,因为它本身不支持 Unicode,但我想模仿 Python 3 的结果。
问题是因为 Rust 中的 usize
指的是字符串中 bytes 的数量,因为“mÿ”实际上需要 3 个字节来编码。我怎样才能在 Rust 中获得这种期望的行为?
我正在使用 rustc 1.4.0
。
最佳答案
让我们稍微重述一下问题,因为不清楚 index
的单位应该是什么。人们相信弦很容易,因为我们一生中的大部分时间都在使用它们。然而,事情远没有我们想的那么简单。
Rust 认为字符串(&str
或 String
)是 UTF-8 编码的字节序列。使用字节偏移量跳转到字符串的复杂度为 O(1),您确实希望这种级别的性能保证能够在其上构建更复杂的东西。
我不知道 Python 认为该索引是什么。一旦您超越了像 ASCII 这样一个字符是一个字节的简单编码方案,它就会变得困难。根据您的需要,有多种方法可以对 Unicode 字符串进行分块。两个明显的是通过 Unicode 代码点和字素。
由于代码点可以在 Rust 中使用 char
表示,这就是我假设您想要的。但是,您是唯一能弄清楚这一点的人。
此外,由于您要求结果为 28
,因此它必须是字符串中的字节数。跳过 N 个代码点但返回字节有点奇怪,但事实就是如此。
现在我们知道我们在做什么...让我们尝试去做吧。 (请参阅下一个解决方案,我在其中更好地阅读了期望的结果)。
你需要使用的关键是char_indices
.这是一个复杂度为 O(n) 的操作,遍历字符串并为您提供每个代码点及其对应的字节偏移量。
然后,只需将它们放在一起并正确处理离开字符串末尾的情况即可。 Rust 的强类型使这一点变得显而易见,万岁!
// `index` is the number of Unicode codepoints to skip
// The result is the number of **bytes** inside the haystack
// that the needle can be found.
fn python_index(haystack: &str, needle: &str, index: usize) -> Option<usize> {
haystack.char_indices().nth(index).and_then(|(byte_idx, _)| {
let leftover = &haystack[byte_idx..];
leftover.find(needle).map(|inner_idx| inner_idx + byte_idx)
})
}
fn main() {
let right = python_index("Hello, mÿ name is erip and mÿ favorite color is green.", "mÿ", 10);
println!("{:?}", right); // prints Some(28)
}
我们采用与上面相同的高级概念,但是一旦找到针
,我们就会重新设置并再次遍历代码点。当我们找到子字符串的相同字节偏移量时,我们终止。
然后只需计算我们看到的字符数并添加我们已经跳过的数字即可。
// `index` is the number of Unicode codepoints to skip
// The result is the number of codepoints inside the haystack
// that the needle can be found.
fn python_index(haystack: &str, needle: &str, index: usize) -> Option<usize> {
haystack.char_indices().nth(index).and_then(|(byte_idx, _)| {
let leftover = &haystack[byte_idx..];
leftover.find(needle).map(|inner_offset| {
leftover.char_indices().take_while(|&(inner_inner_offset, _)| {
inner_inner_offset != inner_offset
}).count() + index
})
})
}
fn main() {
let right = python_index("Hello, mÿ name is erip and mÿ favorite color is green.", "mÿ", 10);
println!("{:?}", right); // prints Some(27)
}
这当然感觉效率不高;您想要进行基准测试以了解其表现如何。但是,find
实现非常优化,所以我宁愿使用它,然后直接通过字符并相信缓存和预取会帮助我解决问题 ^_^。
关于unicode - 在 Rust 中模拟 Python 的 `index(separator, start_index)`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33766228/
我还没有找到太多关于何时使用 Unicode 的(简明)信息。我知道很多人说最佳实践是始终使用 Unicode。但 Unicode 字符串确实有更多的内存占用。我是否正确地说,必须仅在以下情况下使用
我正在构建一个需要使用表情符号的应用程序,特别是生成大量随机表情符号序列。这需要有一个大列表可供选择。而不是采取方法 detailed here通过循环硬编码十六进制范围,我决定采用不同的方法并从 t
早在 ZX Spectrum 的早期,就有一种方法可以将一个字形打印在另一个字形之上,从而在 OVER 1 指令的帮助下创建复合字形。 我想知道是否有 Unicode 方法可以在现代计算机上执行相同的
我有一个表示 Unicode 代码点的字符串,例如 "272d"。如何将其转换为 "✭"? Elixir 当然理解 Unicode: iex> > "✭" iex> "x{272d}" "✭" 但我需
自从我了解到 clang 能够编译用 Unicode 编写的 c++ 源文件后,我在编写与数学相关的代码时就开始大量使用它。比较 uₙ₊₁ᵖ = A*uₙ + B*uₙ₋₁; uₙ₊₁ᶜ = π *
感谢jmcnamara我发现了一种在 xlsxwriter 图表中使用 Unicode 字符的好方法:xlsxwrter: rich text format in chart title 我需要一个所
有些字符不包含在 Unicode 中(即带重音的西里尔字母),但可以使用组合序列创建。据我了解,可能的组合字符序列是在布局引擎和/或使用的字体中定义的。我对吗?那么,如何得到所有可能的组合序列呢? 最
我正在尝试使用 libunibreak ( https://github.com/adah1972/libunibreak ) 来标记某些给定 unicode 文本中可能的换行符。 Libunibre
我需要具有属性 Alphabetic 的 Unicode 字符范围列表如 http://www.unicode.org/Public/5.1.0/ucd/UCD.html#Alphabetic 中所定
我想为 Unicode 中的特定字符找到视觉上相同的字符。 我知道如何找到一个字符的规范或兼容性分解;但他们没有给我我想要的。 我想找到视觉上相同(不相似)的字符,它们唯一的区别可能是它们的大小。 例
假设我有包含此字符串的 Apache Solr 索引文档: Klüft skräms inför 我希望能够使用此关键字通过搜索找到它(注意“u”-“ü”): kluft 有没有办法做到这一点 ? 最
我已经阅读了很多文章以了解 Unicode 代码点的最大数量,但我没有找到最终答案。 我知道 Unicode 代码点已最小化,以使所有 UTF-8 UTF-16 和 UTF-32 编码都能够处理相同数
我正在使用 CSS Buttons With Icons But No Images . 图标是使用 unicode 值生成的。在这方面,我遇到了一些浏览器不支持某些 unicode 值的问题。因此,
我正在寻找一种方法将 Unicode 字母字符从任何语言音译为带重音的拉丁字母。目的是让外国人深入了解以任何非拉丁文字书写的姓名和单词的发音。 例子: 希腊语:Romanize("Αλφαβητικό
Unicode 6.0 添加了几个带有描述的字符,表明这些字符应该以特定颜色呈现: 红苹果 U+1F34E 青苹果 U+1F34F 蓝心U+1F499 绿心U+1F49A 黄心U+1F49B 紫心U+
我想知道,Unicode 中的每个字符都有一个代码点;字体中字符的类似术语是什么? 当解码文件需要映射到字体(或字体,通过一些现代字体替换技术)时,我从来没有理解过程的一部分。 例如,当文本编辑器从其
谁能告诉我 Unicode 可打印字符的范围是多少? [例如。 Ascii 可打印字符范围为\u0020 -\u007f] 最佳答案 参见,http://en.wikipedia.org/wiki/U
鉴于Unicode有been around for 18 years ,为什么还有不支持 Unicode 的应用程序?甚至我对某些操作系统和 Unicode 的体验至少可以说是痛苦的。正如乔尔·斯波尔
我要求计算 Unicode 中所有可能的有效组合的数量并附上解释。我知道一个 char 可以编码为 1、2、3 或 4 个字节。我也不明白为什么连续字节有限制,即使该字符的起始字节清除了它应该有多长。
Unicode 为中文字符分配了 U+4E00..U+9FFF。这是全套的一部分,但不是全部。 最佳答案 最终列表可以在 Unicode Character Code Charts 找到;在页面中搜索
我是一名优秀的程序员,十分优秀!