Alex學Ruby 字元編碼與國際化

2021-09-04 23:59:41 字數 2595 閱讀 7481

背景:

字元資料是最為重要的資料型別,為什麼呢 ? 因為程式是為人服務的,那些能直接讀懂二進位制資料的超人是很少的

。但是如何用二進位制資料表示字元呢 ? 這個時候「編碼」就誕生了,簡單來說,編碼就是二進位制資料和字元之間建立的對映。ascii碼出現了。但是世界這麼大,給你乙個字元,你如何知道這是哪種文字的字元屬於哪個國家哪種文化呢(火星文除外)? 剛開始出現的ascii碼,只是面向英語的,像歐洲國家的人就沒有那麼福分去享受這個字符集了,於是就出現了所謂的世界字符集unicode,有人說unicode只有65530個字元,其實是不對的。實際上它可以表示無限個字元。

要點:如果你在

ruby中想使用不同的字符集,那麼請記住$kcode這個全域性變數,該變數有常用的五種設定,每種設定都是單個不區分大小寫的字母:

1. a: ascii

2. n : none(ascii)

3. e: euc

4. s: sjis

5. u: utf-8

你可以這麼設定,$kcode = 'u' ,也可以這麼設定,$kcode = 'utf-8' , 僅僅第乙個字元(u)管用。

當使用utf-8的時候require  jcode這個庫會很有幫助。

訊息目錄是指用特定的語言表示的訊息集合,是本地化思想中不可分割的一部分。其思想是,將與語言相關的字串和應用程式的其他部分分離,這樣只需要「插入」不同的目錄就可獲得用不同語言表示的訊息和字串。

ruby裡的gettext-package庫是實現這一功能的最佳方式,這是小日本masao的勞動結晶(masao雖然是個小日本,但是我挺佩服這個人的,年紀好像是三十多了吧,除了日常工作,還維護gettext這個庫,維護兩個blog,乙個是日文的,乙個是英文的,曾經我也效仿這個小日本寫英文blog,但是沒有堅持下去,真是失敗),rails的多個國際化外掛程式都是基於gettext庫來實現的。gnu有個gettext程式,小日本寫的這個是模仿gnu這個gettext寫的

ruby實現。

想使用其基本功能,需要require 'gettext'

想使用更有用的實用程式,需要require 'gettext/utils'

ruby1. 8 .6沒有包含這個gettext庫,需要自己安裝  gem install gettext

關於gettext有三個關鍵的術語需要解釋:

1.   po - file  :  可移植的物件檔案,是人類可讀的形式,每個po-file對應一種文化的語言,也叫模板檔案。

2.  mo - file :是可移植的二進位制訊息目錄檔案,是根據po-file建立的,

ruby庫讀取的是mo-file,而不是po-file。

3.  text domain : 文字域,實際上是mo-file的basename,這個是和應用程式所繫結的。

所以有了文字域,和應用程式繫結以後,我們只需要寫乙個po-file檔案,然後生成mo-file檔案,就可以實現本地化了。

網上找了個簡單的例子:

require 'gettext'

class person

include gettext

def initialize(name, age,children_num)

@name, @age, @children_num = name, age, children_num

enddef show

puts  _("information")

puts  _("name: %, age: %")  %

puts  n_("%  is an unmarried.", "% has %  boy or girl  firend.", @firend_num)  %  

endend

alex = person.new("alex",26, 0 )

alex.show

mary = person.new("mary", 18, 0)

mary.show

上面的例子裡,

puts  _("name: %, age: %")  % ,這種寫法我估計是gettext裡實現的。

require 'gettext/untils'

desc "update pot/po file"

task :updatepo do

enddesc "create mo-files"

task :makemo do

gettext.create_mofiles

endcreate_mofiles 將建立子目錄data/locale/, 並根據po-file生成mo-file。

#, fuzzy

這個表示是還沒有被翻譯的內容或者是需要校譯的內容。

rakefile

person.rb

po/ .

.data/

locale/ .

.然後我們可以測試一下:

首先我們需要設定環境變數,

export gettext_path="data/locale"

export lang="zh_cn.utf-8"

ruby person.rb

這樣應用程式會根據變數lang的設定情況輸出對應的值。

以上設定環境變數主要是為了在控制台下測試這個簡單程式而已,在本地化應用裡將不會使用這個環境變數。

Alex學Ruby 字元編碼與國際化

背景 字元資料是最為重要的資料型別,為什麼呢 因為程式是為人服務的,那些能直接讀懂二進位制資料的超人是很少的 但是如何用二進位制資料表示字元呢 這個時候 編碼 就誕生了,簡單來說,編碼就是二進位制資料和字元之間建立的對映。ascii碼出現了。但是世界這麼大,給你乙個字元,你如何知道這是哪種文字的字元...

Alex學Ruby 關於多型關聯

剛才看了李妙妙的 這篇文章 感覺說的不是很明白,並沒有從物件導向的角度說清楚,我的理解 要理解多型關聯,首先要理解什麼是多型。多型是物件導向乙個特性。同乙個物件有不同的行為,叫多型。在李舉的那個例子裡,article,image,sound,這三個model會有很多共同的行為,如果沒有使用多型關聯,...

Alex學Ruby 最重要的資料型別 字串

但我還記得c語言裡的字串是以空字元結束的,但 ruby不是,所以,ruby的字串裡可以包含空字元。2.ruby裡的字串分為兩種,其中最簡單的一種是用單引號括起的字串,表示的完全是字面意義,唯一支援的轉義序列是 單引號和反斜槓 str i m ok a u ok xie i m ok a u ok x...