- 浏览: 1400464 次
- 性别:
- 来自: 火星
文章分类
最新评论
-
aidd:
内核处理time_wait状态详解 -
ahtest:
赞一下~~
一个简单的ruby Metaprogram的例子 -
itiProCareer:
简直胡说八道,误人子弟啊。。。。谁告诉你 Ruby 1.9 ...
ruby中的类变量与类实例变量 -
dear531:
还得补充一句,惊群了之后,数据打印显示,只有一个子线程继续接受 ...
linux已经不存在惊群现象 -
dear531:
我用select试验了,用的ubuntu12.10,内核3.5 ...
linux已经不存在惊群现象
这边有几个概念先看一下:
这几个概念的简写版,可以通过下面的函数就行简化:
其中I18N和M17N基本是 同义的。
1 介绍一下asc和unicode.
ascII和unicode的概念和编码,网上的介绍很多,不理解的可以google一下,我这边简要的介绍一下。
ascII全称是the American Standard Code for Information Interchange,它使用7位二进制表示一个字符的字符集。因此他可以表示2的7次方个字符,也就是128个,不同的字符的表示从0到127.这种表示足够表示绝大部分的美国英语。如果你从一个流中读一个在0到127字节值,然后将它转成char,结果将会是扩展asc码.
接下来是Latin-1字符集
ISO 8859-1, Latin-1是一个8位的二进制表示一个字符的字符集,因此他能表示的值是0到256。并且它是ascII的超集,他的前128个字符是和ascII编码是一样的,它和ascII的区别是在128-256之间的字符,。ascII没有提供这部分的字符,而Latin-1扩展了这部分,用以表示一些非英语的字符,比如拉丁文.如果你从一个流读入一个无符的字节,然后转换它为char,那么它的结果将是Latin-1 的字符.
unicode字符集
Latin-1对于大部西欧的语言来说是足够了,可是像中文,日语之类的语言对于它来说,他所能表示的字符数量就太少了。因此就随之诞生了unicode字符集,unicode能够表示这个世界上大部分的存在的,或者不存在的语言.
unicode字符集的前256个字符是和Latin-1一样的。
unicode只是一个字符集,他并不是字符编码。举个例子,比如unicode它指出了字符A必须表示成65,可是他并没有指出65是用一个字节,两个字节甚至更多的字节来表示,而且它也没有指出这些字节的表示顺序是大端的表示,还是小端的表示.这边有几个unicode到字节的标准编码,最常用的UTF-8, UTF-16, and UTF-32.
UTF-32 它简单的将一个字符编码为一个4字节的int.
UTF-16 大部分时候将一个字符编码为一个2字节的无符short.当对一些的中文,数学符号,等等一些字符进行编码的时候它会将字符编码为4字节(也就是2个2字节的字符).
UTF-8是一个高效的编码使用1个字节来表示所有的ascII字符.2个字节来表示一些其他的字母表,3到4个字节来表示其他的语言,比如中文之类的.
下面来看几个例子:
存储这个字符的话,就是一个字节序列:
我们可以看到 每一个字符的编码都有 00,这个无效的字符,虽然这个例子有点特殊,可是我们还是会遇到这种情况,这种情况下,UTF-16的编码就会比较浪费存储空间。
如果我们使用UTF-8来编码的话,就是下面这种字节序列:
自己看这个编码,它去掉了所有无效的0,并且这个编码是和ASCII码的编码是一样的,刚好和我们上面说的一样.
2 jcode库与$KCODE
如果要在ruby中使用不同的字符集,你必须要注意这个变量$KCODE,它定义了很多核心方法的操作string的行为。K是Japanese nonalphabetic 的简写.这个变量有5个设置。分别是:
当然你也可以使用你所想要的字符集的全写,比如$KCODE = "UTF-8".如果没有指定KCODE变量的话,ruby默认是ASCII编码.
正则表达式也可以变得很很聪明在utf-8模式下:
从这个例子我们可以看到,size方法的返回值实际上是这个字符串在某个固定的字符集下被编码为几个字节,从而返回它.
jcode库还提供了一些有用的方法,比如jlength和each_char.
3 重新谈一下字符串和正则表达式的操作。
在utf-8的模式下,很多string的操作我们都可以使用:
可是,比如一个字符"中国"我们对他求他的长度,这时,我们会得到6,可是其实他看起来只有2个字符,如果我们想到得到2的话,我们就要用到jcode库了:
这边要注意的是,jcode库一定要在utf-8的编码下,才能正常工作.
如果对特殊字符比如汉字使用upcase之类的方法,将不会发生任何变化.这个是ruby所作的限制
这里还有一个方法,叫做mbchar?的,他检测一个字符串是否是多字节的.
jcode库还重新定义了chop, delete, squeeze, succ, tr, 和tr_s.这些方法.这些方法都是为多字节的字符串所定义的.
我们还可以使用each_char来打印出所有的多字节字符:
unpack方法,有选项来帮助我们操作unicode字符串,如果他的参数为U*的话,则将会解码当前的字符串,使用utf-8编码。也就是说他会返回一个整数数组,而对应的还有一个pack方法,他则是编码的:
正则表达式也可以士多字节的.特别是当你使用Oniguruma 时,例如/./将会匹配单个多字节的字符.
就算没有Oniguruma ,正则表达式也可以聪明的理解一个字符是不是一个多字节的词.
4 检测字符的编码
经常多字节和单字节之间的编码区别很大,可是如果只是单字节呢,比如单字节的utf-8和ascII的编码就很象了,我们该如何判断呢:
我们还可以检测纯粹的ascII编码,通过查看他的每一个字节是不是都小于127
引用
为了将软件多语言化,首先进行植入能够使用各种语言的设计和方法等的国际化操作(internationalization 118N)。然后针对各种语言,进行能够使用该语言的地区化(localization、L10N)的操作。进行了多种语言的地区化,用户能够切换成自己想使用的语言时的状态称为多语言化(multilingualization、M17N)。
这几个概念的简写版,可以通过下面的函数就行简化:
def shorten(str) (str[0..0] + str[1..-2].length.to_s + str[-1..-1]).upcase end puts shorten("internationalization") # I18N puts shorten("multilingualization") # M17N puts shorten("localization") # L10N
其中I18N和M17N基本是 同义的。
1 介绍一下asc和unicode.
ascII和unicode的概念和编码,网上的介绍很多,不理解的可以google一下,我这边简要的介绍一下。
ascII全称是the American Standard Code for Information Interchange,它使用7位二进制表示一个字符的字符集。因此他可以表示2的7次方个字符,也就是128个,不同的字符的表示从0到127.这种表示足够表示绝大部分的美国英语。如果你从一个流中读一个在0到127字节值,然后将它转成char,结果将会是扩展asc码.
接下来是Latin-1字符集
ISO 8859-1, Latin-1是一个8位的二进制表示一个字符的字符集,因此他能表示的值是0到256。并且它是ascII的超集,他的前128个字符是和ascII编码是一样的,它和ascII的区别是在128-256之间的字符,。ascII没有提供这部分的字符,而Latin-1扩展了这部分,用以表示一些非英语的字符,比如拉丁文.如果你从一个流读入一个无符的字节,然后转换它为char,那么它的结果将是Latin-1 的字符.
unicode字符集
Latin-1对于大部西欧的语言来说是足够了,可是像中文,日语之类的语言对于它来说,他所能表示的字符数量就太少了。因此就随之诞生了unicode字符集,unicode能够表示这个世界上大部分的存在的,或者不存在的语言.
unicode字符集的前256个字符是和Latin-1一样的。
unicode只是一个字符集,他并不是字符编码。举个例子,比如unicode它指出了字符A必须表示成65,可是他并没有指出65是用一个字节,两个字节甚至更多的字节来表示,而且它也没有指出这些字节的表示顺序是大端的表示,还是小端的表示.这边有几个unicode到字节的标准编码,最常用的UTF-8, UTF-16, and UTF-32.
UTF-32 它简单的将一个字符编码为一个4字节的int.
UTF-16 大部分时候将一个字符编码为一个2字节的无符short.当对一些的中文,数学符号,等等一些字符进行编码的时候它会将字符编码为4字节(也就是2个2字节的字符).
UTF-8是一个高效的编码使用1个字节来表示所有的ascII字符.2个字节来表示一些其他的字母表,3到4个字节来表示其他的语言,比如中文之类的.
下面来看几个例子:
引用
"Matz" # 用utf-16来编码的话就是 U+004d U+0061 U+0074 U+007a
存储这个字符的话,就是一个字节序列:
引用
00 4d 00 61 00 74 00 7a
我们可以看到 每一个字符的编码都有 00,这个无效的字符,虽然这个例子有点特殊,可是我们还是会遇到这种情况,这种情况下,UTF-16的编码就会比较浪费存储空间。
如果我们使用UTF-8来编码的话,就是下面这种字节序列:
引用
4d 61 74 7a
自己看这个编码,它去掉了所有无效的0,并且这个编码是和ASCII码的编码是一样的,刚好和我们上面说的一样.
2 jcode库与$KCODE
如果要在ruby中使用不同的字符集,你必须要注意这个变量$KCODE,它定义了很多核心方法的操作string的行为。K是Japanese nonalphabetic 的简写.这个变量有5个设置。分别是:
引用
a ASCII
n NONE (ASCII)
e EUC
s SJIS
u UTF-8
n NONE (ASCII)
e EUC
s SJIS
u UTF-8
当然你也可以使用你所想要的字符集的全写,比如$KCODE = "UTF-8".如果没有指定KCODE变量的话,ruby默认是ASCII编码.
puts $KCODE $KCODE="n" eacute="" eacute<<0303<<0251 sword=eacute+"p"+eacute+"e" p eacute p sword $KCODE="u" puts eacute p sword
正则表达式也可以变得很很聪明在utf-8模式下:
$KCODE="n" letters=sword.scan(/(.)/) puts letters.size #6当在默认的ascII编码下sword是由6个字符组成的. $KCODE="u" letters=sword.scan(/(.)/) puts letters.size #4 puts "中国".size #6
从这个例子我们可以看到,size方法的返回值实际上是这个字符串在某个固定的字符集下被编码为几个字节,从而返回它.
jcode库还提供了一些有用的方法,比如jlength和each_char.
3 重新谈一下字符串和正则表达式的操作。
在utf-8的模式下,很多string的操作我们都可以使用:
test1="人民共和国" puts test+test1 puts test1.include?("人民")
可是,比如一个字符"中国"我们对他求他的长度,这时,我们会得到6,可是其实他看起来只有2个字符,如果我们想到得到2的话,我们就要用到jcode库了:
$KCODE = "u" require 'jcode' sword = "中国" puts sword.jlength #2 puts sword.length #6
这边要注意的是,jcode库一定要在utf-8的编码下,才能正常工作.
如果对特殊字符比如汉字使用upcase之类的方法,将不会发生任何变化.这个是ruby所作的限制
$KCODE = "u" require 'jcode' sword = "中国" puts sword.count("国") #3 puts sword.jcount("国") #1
这里还有一个方法,叫做mbchar?的,他检测一个字符串是否是多字节的.
$KCODE = "u" sword.mbchar? # 0 "foo".mbchar? # nil
jcode库还重新定义了chop, delete, squeeze, succ, tr, 和tr_s.这些方法.这些方法都是为多字节的字符串所定义的.
我们还可以使用each_char来打印出所有的多字节字符:
puts sword.each_char {|x| puts x } # 中国人
unpack方法,有选项来帮助我们操作unicode字符串,如果他的参数为U*的话,则将会解码当前的字符串,使用utf-8编码。也就是说他会返回一个整数数组,而对应的还有一个pack方法,他则是编码的:
puts array=sword.unpack("U*") puts array.pack("U*")
正则表达式也可以士多字节的.特别是当你使用Oniguruma 时,例如/./将会匹配单个多字节的字符.
就算没有Oniguruma ,正则表达式也可以聪明的理解一个字符是不是一个多字节的词.
$KCODE = "u" puts sword =~ /\w/ # 0 puts sword =~ /\W/ # nil
4 检测字符的编码
经常多字节和单字节之间的编码区别很大,可是如果只是单字节呢,比如单字节的utf-8和ascII的编码就很象了,我们该如何判断呢:
class String def utf8? unpack('U*') rescue return false true end end puts sword.utf8?
我们还可以检测纯粹的ascII编码,通过查看他的每一个字节是不是都小于127
class String def ascii? self.split(/./).all? {|ch| ch < 128 } end end
发表评论
-
一个创建闭包的小技巧
2008-06-05 00:12 2135一个小技巧,在Ola Bini 的blog上看到的。 假设你 ... -
解决Colored Cubes问题
2008-06-02 10:43 2785Engineering Puzzle You have fo ... -
ruby1.9中的Iterators
2008-03-05 22:37 3722在ruby1.9中增加了External Iterators这 ... -
一个简单的ruby Metaprogram的例子
2008-03-03 23:49 4104比如下面一个文件 people.txt 引用name,age ... -
Ruby Object Model
2008-03-03 19:29 3576刚好看到,保存一下. -
一个检测方法的参数类型的小程序
2008-03-02 22:48 3249今天没事看blog的时候,看到一个小子实现了这个,不过他的程序 ... -
rails中的BlankSlate源码分析
2008-02-28 23:27 3448其实这个类实现的功能很简单,那就是实现一个没有predefin ... -
ruby中的类变量与类实例变量
2008-02-26 21:15 7636首先,在ruby1.8中类变量是所有子类和父类共享的,可以看下 ... -
在ubuntu上共存多个版本的ruby
2008-02-24 15:20 4377今天装Revactor库的时候,真把我郁闷了,没想到ubunt ... -
看到了一个用ruby写的scheme解释器
2008-02-16 21:35 3771,自己本来想等啥时候有时间做个类似的东西呢,没想到已经有人做 ... -
ruby way之处理RSS和Atom
2008-01-31 01:32 35231 rss 标准库 RSS 是基于xml的,因此你能简单的将 ... -
ruby way之使用REXML解析xml
2008-01-30 00:35 9255REXML 是一个完全用ruby写的processor ,他有 ... -
rails2中的一些被废弃的用法
2008-01-29 00:33 2544这些只是自己最近看web开发敏捷之道的时候(由于书中的版本是1 ... -
ruby way之动态特性之二
2008-01-25 00:49 36831 得到所定义的实体的列表 ruby的反射api能够使我们在 ... -
ruby way之动态特性之一
2008-01-23 01:25 45481 动态的evaluate代码 全局的方法eval 编译并且 ... -
ruby way之高级OOP特性之二
2008-01-20 03:43 29491 把代码像对象一样存储 当你想要以对象的形式存储一块代码的 ... -
ruby way之高级OOP特性之一
2008-01-19 12:14 22671 发送一条消息给一个对象 当你调用一个方法时,你也就是发送 ... -
ruby way之OOP之二
2008-01-16 23:59 23641 理解allocate 在一些特殊的环境中,你可能需要不调 ... -
ruby way之OOP之一
2008-01-16 00:25 26381 使用多个构造方法 在ruby中没有像c++或者ruby中 ... -
ruby way之连接数据库
2008-01-14 00:47 2476这边都只是个大概,具体的要自己去看文档了. 1 连接SQLi ...
相关推荐
The Ruby Way 第三版(英文版),全书22章,书中包含600多个按主题分类的示例。每个示例都回答了“如何使用Ruby来完成”的问题。 ——Ruby on Rails之父David Heinemeier Hansson倾力推荐!
The Ruby Way(第2版) <br>The Ruby Way assumes that the reader is already familiar with the subject matter. Using many code samples it focuses on "how-to use Ruby" for specific applications, either ...
FastGettext就是其中一款高效的Ruby国际化工具,它以其内存占用小、命名空间简洁以及线程安全性等特性,深受开发者喜爱。下面将详细介绍FastGettext的主要功能、用法及其优势。 1. **主要功能** FastGettext提供...
the ruby way the ruby way
内含以下4个文档: 1、Addison.Wesley.The.Ruby.Way.2nd.Edition.Oct.2006.chm 2、O'Reilly.Learning.Ruby.May.2007.chm 3、Programming Ruby 2e.pdf 4、ruby中文文档.chm
《The Ruby Way 第二版》...“《The Ruby Way (第2版)中文版》在阐述元编程(metaprogramming)等方面尤其出类拔萃,而元编程是Ruby最引人注目的方面之一。” ——Ruby on Rails之父David Heinemeier Hansson倾力推荐!
《The Ruby Way 2nd Edition》是一本深入探讨Ruby编程语言的经典著作,旨在帮助读者全面理解和掌握Ruby的精髓。这本书的第二版在2006年出版,由Addison-Wesley出版,作者通过深入浅出的方式,揭示了Ruby语言的强大...
"11.5 时间日期the ruby way"这个主题深入探讨了Ruby中处理时间日期的最佳实践和常见用法。让我们逐一了解这些知识点。 首先,`Time.now`是Ruby中获取当前时间的标准方法。它返回一个`Time`对象,表示自1970年1月1...
Ruby-i18n是Ruby语言中的一个核心库,专门用于实现国际化(Internationalization,简称i18n)和本地化(Localization,简称l10n)功能。在软件开发过程中,尤其是在面向全球用户的应用中,i18n和l10n是至关重要的,...
3. **块、 Proc 和 Lambda**:Ruby中的块(blocks)、Proc对象和Lambda表达式是其强大的功能之一,它们允许程序员创建闭包和匿名函数,用于处理迭代和回调。 4. **元编程**:Ruby的元编程能力强大,允许在运行时...
《Ruby Way》是由Hal Fulton编写的关于Ruby编程语言的一本著作。这本书深入浅出地探讨了Ruby语言的各种特性,旨在帮助读者理解并掌握这门强大的动态脚本语言。Ruby以其简洁、优雅的语法和强大的元编程能力而备受赞誉...
4. **国际化(I18N)与消息目录**:探讨了如何使用Ruby进行国际化支持,包括消息目录的创建和管理。 5. **高级数据结构操作**:除了基本的数据类型外,还涉及到了哈希表、数组以及其他数据结构如栈、树和图的操作。...
从给定的文件信息来看,标题、描述及标签均指向了“Ruby自动化脚本实现网络拓扑映射”这一主题,然而,实际的部分内容却似乎与自动化脚本或网络拓扑映射没有直接关联,而更像是一个自动化操作的脚本示例,可能用于...
Ruby和Watir(Web Application Testing in Ruby)是一个强大的自动化测试框架,主要用于Web应用程序的测试。Ruby是一种面向对象的、动态的编程语言,以其简洁、优雅的语法和强大的元编程能力而受到开发者的喜爱。...