`
simohayha
  • 浏览: 1400464 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

ruby way之国际化之一

    博客分类:
  • ruby
阅读更多
这边有几个概念先看一下:



引用
为了将软件多语言化,首先进行植入能够使用各种语言的设计和方法等的国际化操作(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




当然你也可以使用你所想要的字符集的全写,比如$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

分享到:
评论
1 楼 trace 2008-01-31  
很强很不错

相关推荐

    The Ruby Way--3rd Edition--2015-英文版

    The Ruby Way 第三版(英文版),全书22章,书中包含600多个按主题分类的示例。每个示例都回答了“如何使用Ruby来完成”的问题。 ——Ruby on Rails之父David Heinemeier Hansson倾力推荐!

    The Ruby Way(第2版)

    The Ruby Way(第2版) &lt;br&gt;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 ...

    Ruby-FastGettextRuby国际化工具

    FastGettext就是其中一款高效的Ruby国际化工具,它以其内存占用小、命名空间简洁以及线程安全性等特性,深受开发者喜爱。下面将详细介绍FastGettext的主要功能、用法及其优势。 1. **主要功能** FastGettext提供...

    the-ruby-way

    the ruby way the ruby way

    ruby学习资源(Programming Ruby, Learning Ruby, 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(中文版)(第二版)pdf

    《The Ruby Way 第二版》...“《The Ruby Way (第2版)中文版》在阐述元编程(metaprogramming)等方面尤其出类拔萃,而元编程是Ruby最引人注目的方面之一。” ——Ruby on Rails之父David Heinemeier Hansson倾力推荐!

    the ruby way 2ed

    《The Ruby Way 2nd Edition》是一本深入探讨Ruby编程语言的经典著作,旨在帮助读者全面理解和掌握Ruby的精髓。这本书的第二版在2006年出版,由Addison-Wesley出版,作者通过深入浅出的方式,揭示了Ruby语言的强大...

    11.5 时间日期the ruby way.rar

    "11.5 时间日期the ruby way"这个主题深入探讨了Ruby中处理时间日期的最佳实践和常见用法。让我们逐一了解这些知识点。 首先,`Time.now`是Ruby中获取当前时间的标准方法。它返回一个`Time`对象,表示自1970年1月1...

    Ruby-i18nRuby的国际化和本地化的解决方案

    Ruby-i18n是Ruby语言中的一个核心库,专门用于实现国际化(Internationalization,简称i18n)和本地化(Localization,简称l10n)功能。在软件开发过程中,尤其是在面向全球用户的应用中,i18n和l10n是至关重要的,...

    the ruby way

    3. **块、 Proc 和 Lambda**:Ruby中的块(blocks)、Proc对象和Lambda表达式是其强大的功能之一,它们允许程序员创建闭包和匿名函数,用于处理迭代和回调。 4. **元编程**:Ruby的元编程能力强大,允许在运行时...

    Ruby-Way.rar_About Language

    《Ruby Way》是由Hal Fulton编写的关于Ruby编程语言的一本著作。这本书深入浅出地探讨了Ruby语言的各种特性,旨在帮助读者理解并掌握这门强大的动态脚本语言。Ruby以其简洁、优雅的语法和强大的元编程能力而备受赞誉...

    Addison Wesley The Ruby Way 2Nd Edition Oct 2006.pdf(英文版)

    4. **国际化(I18N)与消息目录**:探讨了如何使用Ruby进行国际化支持,包括消息目录的创建和管理。 5. **高级数据结构操作**:除了基本的数据类型外,还涉及到了哈希表、数组以及其他数据结构如栈、树和图的操作。...

    Ruby自动化脚本实现网络拓扑映射

    从给定的文件信息来看,标题、描述及标签均指向了“Ruby自动化脚本实现网络拓扑映射”这一主题,然而,实际的部分内容却似乎与自动化脚本或网络拓扑映射没有直接关联,而更像是一个自动化操作的脚本示例,可能用于...

    开放Ruby+watir 自动化测试工具介绍+安装说明

    Ruby和Watir(Web Application Testing in Ruby)是一个强大的自动化测试框架,主要用于Web应用程序的测试。Ruby是一种面向对象的、动态的编程语言,以其简洁、优雅的语法和强大的元编程能力而受到开发者的喜爱。...

Global site tag (gtag.js) - Google Analytics