娃娃鸭学Ruby-12、文本二
5、对字符串进行迭代
Ruby1.8
String 类 each方法,Enumerable模块
[]
Ruby1.9
取消了each方法,不再包含Eumerable模块。
取代的:
each_byte
each_char
each_line
s="¥1000"
s.each_char{|x| print "#{x} "} # "¥ 1 0 0 0 "
0.upto(s.size-1){|i| print "#{s[i]} "} # "¥ 1 0 0 0 "
6、字符串编码玫多字节字符
Ruby 1.8
字符串是一个字节序列。字符串的每个字节都假定为一个ASCII字符。 字符串里的单个元素不是字符,而是数字。ASCII码
Ruby1.9
字符串是实实在在的字符序列,字符不必局限于ASCII码。
1)Ruby1.9里的多字节字符
Ruby1.9重写了String类
# -*- coding:utf-8 -*-
s="2×2=4"
s.length # 5 '2' '×' '2' '=' '4'
s.bytesize #6:bytes(hex):32 c3 97 32 3d 34
ASCII-8BIT 8位ASCII
BINARY
Ruby 1.9
US-ASCII 7位ASCII
连接和模式匹配
要求:两个字符串(或一个字符串和一个正则表达式)具有相互兼容的编码。
例如:一个Ascii字符串与UTF-8 连接 得到UTF-8字符串
UTF-8和SJIS不能连接 编码方式不兼容,抛出异常
咋办?
使用类方法: Encoding.compatible?来测试两个字符串的编码是否兼容,返回 兼容的超集否则返回nil
force_encoding 方法显式地设置一个字符串的编码方式
text=stream.readline.force_encoding("utf-8")
bytes=text.dup.force_encoding(nil) #nil binary
注意
1、force_encoding不生成拷贝,直接修改编码后返回
2、不做验证
s="\xa4".force_encoding("utf-8") #无效
s.valid_encoding? # false
byte="\xA4"
char=byte.encode("utf-8","iso-8859-15")
2)Encoding类
Ruby1.9中的Encoding类代表了一种字符编码。
Encoding类
方法 返回
name 一个编码方式的名字
to_s name 方法的同义词
inspect 比Name方法更详尽的方式将一个Encoding对象转换成一个字符串
常量 说明
Encoding::ASCII_8BIT ::BINARY
Encoding::UTF-8
Encoding::EUC_JP
Encoding::SHIFT_JIS
Ruby1.9
Encoding::US_ASCII
Encoding::ISO-8859-1
3)Ruby1.8里的多字节字符
Ruby1.8
所有的字符串解释成由8位字节构成的序列
jcode 包含对多字节字符的初步支持
2011-4-6 19:54 danny