ruby 1.9 : how do I get a byte-index-based slice of a String?

标签 ruby string unicode ruby-1.9 multibyte

我正在使用 UTF-8 字符串。我需要使用基于字节的索引而不是基于字符的索引来获取切片。

我在网上找到了对 String#subseq 的引用,它应该类似于 String#[],但针对的是字节。唉,好像还没到1.9.1。

现在,我为什么要这么做?如果我在多字节字符的中间进行切片,那么我最终可能会得到一个无效的字符串。这听起来是一个糟糕的主意。

嗯,我正在使用StringScanner,结果发现它的内部指针是基于字节的。我在这里接受其他选项。

这是我现在正在处理的内容,但它相当冗长:

s.dup.force_encoding("ASCII-8BIT")[ix...pos].force_encoding("UTF-8")

ixpos 都来自 StringScanner,因此都是基于字节的。

最佳答案

你也可以这样做:s.bytes.to_a[ix...pos].join(""),但这对我来说看起来更深奥。

如果您多次调用该热线,更好的方法可能是这样:

class String
  def byteslice(*args)
    self.dup.force_encoding("ASCII-8BIT").slice(*args).force_encoding("UTF-8")
  end
end

s.byteslice(ix...pos)

关于 ruby 1.9 : how do I get a byte-index-based slice of a String?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1899999/

相关文章:

Java 显示 unicode 代码点而不是字符串文字

MySQL UTF 文本容量

javascript charCodeAt - JsFiddle 和本地文件中的不同值

ruby - 单个 Jekyll 网站中的多个博客

ruby - 文件系统爬虫 - 迭代错误

java - 从 C++ 到 Java 行的命名管道连接,每个字符之间有空格

java - 为什么 char[] 优于 String 作为密码?

ruby - 从 ruby​​ 运行 `git add -p`

Ruby:带有静态方法符号的 Object#send 的用例是什么?

python - 如何检查字符串是否是 pangram?