關於管理系統型專案的國際化 多語言思考

2022-01-23 02:08:24 字數 2723 閱讀 5964

資料表設計中提到的多語言/國際化。其實也就是字符集的考慮,為什麼這麼說呢?

首先在計算機中,所有的資料在儲存和運算時,都要使用二進位制數表示(因為計算機用高電平和低電平分別表示1和0)。

然後我們要考慮字元編碼問題。

ascii碼

ascii 碼使用指定的7 位或8 位二進位制數組合來表示128 或256 種可能的字元。標準ascii 碼也叫基礎ascii碼,使用7 位二進位制數(剩下的1位二進位制為0)來表示所有的大寫和小寫字母,數字0 到9、標點符號, 以及在美式英語中使用的特殊控制字元。 

0~31及127(共33個)是控制字元或通訊專用字元(其餘為可顯示字元),如控制符:lf(換行)、cr(回車)、ff(換頁)、del(刪除)、bs(退格)、bel(響鈴)等;通訊專用字元:soh(文頭)、eot(文尾)、ack(確認)等;ascii值為8、9、10 和13 分別轉換為退格、製表、換行和回車字元。32~126(共95個)是字元(32是空格),其中48~57為0到9十個阿拉伯數字。 

65~90為26個大寫英文本母,97~122號為26個小寫英文本母,其餘為一些標點符號、運算符號等。

unicode

utf-8、utf-16、utf-32都是將數字轉換到程式資料的編碼方案。

utf-8

是以位元組為單位對unicode進行編碼。 

1)對於單位元組的符號,位元組的第一位設為0,後面7位為這個符號的unicode碼。因此對於英語字母,utf-8編碼和ascii碼是相同的。 

2)對於n位元組的符號(n>1),第乙個位元組的前n位都設為1,第n+1位設為0,後面位元組的前兩位一律設為10。剩下的沒有提及的二進位制位,全部為這個符號的unicode碼。

utf-16

utf-16編碼是以16位無符號整型資料為單位的。能夠對unicode的所有1,112,064個有效**點進行編碼。編碼是可變長度的,因為編碼點是用乙個或兩個16位**單元編碼的。 

unicode編碼0x10000-0x10ffff的utf-16編碼有兩個word(乙個8位叫做位元組,乙個16位稱為乙個字,或者雙位元組),第乙個word的高6位是110110,第二個word的高6位是110111。可見,第乙個word的取值範圍(二進位制)是11011000 00000000到11011011 11111111,即0xd800-0xdbff。第二個word的取值範圍(二進位制)是11011100 00000000到11011111 11111111,即0xdc00-0xdfff。

1.首先按現在17個平面的限制,輔助平面的碼位是u+10000到u+10ffff,我們得到了乙個輔助平面的unicode碼時,先減去bmp的碼數0x10000,得到的數介於0到0xfffff之間,最多用20bit表示 

2.然後我們把20bit從中間隔開,分為高位的10bit和低位的10bit 

3.我們知道10bit的取值範圍是0到0x3ff,高位的10bit加上固定值0xd800,得到的值叫做前導**(lead surrogate),範圍是0xd800到0xdbff 

4.低位的10bit加上固定值0xdc00,得到的值叫做後尾**(tail surrogate),範圍是0xdc00到0xdfff。這樣一來,不僅高位和低位都落在了保留區塊內,而且彼此還做了區分。

如果你沒有耐心看完上面關於字元的介紹;那你就記住;不能的文字所用的字符集不一樣;需要的位元組單位長度不一樣,就好比英文只有26個字母;所以我就定義了乙個26位長度陣列;當我輸入26下標時;就會產生陣列越界異常。所以在一開始如果的你的程式需要支援中文的;請使用utf-8,如果你需要儲存像越南文之類的;你可能還需要考慮到使用utf-16的字元。

編碼更多的考慮你可以參考 

一般來說乙個業務系統將會涉及到很多的業務常量,如性別:男/女,愛好:計算機/籃球/足球...

在不考慮多語言版本的時候我們資料結構通常是這樣的

idconstant_code

constant_code

constant_value

1gender

male男2

gender

female

女...

......

...這是我們可以通過select * from constants where constant_code = 'gender' 拿到所有的關於性別的code和value。

而當你需要考慮到多語言版本的時候;你需要考慮到把i18n加入,也就說此時的contant_value列不再儲存乙個具體語言版本的值,而是乙個能對映到你國際化(i18n)的key。

idconstant_code

constant_code

constant_value

1gender

male

i18n_male_key

2gender

female

i18n_female_key

......

......

idlocale

i18n_code

i18n_value

1zh_cn

i18n_male_key男2

en_us

i18n_male_key

male

......

......

這是我們可以通過select * from constants left join i18n on i18n_code = constant_value   where constant_code = 'gender' and locale = '' 拿到所有的關於性別的code和value。

android國際化(多語言)

1.很大程度上,為什麼我們能如此方便的實現國際化 解析度匹配等?主要就是得益於 android 中這種獨特的資源管理方式。程式設計師的 可以不直接和資源發生關係。android 中,我們通常通過 r 檔案提供的索引來間接的引用某乙個資源。而如何維護資源索引和真正的資源之間的關係,這個活,卻是 and...

springboot多語言國際化

實現localresolve介面,定義messageservice bean 自定義messages服務,指定國際化配置路徑 return bean name messagesource public resourcebundlemessagesource getmessageresource co...

iOS APP多語言開發(國際化)

static dispatch once t oncetoken dispatch once oncetoken,objc setassociatedobject nsbundle mainbundle bundle,language nsbundle bundlewithpath nsbundle...