2013-10-05 17 views
5

按照FLTK 1.3.2 documentation如何使用FLTK顯示Unicode?

Unicode的支持是最近才加入到FLTK並且仍然是不完整的 。

然而,以下理應實現:

  • 規定:

    值得注意的是,初步實現Unicode和在FLTK UTF-8的涉及三個重要的方面是非常重要的Unicode字符表和一些簡單的相關函數

  • char *變量和函數參數從單個字節轉換爲每個字符表示ion至UTF-8可變長度
    序列
  • 修改顯示字體接口以接受一般Unicode字符或UCS代碼號碼而不是僅ASCII或 Latin1字符。

我的問題是,我如何在我的FLTK控件上實際顯示Unicode?我無法找到任何接受Unicode的小部件功能。例如,這是爲label函數簽名:

void Fl_Widget::label ( const char * text )

回答

5

從你發佈的鏈接:

FLTK將使用UTF-8編碼來完全轉換爲Unicode。如果底層操作系統需要不同的編碼,FLTK會根據需要轉換字符串。

您列出的三個重點是組成其實施Unicode支持的區域;也就是說,這些是他們正在或正在計劃要做的事情。

  • FLTK實施者要提供的Unicode字符表,而且一些簡單的相關功能
  • FLTK實施者要的char *變量和函數參數轉換使用SBCS爲UTF-8。 (也就是說,他們將重新實現FLTK函數和變量,以將char *字符串視爲UTF-8。)
  • FLTK實現者將修改顯示字體界面以覆蓋不僅僅是ASCII和Latin1字符。

我的問題是,實際上,我怎麼對我的FLTK控制顯示Unicode?我無法找到任何接受Unicode的小部件功能。例如,這是對標籤的功能簽名:

void Fl_Widget::label (const char * text) 

有跡象表明,錯誤地使用「統一」是指使用雙字節字符的編碼許多人。您鏈接到的FLTK文檔不會犯這個錯誤。瞭解這一點,文檔很清楚地說明了如何使用Unicode與上述簽名:您使用UTF-8編碼將Unicode數據作爲char *字符串傳遞。例如,如果您使用的是使用UTF-8作爲執行編碼編譯:

widget.label("кошка 日本國"); 

或者,如果你有一個C++編譯器11:

widget.label(u8"кошка 日本國"); 
+0

注意,最後一位要求編譯器瞭解包含字符串文字的源文件的編碼。 – rubenvb

+1

謝謝。鑑於你的回答,我花了很多時間[教育自己瞭解Unicode](http://www.joelonsoftware.com/articles/Unicode.html)。 – JBentley

+0

@rubenvb:是的,不止如此:對於下一個例子,編譯器*必須支持UTF-8作爲其窄執行字符集*,例如Visual C++沒有,對於最後一個例子,編譯器必須支持C++ 11'u8'文字前綴,例如Visual C++沒有。總之,這些是**不可移植的**例子。寬字符串文字是可移植的,但它們必須在運行時轉換爲UTF-8。 –