linux Unix平台G11N的開發

2021-04-14 01:11:57 字數 1882 閱讀 9189

在linux/unix平台上面做g11n的開發,大抵都會用到gettext庫/工具集(

ftp://ftp.gnu.org/gnu/gettext/ ) 和libiconv(

http://www.gnu.org/software/libiconv/) ,前者是用於實現resource bundle,而後者用於各種編碼轉化。

(注:這裡沒有考慮cross-platform)

1. 實現方法

a . 使用po檔案作為資源檔案 (建議編碼是utf-8)

一方面因為utf-8相容ansi,另外一方面考慮到g11n的程式大部分使用utf-8輸出,比如輸出到database,web ui, file等等。

b. 使用getext從resource file ( mo檔案)讀到相應的l10n resource檔案

注意這裡需要先setlocale來設定locale

#include 

<

stdio.h

>

#include 

<

locale.h

>

#include 

<

libintl.h

>

#define

_(string) gettext (string)

intmain(

intargc, 

char

**argv)

if(bindtextdomain(package, 「

/usr

/share

/locale」) 

==null) 

if(textdomain(package) 

==null) 

printf(「

%s/n」, _(「hello, world

!」));

return0;

} c.如果要輸出到控制台(console),因為不是console都支援unicode output,所以推薦的方法是首先是把utf-8轉化為本地編碼,然後使用printf輸出。不推薦使用wprintf進行輸出,一方面是因為wchar_t的大小隨編譯器不同,不好控制。另外一方面,很多wprintf的實現也都是先把wchar_t轉為本地編碼,然後輸出。轉化編碼使用libconv

d.如果要輸出到web pages,database,file,編碼推薦使用utf-8.

e.如果要輸出本地化的日期和時間,使用api: strftime

#include 

<

stdio.h

>

#include 

<

time.h

>

intmain(

intargc, 

char

**argv) 

if((ptm 

=localtime(

&t)) 

==null) 

strftime(buffer, 

sizeof

(buffer), 「%x 

%x」, ptm);

printf(「

%s/n」, buffer);

return0;

} f. 如果要輸出本地化的數字和貨幣,使用api: strfmon

#include 

<

stdio.h

>

#include 

<

monetary.h

>

intmain(

intargc, 

char

**argv)

2.目錄結構

/product

/i18n

/zh_tw

your.mo

/ja_jp 

your.mo

從Oracle官網了解G1

提取到以下關鍵字 young generation的總體記憶體大小是非常容易增加或者減少的。最關鍵的是young gc是stw的,並且是使用多執行緒來完成的堆使用的比例超過initiatingheapoccupancypercent,g1會開始marking階段。g1老年代收集的階段 xx useg...

G1 中的記憶體分割槽引用 RSet

在g1 物件時,會根據分割槽之間的引用關係快速定位到引用者 比如乙個老生代分割槽有乙個新生區的物件引用了,即 young.field old 則old物件對應的rset中會標記young所在分割槽的位置 找到分割槽後再尋找分區內引用old物件的young物件 管理引用通過add reference函...

垃圾收集器(五) G1收集器

初始標記,標記gc roots直接關聯的物件,新增tams標記 兩個指標 stw 併發標記,從gc roots沿著引用關係查詢,如果使用者執行緒同時修改了引用關係,新增satb標記 此時的新物件分配到tams標記之外的區域 併發。最終標記 處理satb標記,stw 篩選 按照 價值進行 對於乙個re...