我正在使用 UTF-8 字符串。我需要使用基于字节的索引而不是基于字符的索引来获取切片。
我在网上找到了对 String#subseq
的引用,它应该类似于 String#[]
,但针对的是字节。唉,好像还没到1.9.1。
现在,我为什么要这么做?如果我在多字节字符的中间进行切片,那么我最终可能会得到一个无效的字符串。这听起来是一个糟糕的主意。
嗯,我正在使用StringScanner
,结果发现它的内部指针是基于字节的。我在这里接受其他选项。
这是我现在正在处理的内容,但它相当冗长:
s.dup.force_encoding("ASCII-8BIT")[ix...pos].force_encoding("UTF-8")
ix
和 pos
都来自 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/