2

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

我在网上找到了对 的引用String#subseq,它应该类似于String#[],但用于字节。唉,它似乎没有达到 1.9.1。

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

好吧,我正在使用StringScanner,事实证明它的内部指针是基于字节的。我在这里接受其他选择。

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

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

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

4

3 回答 3

2

你也可以这样做: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)
于 2009-12-14T14:30:49.080 回答
1

String#bytes 不做你想做的事吗?它返回一个枚举器到字符串中的字节(作为数字,因为它们可能不是有效的字符,正如你所指出的)

str.bytes.to_a.slice(...)
于 2009-12-14T15:05:27.340 回答
1

使用这个 monkeypatch 直到String#byteslice()添加到 Ruby 1.9

class String
  unless method_defined? :byteslice
    ##
    # Does the same thing as String#slice but
    # operates on bytes instead of characters.
    #
    def byteslice(*args)
      unpack('C*').slice(*args).pack('C*')
    end
  end
end
于 2011-02-25T08:51:57.080 回答