读书人

娃子鸭学Ruby-12、文本二

发布时间: 2012-12-23 11:28:15 作者: rapoo

娃娃鸭学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

读书人网 >Ruby Rails

热点推荐