OSG 中文解決方案

2021-06-21 04:10:40 字數 1693 閱讀 7879

概述

本文只限於 windows 環境下。

osg 在 windows 下對中文支援已經非常的好了,但是可能很多人並不知道如何去正確的使用。為了解決這些常見的問題,還有一些基礎知識的普及。特此把 osg 的中文相關問題集中起來說明一下。

理論基礎

一切的原點 acsii

不管什麼字符集、什麼編碼,0-127的編號都是一致的。

字符集把具體的文字對映到乙個編號,所有的對映的集合就是字符集。

字符集編碼

**頁 codepage

windows 內碼使用 ucs-2 字符集,其他所有字符集或者字符集編碼都被統一分配了乙個 codepage 編號,系統會根據這個編號來自動轉換。簡體中文版 windows 的 codepage 是 gbk,編號 936。順帶一提 ansi 是指當前系統的預設 codepage,不同語言版本的系統 ansi 就不同。

中文顯示

中文顯示主要通過 osgtext 模組的 string 來完成。

font 檔案必須是有中文內容的,你不能用 乙個不支援中文字元的 font。

剩下的只有 string 的 3 種字元資料**的問題了。

string(const std::string& str) 這個基本上是沒戲了;

string(const wchar_t* text) 這是最簡單的,不需要多餘的解釋;

string(const std::string& text, encoding encoding) 這種方式也可以,只是用起來很煩,需要其他轉換函式輔助處理。

中文路徑

開始很多人都會費解為什麼 osg 不支援中文路徑,原因很簡單:這完全是 osgdb::ifstream 的小問題。因為很多外掛程式都把檔案作為流來處理了所以不支援劉的外掛程式就能正確的識別中文路徑。

簡單粗暴型

在任何實際路徑操作之前新增下面的**就可以讓 osgdb::ifstream 正確的識別中文路徑了。

setlocale(lc_all, "");

// 空字串表示當前系統預設區域

當然你可能覺得怎麼返回預設狀態呢?

setlocale(lc_all, null);

// 返回值就是當前區域狀態的字串。

當然你可以不還原,因為只是簡單粗暴的方式。

直面問題型

開啟 osgdb 下的 fstream.cpp 在開頭的地方有:

#ifdef osg_use_utf8_filename

#define osgdb_convert_utf8_filename(s) convertutf8toutf16(s).c_str()

#else

#define osgdb_convert_utf8_filename(s) convertutf8toutf16(convertstringfromcurrentcodepagetoutf8(s)).c_str()

#endif

紅色部分原來為 s,修改後就能正確識別中文路徑了。(前提是你沒有啟用 osg_use_utf8_filename 這個巨集;啟用它會讓問題更複雜,甚至工程編碼混亂。)

令人疑惑的是原來的 s 並沒有任何語法問題,為什麼會出錯?修改後只是精確了字符集,並非是必要的。不清楚在其他系統下有沒有這樣的問題。

中文輸入法

這個話題很複雜,牽扯很多問題,有時間慢慢寫吧。

windows 輸入法

qt 內 gui 輸入支援

轉於

中文亂碼解決方案

前言 亂碼問題,一直使我們頭疼的問題。今天自己有空好好研究一番。不求太深入,只求只知皮毛。考慮不夠全面,只求給您一點幫助足矣。一 簡單介紹下pageencoding與contenttype的區別 摘自網上 pageencoding 設定jsp原始檔和響應正文中的字符集編碼。contenttype 設...

MYSQL中文亂碼解決方案

mysql資料庫存在著編碼問題,主要體現在資料庫裡漢字會出現亂碼,web頁面漢字顯示不正常。歸結起來只有乙個原因 會出現編碼的地方存在編碼不一致。web開發中 mysql編碼主要會出現在五個地方 1.mysql安裝的預設編碼 latin1 在mysql.ini mysql安裝根目錄下 中設定。mys...

POST中文亂碼解決方案

以前,我都是自己編寫乙個filter,來實現編碼,如下 public class characterencodingfilter implements filter override public void dofilter servletrequest request,servletrespons...