http報文可以承載任何語言表示的內容的。因為對http來說,實體主體只是二進位制資訊的容器而已。
在http中為了支援國際性,伺服器返回內容的同時需要告知客戶端文件是用的什麼字母表和語言等資訊,這樣客戶端才能正確的解析出資訊並顯示字元。伺服器可以通過content-type中的charset引數和content-language首部告知客戶端字母表和語言資訊。
同時,客戶端並不是所有的字母表和語言都能進行處理,所以客戶端在發起請求的時候,也可以通過傳送accept-charset和accept-languag
e首部,告知服務端自己所能處理的編碼型別和語言。這兩個首部也支援優先順序,可以通過q引數設定優先順序。
所以,http中的國際化,也就是本篇要介紹的內容主要涉及到字符集編碼(character set encoding)和語言標記(language tag)
所謂字符集起始就是把字元轉為二進位製碼的編碼。http 字符集的值說明如何把實體內容的二進位製碼轉換為特定字母表中的字元。每個字符集標記都命名了一種把二進位製碼轉換為字元的演算法(反之亦然)。字符集標記在由 iana 維護mime字符集序號產生器構進行了標準化。一般通過content-type中的charset引數進行指定。如下:
content-type: text/html; charset=utf-8上面說了,字符集和編碼目的就是為了將二進位制資訊同我們的字元進行轉換。轉換的具體流程一般經過兩個步驟完成(這裡以將二進位制資訊轉為字元過程為例):
經過上面兩個步驟,就能獲得正確的字元了。而我們上面兩個步驟都依賴於正確的charset值。如果該值不正確,同樣一段二進位制資訊可能就會得出錯誤的字元**,同樣第二步中根據charset的值不同,字元**和字元的對應關係也就不同。所以平時的亂碼現象,有時候就是因為charset的值錯誤而引起。
charset的值使用的標準化的mime charset標記。比如:utf-8, iso-8895-1, gbk等。
注:該值一般來說是大小寫不敏感的,在處理的時候需要注意這點。
http只關心字元資料和相關語言及字符集標籤的傳輸;字元形狀的顯示是由使用者的圖形顯示軟體(包括瀏覽器、作業系統、字型等)完成的。
正常情況下,伺服器會通過在content-type首部中使用charset引數告知客戶端mime字符集。
但是如果伺服器沒有顯示的返回資訊,我們客戶端可能就需要盡可能自己從文件內容判斷出字符集。一般在html文件中,會通過描述所用字符集資訊。如下:
...該部分類容說明該html文件使用的gbk編碼。
全世界範圍類字符集編碼非常多,伺服器並不一定都是返回的客戶端能正確處理的字符集。所以為了避免伺服器端返回一些客戶端無法處理的字符集,客戶端在傳送請求的時候,盡量通過accept-charset首部告知伺服器,我們支援哪些字元系統。
目前字元編碼方案主要有以下3種:
a)、固定寬度
固定寬度方式的編碼用固定數量的位元表示每個編碼後的字元。這種方式處理速度較快,但是會浪費一些空間
b)、可變寬度(無模態)
顧名思義,可變寬度就是根據字元**所需要的位元位,採用不同的寬度的位元進行儲存。這樣可以節約資源,而且還能根據需要利用多個位元組來表示不同的文字,比如中午就需要兩個位元組
c)、可變寬度(有模態)
有模態的編碼使用特殊的「轉義」模式在不同的模態之間切換(這個我也沒有太理解其含義)
常見編碼示例:
a)、8位固定寬度
位固定寬度恒等編碼把每個字元**編碼為相應的 8 位二進位制值。它只能支援有 256 個字元**範圍的字符集。iso-8859 字符集家族系列使用的就是 8 位恒等編碼。
b)、utf-8
這個應該是目前比較流行的一種通用編碼了,能夠處理很多語言。是一種無模態的可變寬度編碼。第一位元組的高位表示編碼後的字元所用的位元組數,所需的每個後續位元組都含有 6 位的** 值,其編碼方式可以和ascii編碼相容。如下表:
語言標記是命名口語的標準化字串短語。同時,我們需要對這個標記的字串進行標準化,否者每個人都有自己的命名習慣,字串格式都不一樣,就無法從標記中提取出語言資訊。
實體的 content-language 首部字段描述實體的目標受眾語言,其不限於文字文件。音訊片段、電影以及應用程式都有可能是面向特定語言受眾的。任何面向特定語言受眾的**型別都可以有 content-language 首部。同時我們也可以在該首部指定多個語言,如:content-language: en, fr。
相對應的,客戶端也可以通過accept-language告知服務端我們能夠接受的語言種類。其優先順序從左至右
在 rfc 3066,「tags for the identification of languages」(標識語言的標記)中記錄了語言標記的標準化語法。可以用語言標記來表示:
標記一般由乙個或多個部分組成,中間由"-"分隔,示例如下:
其中:第一子標記和第二子標記都是有專門的文件及相關組織專門維護和命名的,後面會介紹一些。其他的那些沒有專門維護的,一般需要在iana進行註冊。
注:所有的標記都是不區分大小寫的。我們在解析的時候應該注意這點。
第乙個子標記通常是標準化的語言記號,選自 iso 639 中的語言標準集合。不過也可以用字母 i 來標識在 iana 中註冊的名字,或用 x 表示私有的或者擴充套件的名字。其規則如下:
第二個子標記通常是標準化的國家記號,選自 iso 3166 中的國家**和地區標準集合。不過也可以是在 iana 註冊過的其他字串,其規則如下:
4.1、uri字元集合
uri允許使用ascii字符集的子集
uri字元被分為轉義、保留和未保留三種,具體如下表所示:
uri轉義提供了一種安全的方式,可以在uri內部插入保留字元以及原本不支援的字元(比如各種空白)。
每個轉義是一組3字串行,由百分號(%)後面跟上兩個十六進製制數字的字元.這兩個十六進製制數字就表示乙個us-ascii字元的**
在內部處理時,http應用程式應當在傳輸和**uri的時候保持轉義不變。http應用程式應該僅在需要資料的時候才對uri進行轉義。
應用程式應該確保任何uri都不會被反轉義2次,因為在轉義的時候可能會把百分號編碼進去,反轉義出來之後,再轉義一次就會導致資料丟失。
注:要轉義的值本身應該在us-ascii**值的範圍內(0~127)
軟體國際化值頁面國際化
國際化 軟體的國際化 軟體開發時,要使它能同時應對世界不同地區和國家的訪問,並針對不同地區和國家的訪問,提供相應的 符合來訪者閱讀習慣的頁面或資料。國際化又稱為 i18n internationalization 對於軟體中的選單欄 導航條 錯誤提示資訊,狀態資訊等這些固定不變的文字資訊,可以把它們...
外掛程式國際化
外掛程式國際化 在我們的應用中,難免會遇到國際化的問題,eclipse rcp給我們提供了很好的方案,甚至可以在後期批處理完成,但如果是其它外掛程式未提供我們需要的語言版呢?我們可以如何為它們提供語言包呢?乙個簡單的例子,你用messagedialog開啟對話方塊時,按鈕一般時 ok,cancel,...
資源國際化
properties 檔案裡的資源必須經過編碼,不能出現中問,日文等。且必須是ascii 碼。jdk 中bin 資料夾下的native2ascii.exe 可以把資源轉換為ascii 碼。在命令提示符中輸入 native2ascii encoding utf 8 sourcefile targetf...