ruby - 在 Ruby 中定义 String#prev 方法

标签 ruby string encoding

我已经看到 Ruby 的 String#next 可以处理非 ASCII 字符。 说我懂英语、孟加拉语和印地语:

> 'a'.next    # => "b"
> 'ক'.next    # => "খ"
> 'क'.next    # => "ख"

哪个是正确的。

现在我想为 String 类动态定义一个 prev 方法。 我可以这样做:

String.define_method(:prev) { slice(0..-2) + slice(-1).ord.-(1).chr }
> 'hit'.prev    # => "his"
> 'b'.prev      # => "a"

> 'ख'.prev
Traceback (most recent call last):
        4: from /home/sourav/.irb:351:in `<main>'
        3: from (irb):17
        2: from (irb):11:in `block in irb_binding'
        1: from (irb):11:in `chr'
RangeError (2325 out of char range)

但它应该返回以下内容:

> 'b'.prev     # => "a"
> 'ख'.prev    # => "क"
> 'খ'.prev    # => "ক"

有办法做到这一点吗?

最佳答案

您必须传递编码,因为默认外部编码是 US-ASCII

chr 更改为 chr('UTF-8') 将生成 "\u0915",这对于之前的符号是正确的'ख'

关于ruby - 在 Ruby 中定义 String#prev 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56940212/

相关文章:

ruby - 在 Windows 上安装 'rhc' Rubygems 时出错

ruby-on-rails - fields_for、formtastic、ActiveMerchant 和验证错误

c - 如何在c中一次从一串没有空格的字符中取出一个字符作为输入?

java - toString() 是否应该返回 null?

python - 正则表达式分割字符串而不考虑引号中的空格

php - 用 PHP 显示日文字符

ruby-on-rails - 在我的 Rails 应用程序中,负责执行 3rd 方 API 调用的类在哪里?

javascript - 使用 Ruby 的 arr.inject( :+) or JavaScript's arr. reduce((a,b) => { return a + b }) 对数字数组求和是不正确的吗?

python - 使 Emacs 在 Python 交互模式下使用 UTF-8

python - ascii 编解码器无法在 Ubuntu/Python 中解码位置错误中的字节 0xe3,但在 OS X/Python 上则不行