程序編碼一般分幾種情況:
- 源碼文件編碼
- 接收外部?jī)?nèi)容的編碼
- 運(yùn)行環(huán)境編碼
- 操作系統(tǒng)編碼
首先源碼文件的編碼桑驱,可以通過(guò)在ruby文件的頭部添加一行申明即可奈嘿,這樣所有在源碼里面出現(xiàn)的字符都保存為指定的編碼:
# -*- coding:utf-8 -*-
接收的內(nèi)容或讀取外部文件時(shí)箫踩,可能不確定是什么編碼,這個(gè)時(shí)候就可以對(duì)外部接收的字符或內(nèi)容進(jìn)行轉(zhuǎn)碼峭跳。
string.encode('utf-8') #把字符串轉(zhuǎn)成utf-8模式
string.force_encoding('utf-8') #把字符串強(qiáng)制轉(zhuǎn)成utf-8模式
require "nkf"
string= NKF.nkf("-w", string) ##同樣把字符串轉(zhuǎn)成utf-8猜惋,其值-w參數(shù)代表utf-8
運(yùn)行環(huán)境的編碼,通常默認(rèn)和操作系統(tǒng)的編碼是一致的罚舱,但是也可以設(shè)置為指定的編碼井辜,這樣保持所有編碼一致性。ruby中設(shè)定運(yùn)行環(huán)境編碼方式如下管闷,即啟動(dòng)ruby時(shí)添加encoding參數(shù)并指定編碼格式粥脚。
ruby --encoding=utf-8
操作系統(tǒng)編碼,通常中文的都是GBK的包个;所以如果在程序里用到系統(tǒng)中的取值時(shí)用到中文的地方需要注意刷允;比如:中文名字的目錄;如果你的運(yùn)行環(huán)境是utf-8的,讀取中文目錄下的文件時(shí)树灶,需要把路徑字符串轉(zhuǎn)碼成gbk再去讀搀菩,否則會(huì)報(bào)錯(cuò)。
在這里有一個(gè)問(wèn)題:
ruby x:/path/to/ruby/中文/file.rb #可以成功找到rb文件破托,此時(shí)運(yùn)行環(huán)境編碼為gbk
ruby --encoding=utf-8 x:/path/to/ruby/中文/file.rb #不能找到rb文件肪跋,提示編碼錯(cuò)誤,因?yàn)榇藭r(shí)運(yùn)行環(huán)境編碼為utf-8土砂,而傳遞過(guò)去的路徑參數(shù)為gbk編碼州既。
而如果運(yùn)行環(huán)境為gbk時(shí),而源碼為utf-8編碼萝映,則在有些地方處理中文等字符串時(shí)會(huì)提示編碼不兼容吴叶,因?yàn)橛行r(shí)候字符編碼處理的默認(rèn)編碼就是運(yùn)行環(huán)境的編碼。
ruby x:/path/to/ruby/english/file.rb #可以找到序臂,運(yùn)行環(huán)境同源碼設(shè)置編碼
所以運(yùn)行環(huán)境的編碼應(yīng)該有如下優(yōu)先級(jí):是否有encoding參數(shù)指定==>第一次處理非中文時(shí)的字符編碼格式