1. 什么是字符串?

字符串是一系列字符的集合,用单引号 ' 或双引号 " 包裹。Ruby 的字符串默认编码是 UTF-8,支持中文、日文等语言。

基本定义

1
2
3
4
str1 = "你好,世界!"
str2 = 'Ruby'
puts str1  # 你好,世界!
puts str2  # Ruby

单引号 vs 双引号

  • 双引号:支持插值(#{})和转义(如 \n)。
  • 单引号:更严格,插值和转义无效。
1
2
3
4
5
6
name = "张三"
puts "你好,#{name}!"  # 你好,张三!
puts '你好,#{name}!'  # 你好,#{name}!
puts "换行\n测试"       # 换行
                        # 测试
puts '换行\n测试'       # 换行\n测试

2. 创建字符串的其他方式

多行字符串

<<-END%Q

1
2
3
4
5
6
7
8
9
10
# heredoc 方式
text = <<-END
这是一个多行字符串。
支持中文和换行。
END
puts text
 
# %Q 方式
text2 = %Q(你好\n这是一个测试)
puts text2

输出:

1
2
3
4
这是一个多行字符串。
支持中文和换行。
你好
这是一个测试

符号转字符串

1
2
sym = :hello
puts sym.to_s  # "hello"

3. 字符串操作

连接

1
2
3
4
5
6
str = "你" + "好"
puts str       # 你好
 
greeting = "你好,"
greeting << "世界"  # 修改原字符串
puts greeting      # 你好,世界

插值

1
2
3
age = 25
puts "我今年 #{age} 岁"  # 我今年 25 岁
puts "2 + 3 = #{2 + 3}"  # 2 + 3 = 5

长度

1
2
3
4
text = "你好,Ruby"
puts text.length     # 7(字符数)
puts text.bytesize   # 13(字节数,中文占 3 字节)
puts text.empty?     # false

4. 常用方法

大小写转换

1
2
3
4
str = "Hello, 你好"
puts str.upcase    # HELLO, 你好(中文不变)
puts str.downcase  # hello, 你好
puts str.capitalize  # Hello, 你好

切片

1
2
3
4
5
text = "你好,世界"
puts text[0]       # 你
puts text[0..1]    # 你好
puts text[-1]      # 界
puts text.slice(2, 3)  # ,世

分割与合并

1
2
3
4
str = "苹果,香蕉,橙子"
fruits = str.split(",")
puts fruits        # ["苹果", "香蕉", "橙子"]
puts fruits.join(" 和 ")  # 苹果 和 香蕉 和 橙子

替换

1
2
3
text = "你好,世界"
puts text.gsub("世界", "Ruby")  # 你好,Ruby
puts text.sub("好", "好吗")     # 你好吗,世界(只替换第一个)

修剪

1
2
3
4
str = "  你好  "
puts str.strip    # 你好
puts str.lstrip   # 你好 
puts str.rstrip   #   你好

检查

1
2
3
4
text = "你好,世界"
puts text.include?("世界")  # true
puts text.start_with?("你")  # true
puts text.end_with?("界")    # true

5. 字符串的编码

默认编码

1
2
str = "你好"
puts str.encoding  # UTF-8

转换编码

1
2
3
str = "你好".encode("GBK")
puts str.encoding  # GBK
puts str.encode("UTF-8")  # 你好(转回 UTF-8)

处理乱码

1
2
3
4
# 假设从 GBK 文件读取
text = "你好".encode("GBK")
fixed = text.force_encoding("GBK").encode("UTF-8")
puts fixed  # 你好

6. 中文支持示例

处理中文字符串

1
2
3
4
5
text = "你好,世界!"
puts text[0..1]      # 你好
puts text.length     # 6
puts text.reverse    # !界世,好你
puts text.split(",")  # ["你好", "世界!"]

实践案例

1
2
3
4
5
6
7
8
9
10
11
12
class Greeting
  def initialize(name)
    @name = name
  end
 
  def say
    "你好,#{@name}!今天是 #{Time.now.strftime("%Y年%m月%d日")}"
  end
end
 
g = Greeting.new("张三")
puts g.say  # 你好,张三!今天是 2025年03月22日

7. 字符串的不可变性与修改

普通方法

大多数方法返回新字符串,不修改原字符串:

1
2
3
4
text = "你好"
new_text = text.upcase
puts text     # 你好
puts new_text # 你好

破坏性方法(带 !

修改原字符串:

1
2
3
4
5
6
7
text = "你好"
text.upcase!
puts text  # 你好(中文不变)
 
str = "hello"
str.upcase!
puts str   # HELLO

8. 实践案例

案例 1:姓名解析

1
2
3
4
5
6
def parse_name(full_name)
  parts = full_name.split
  "姓:#{parts[0]},名:#{parts[1]}"
end
 
puts parse_name("张 三")  # 姓:张,名:三

案例 2:文本清理

1
2
3
4
5
6
def clean_text(text)
  text.strip.gsub(/\s+/, " ")
end
 
dirty = "  你好   世界  "
puts clean_text(dirty)  # 你好 世界

案例 3:简单加密

1
2
3
4
5
def simple_encrypt(text)
  text.chars.map { |c| (c.ord + 1).chr }.join
end
 
puts simple_encrypt("你好")  # 伱倝

9. 注意事项

  • 编码:处理中文时确保文件和终端使用 UTF-8。
  • 性能:频繁拼接字符串时,<<+ 更高效(+ 创建新对象)。
  • 不可变性:注意区分普通方法和 ! 方法的效果。

下一步

  • 练习:告诉我你想用字符串做什么(分割、替换等),我可以设计一个例子。
  • 问题解答:对字符串用法有疑问吗?直接问我!
  • 深入学习:想了解正则表达式与字符串的结合或性能优化吗?我可以继续讲解。

你现在想做什么?写代码、问问题,还是其他?