c++原生的unicode支持
記一次字體輪廓提取遇到的問題
- 起因
- 解決
- 淺談字符串周邊
起因
在做一個激光打標系統,裏面不可避免的要用到圖形矢量化的問題,於是就是用freetype2 lib提取字體輪廓數學模型,基本步驟是:
較爲重要的一步就是找到字符對應的編碼值,在開始的試驗中,代碼非常粗暴,比如:
int fontChar ='J';
這樣的代碼是木有運行錯誤的,但當我
int fontChar ='及';
就出事了,得到的返回值是一個210556。後續的工作也全部發生錯誤
解決
查閱了相關資料,得知unicode編碼是一種雙字節(16位)的編碼,比如字符’A’對應的ascii碼爲65,將65轉換爲16進制的16位數,0x0041,所以我們需要一個恰好爲16位的數據結構來存儲unicode碼,int沒有確定的位長,而且由於編譯器的優化,顯然不能得到正確的編碼值。
幸運的是,c++內建數據類型中包含 wchar_t用於專門定義unicode編碼值
wchar_t fontChar = '及';
qDebug() << fontChar <<"jjjjjjjjjjjjjjjjjjjjjjjjj";
輸出是:
>
36746 jjjjjjjjjjjjjjjjjjjjjjjjj
我們這是看看’及’的unicode碼是多少,隨便百度一個unicode在線轉換,結果是\u53ca,換算成十進制是21450(十進制),和我們的輸出結果不一樣!但是後續的步驟卻又表明我們獲得的這個fontChar的值能正常工作,我想這可能與qDebug()的實現有關。但這樣讓人看起來不舒服!
wchar_t fontChar = L'及';
qDebug() << fontChar <<"jjjjjjjjjjjjjjjjjjjjjjjjj";
輸出是:
>
21450 jjjjjjjjjjjjjjjjjjjjjjjjj
這下輸出也正常了。
結論:當需要編碼值時,請使用wchar_t fontChar =L’及’;
淺談字符串周邊
由於各種標準及各種編譯器甚至不同的系統和語言設置均會對我們的字符(串)編碼造成影響,使用內建數據類型和相關宏要比我們耍一些技巧更容易避免錯誤。