青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 96  文章 - 255  trackbacks - 0
<2008年3月>
2425262728291
2345678
9101112131415
16171819202122
23242526272829
303112345

E-mail:zbln426@163.com QQ:85132383 長期尋找對戰(zhàn)略游戲感興趣的合作伙伴。

常用鏈接

留言簿(21)

隨筆分類

隨筆檔案

SDL相關(guān)網(wǎng)站

我的個人網(wǎng)頁

我的小游戲

資源下載

搜索

  •  

積分與排名

  • 積分 - 495368
  • 排名 - 39

最新評論

閱讀排行榜

評論排行榜

作者:龍飛

4.1:為什么iconv不能完全正確的轉(zhuǎn)換Unicode?

        我不是先知,教程里面是整理過的思路和邏輯順序,在我研究這個問題的時候,頭緒遠遠比教程里面亂得多。我完全是從Wesnoth的源代碼去分析問題的,所以,為什么會扯上UTF-8和FriBidi,那也是因為在源代碼中找到了線索。
        iconv不能完全正確的獲得Unicode,也就是我們剛才遇到的純漢字轉(zhuǎn)換沒問題,而有英文就不行了。我并不清楚這是win32下的問題,還是在Linux下也這樣,我也不清楚具體的算法和問題的根本原因,我只是通過試驗得到一個算是表面原因的結(jié)論:我們知道,GB2312和Unicode漢字都使用2個字節(jié)(在UTF-8中是3個字節(jié)),英文和數(shù)字等用1個字節(jié)。iconv在得到兩個字節(jié)(unsigned char即一個字節(jié)大小)代碼的時候可以正確的將GB2312轉(zhuǎn)化為Unicode(或者UTF-8),但是只有1個字節(jié)的時候則在轉(zhuǎn)化Unicode的時候終止了,幸運的是,如果是轉(zhuǎn)化為UTF-8則可以正確的進行,并且也轉(zhuǎn)化為1個字節(jié)的UTF-8(只限于英文,數(shù)字等)。
        所以,我們可以先通過iconv將原來的GB2312轉(zhuǎn)化為UTF-8——漢字用3個字節(jié)(3個單位的unsigned char),英文、數(shù)字和基本符號用1個字節(jié)(1個單位的unsigned char)。然后,我們需要一個函數(shù),將這種形式的UTF-8轉(zhuǎn)換為SDL所需要的Uint16的Unicode。什么樣的函數(shù)可以實現(xiàn)這種轉(zhuǎn)換呢?

4.2:其它編碼與Unicode之間的雙向轉(zhuǎn)換,GNU FriBidi
http://fribidi.freedesktop.org/wiki/
        FriBidi是一個致力于Unicode編碼與其它編碼相互轉(zhuǎn)換的開源項目,到目前為止,還是一個尚未完成的項目。我在研究Wesnoth源代碼的時候看到這樣的函數(shù):fribidi_utf8_to_unicode(),所以,我想在這個函數(shù)中可能應(yīng)該包含UTF-8到Unicode的算法——希望不要太復(fù)雜。在FriBidi項目中找到這個函數(shù),它在文件fribidi_char_sets_utf8.c下面:

int
fribidi_utf8_to_unicode (
char *s, int len, FriBidiChar *us)
/* warning: the length of input string may exceed the length of the output */
{
  
int length;
  
char *= s;

  length 
= 0;
  
while (s - t < len)
    {
      
if (*(unsigned char *) s <= 0x7f)    /* one byte */
    {
      
*us++ = *s++;        /* expand with 0s */
    }
      
else if (*(unsigned char *) s <= 0xdf)    /* 2 byte */
    {
      
*us++ =
        ((
*(unsigned char *) s & 0x1f<< 6+
        ((
*(unsigned char *) (s + 1)) & 0x3f);
      s 
+= 2;
    }
      
else            /* 3 byte */
    {
      
*us++ =
        ((
int) (*(unsigned char *) s & 0x0f<< 12+
        ((
*(unsigned char *) (s + 1& 0x3f<< 6+
        (
*(unsigned char *) (s + 2& 0x3f);
      s 
+= 3;
    }
      length
++;
    }
  
*us = 0;
  
return (length);
}
其中,我們找到FriBidiChar的定義,類似Uint32的類型;另外,函數(shù)用char表示1字節(jié)的單位。根據(jù)我的試驗,至少在VC2008下是有錯誤的,我們一直用的是unsigned char表示1字節(jié)的單位,所以,我們需要對這個函數(shù)做些修改:
int myUTF8_to_UNICODE(Uint16* unicode, unsigned char* utf8, int len)
{
    
int length;
    unsigned 
char* t = utf8;

    length 
= 0;
    
while (utf8 - t < len){
        
//one byte.ASCII as a, b, c, 1, 2, 3 ect
        if ( *(unsigned char *) utf8 <= 0x7f ) {
            
//expand with 0s.
            *unicode++ = *utf8++;
        }
        
//2 byte.
        else if ( *(unsigned char *) utf8 <= 0xdf ) {
            
*unicode++ = ((*(unsigned char *) utf8 & 0x1f<< 6+ ((*(unsigned char *) (utf8 + 1)) & 0x3f);
            utf8 
+= 2;
        }
        
//3 byte.Chinese may use 3 byte.
        else {
            
*unicode++ = ((int) (*(unsigned char *) utf8 & 0x0f<< 12+
                ((
*(unsigned char *) (utf8 + 1& 0x3f<< 6+
                (
*(unsigned char *) (utf8 + 2& 0x3f);
            utf8 
+= 3;
        }
        length
++;
    }

    
*unicode = 0;
    
    
return (length);
}

4.3:將漢字,英文,數(shù)字和符號都正確的轉(zhuǎn)換為16位的Unicode

        有了iconv和上面這個函數(shù),我們終于可以將GB2312的編碼正確的轉(zhuǎn)換為Unicode了。
//FileName: gb2312_to_Unicode.h
#ifndef GB2312_TO_UNICODE_H_
#define GB2312_TO_UNICODE_H_

#include 
<iostream>
#include 
<vector>
#include 
"GNU/iconv.h"
#include 
"SDL/SDL.h"

std::vector
<Uint16> getUnicode(const std::string& str);

#endif
實現(xiàn)文件中包含我們上面寫的從UTF-8到Unicode的函數(shù):
#include "gb2312_to_Unicode.h"

int myUTF8_to_UNICODE(Uint16* unicode, unsigned char* utf8, int len);

std::vector
<Uint16> getUnicode(const std::string& str)
{
    
const int CHAR_SIZE = 256;
    
//GB2312 src
    const unsigned char* src = (const unsigned char*)(str.c_str());
    size_t src_len 
= strlen((char*)src);
    
//Unicode dst to get
    unsigned char dst[CHAR_SIZE] = {0};
    size_t dst_len 
= sizeof(dst);
    
//iconv arg
    const unsigned char* in = src;
    unsigned 
char* out = dst;

    iconv_t cd;
    
//GB2312 to UTF-8
    cd = iconv_open("UTF-8""GB2312");
    
if ((iconv_t)-1 == cd){
        exit (
-1);
    }
    
//conversion
    iconv(cd, (const char**)&in&src_len, (char**)&out&dst_len);

    
//UTF-8 to Unicode
    int utf8Len = strlen((char*)dst);
    Uint16 unicodeData[CHAR_SIZE] 
= {0};
    
int unicodeLen = myUTF8_to_UNICODE(unicodeData, dst, utf8Len);
    std::vector
<Uint16> unicodeVectorArray;
    
for (int i = 0; i < unicodeLen; i++) {
        unicodeVectorArray.push_back(unicodeData[i]);
    }
    
    iconv_close(cd); 
    
return unicodeVectorArray;
}
函數(shù)把一個std::string轉(zhuǎn)換位Uint16的vector數(shù)組并返回,這正是SDL所需要的Unicode格式。
posted on 2008-03-31 11:00 lf426 閱讀(5554) 評論(0)  編輯 收藏 引用 所屬分類: SDL入門教程跨平臺與GNU
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲一区免费| 欧美一级视频精品观看| 亚洲一区二区三区四区五区午夜 | 欧美日韩三区四区| 欧美日韩aaaaa| 国产精品99免费看 | 亚洲国产高清aⅴ视频| 欧美成人中文字幕在线| 亚洲电影免费观看高清完整版在线 | 久久精品九九| 欧美专区日韩专区| 狠狠色综合播放一区二区 | 一区二区三区日韩| 午夜精品久久久久久久男人的天堂| 欧美一区二区三区四区在线观看 | 亚洲中无吗在线| 久久久免费观看视频| 欧美精品在线极品| 国产午夜精品福利| 亚洲日本中文字幕| 久久国产高清| 91久久精品国产91久久性色tv| 这里是久久伊人| 久久久五月婷婷| 国产精品每日更新| 91久久午夜| 久久精品国产一区二区电影| 欧美黑人在线观看| 性8sex亚洲区入口| 欧美视频在线免费看| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲一区二区免费在线| 欧美成人日韩| 性做久久久久久久久| 欧美少妇一区二区| 亚洲精品乱码久久久久久| 欧美在线一二三区| 99国产精品视频免费观看一公开 | 久久久久久**毛片大全| 99精品国产热久久91蜜凸| 麻豆免费精品视频| 好吊妞**欧美| 久久精品欧美| 亚洲主播在线| 国产精品久久久久久久浪潮网站| 99国产欧美久久久精品| 亚洲福利在线观看| 麻豆精品传媒视频| 亚洲电影视频在线| 蜜桃久久精品乱码一区二区| 欧美亚洲一区二区在线| 国产精品自拍网站| 午夜精品久久久久久久99水蜜桃 | 另类成人小视频在线| 国内精品伊人久久久久av影院 | 免费观看久久久4p| 亚洲麻豆av| 亚洲男人第一av网站| 女同一区二区| 亚洲黄色在线观看| 久久综合色播五月| 久久久伊人欧美| 伊人成人在线视频| 免费不卡在线观看| 噜噜爱69成人精品| 亚洲狼人综合| 99热在这里有精品免费| 国产精品久久久久av免费| 亚洲欧美精品一区| 欧美亚洲日本国产| 国内久久婷婷综合| 亚洲二区三区四区| 欧美日韩精品一区二区| 一区二区三区精品| 亚洲视频一区二区| 国产亚洲成av人在线观看导航| 久久九九精品| 巨乳诱惑日韩免费av| 亚洲免费电影在线观看| 一区二区三区国产在线观看| 国产视频一区二区在线观看 | 久久综合久久综合这里只有精品| 久久久久欧美| 亚洲美女黄网| 亚洲欧美三级在线| 亚洲国产日韩一区二区| 亚洲精品一区二区网址| 国产日韩欧美高清免费| 欧美激情女人20p| 国产精品yjizz| 玖玖国产精品视频| 欧美精品一级| 久久久不卡网国产精品一区| 欧美激情久久久久久| 午夜免费久久久久| 久久精品视频在线观看| 宅男噜噜噜66国产日韩在线观看| 欧美一区二区三区另类 | 国产精品99久久不卡二区| 午夜伦理片一区| 亚洲国产小视频在线观看| 亚洲伊人观看| 99成人在线| 欧美在线国产| 亚洲一品av免费观看| 久色成人在线| 久久超碰97中文字幕| 欧美激情免费观看| 美女精品一区| 国产综合色产| 亚洲欧美日韩一区二区三区在线| 亚洲国产一区二区a毛片| 欧美一级片在线播放| 亚洲自拍偷拍色片视频| 欧美精品久久天天躁| 模特精品在线| 国产一区二区按摩在线观看| 欧美日韩国产bt| 亚洲一区二区免费看| 亚洲国产国产亚洲一二三| 亚洲一区二区三区高清 | 亚洲精品视频一区二区三区| 伊人久久大香线| 欧美一级久久| 欧美一区二区播放| 国产精品成人观看视频免费| 最新国产成人在线观看| 1000部国产精品成人观看| 久久成人免费日本黄色| 久久成人免费电影| 国产日韩欧美在线视频观看| 亚洲视屏在线播放| 午夜精品久久久久久久久久久 | 欧美国产一区二区| 亚洲第一精品夜夜躁人人躁| 在线观看视频一区| 久久久人人人| 欧美大片免费观看在线观看网站推荐| 国内外成人免费激情在线视频网站 | 亚洲欧美日韩在线综合| 国产精品高潮呻吟久久| 日韩午夜在线视频| 一区二区三区日韩在线观看| 欧美日韩hd| 亚洲视频在线一区| 久久疯狂做爰流白浆xx| 国自产拍偷拍福利精品免费一| 久久精品91久久久久久再现| 久久亚洲高清| 91久久久久久国产精品| 欧美日韩日日夜夜| 亚洲私人影院| 久久婷婷麻豆| 亚洲靠逼com| 国产精品区二区三区日本| 午夜视频精品| 欧美成人在线免费观看| 亚洲一区二区av电影| 国产精品无码永久免费888| 欧美在线视频播放| 亚洲高清免费在线| 亚洲伊人久久综合| 国产一区二区三区在线观看免费视频| 久久久久久久精| 日韩视频在线一区二区三区| 性欧美大战久久久久久久久| 伊人影院久久| 欧美日韩中文字幕在线视频| 欧美一区二区三区日韩视频| 亚洲国产精品传媒在线观看 | 亚洲宅男天堂在线观看无病毒| 久久久久久久高潮| 亚洲另类春色国产| 国产目拍亚洲精品99久久精品| 久久亚洲私人国产精品va| 99ri日韩精品视频| 亚洲一二三级电影| 噜噜爱69成人精品| 亚洲区一区二区三区| 午夜精品成人在线| 亚洲国产专区| 国产欧美精品国产国产专区| 欧美大片91| 欧美一区二区三区播放老司机| 亚洲欧洲三级电影| 久久亚洲捆绑美女| 欧美亚洲一区| 在线亚洲美日韩| 亚洲国产精品免费| 国产一区二区三区自拍| 国产精品wwwwww| 欧美韩日精品| 快播亚洲色图| 久久av最新网址| 亚洲综合好骚| 一级成人国产| 99re66热这里只有精品3直播| 免费人成精品欧美精品| 久久av资源网站| 性高湖久久久久久久久|