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

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

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

常用鏈接

留言簿(21)

隨筆分類(lèi)

隨筆檔案

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

我的個(gè)人網(wǎng)頁(yè)

我的小游戲

資源下載

搜索

  •  

積分與排名

  • 積分 - 495350
  • 排名 - 39

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

作者:龍飛

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

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

4.2:其它編碼與Unicode之間的雙向轉(zhuǎn)換,GNU FriBidi
http://fribidi.freedesktop.org/wiki/
        FriBidi是一個(gè)致力于Unicode編碼與其它編碼相互轉(zhuǎn)換的開(kāi)源項(xiàng)目,到目前為止,還是一個(gè)尚未完成的項(xiàng)目。我在研究Wesnoth源代碼的時(shí)候看到這樣的函數(shù):fribidi_utf8_to_unicode(),所以,我想在這個(gè)函數(shù)中可能應(yīng)該包含UTF-8到Unicode的算法——希望不要太復(fù)雜。在FriBidi項(xiàng)目中找到這個(gè)函數(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的定義,類(lèi)似Uint32的類(lèi)型;另外,函數(shù)用char表示1字節(jié)的單位。根據(jù)我的試驗(yàn),至少在VC2008下是有錯(cuò)誤的,我們一直用的是unsigned char表示1字節(jié)的單位,所以,我們需要對(duì)這個(gè)函數(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ù)字和符號(hào)都正確的轉(zhuǎn)換為16位的Unicode

        有了iconv和上面這個(gè)函數(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
實(shí)現(xiàn)文件中包含我們上面寫(xiě)的從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ù)把一個(gè)std::string轉(zhuǎn)換位Uint16的vector數(shù)組并返回,這正是SDL所需要的Unicode格式。
posted on 2008-03-31 11:00 lf426 閱讀(5554) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): SDL入門(mén)教程 、跨平臺(tái)與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>
            久久av一区二区三区漫画| 久久国产视频网| 亚洲欧美日韩一区二区三区在线观看 | 99这里只有久久精品视频| 欧美一区二区三区的| 亚洲欧洲精品一区二区三区| 久久一区二区精品| 亚洲深夜福利网站| 欧美亚一区二区| 久久久久久久91| 欧美在线观看一区| 噜噜噜在线观看免费视频日韩| 亚洲精品护士| 亚洲天堂激情| 另类国产ts人妖高潮视频| 欧美一区二区三区啪啪| 亚洲免费小视频| 亚洲精品五月天| 欧美专区在线播放| 亚洲免费在线观看视频| 亚洲午夜在线视频| 亚洲欧洲一区二区在线播放| 欧美国内亚洲| 小处雏高清一区二区三区| 亚洲色诱最新| 久久久精品免费视频| 久久久精品日韩| 猫咪成人在线观看| 欧美日韩在线大尺度| 国产精品天天摸av网| 国产曰批免费观看久久久| 国产日韩精品一区二区浪潮av| 国产日韩欧美在线看| 亚洲二区视频| 欧美一区二区高清| 亚洲大胆视频| 欧美在线一二三区| 欧美特黄一区| 亚洲无玛一区| 亚洲精品国产拍免费91在线| 亚洲欧美日韩另类| 欧美日韩成人精品| 亚洲国产一成人久久精品| 久久九九精品| 久久狠狠亚洲综合| 久久精品视频在线| 亚洲美女免费视频| 欧美性jizz18性欧美| 最新69国产成人精品视频免费 | 亚洲人成网站色ww在线| 欧美精品国产精品日韩精品| 在线性视频日韩欧美| 夜夜爽www精品| 国产精品久久精品日日| 影音先锋日韩有码| 欧美国产欧美亚洲国产日韩mv天天看完整| 日韩视频中文字幕| 国产精品欧美精品| 一区二区三区四区五区视频| 亚洲一级免费视频| 怡红院精品视频| 中文精品在线| 亚洲国产小视频| 久久成人资源| 亚洲综合视频一区| 久久综合狠狠综合久久综合88| 99成人在线| 久久久久久久国产| 激情欧美日韩| 香蕉国产精品偷在线观看不卡 | 亚洲伦理在线免费看| 国产农村妇女毛片精品久久麻豆 | 亚洲性视频网址| 欧美一级片久久久久久久| 国产精品综合久久久| 欧美激情第三页| 国产一区二区视频在线观看| 亚洲精品免费在线| 亚洲国产精品va| 亚洲视频第一页| 99re热精品| 欧美伦理在线观看| 亚洲精品视频免费在线观看| 亚洲第一福利视频| 久久青草欧美一区二区三区| 久久精品盗摄| 国产精品欧美在线| 亚洲综合色婷婷| 久久精品亚洲| 欧美深夜影院| 一区二区三区欧美日韩| 亚洲你懂的在线视频| 国产精品电影网站| 亚洲资源在线观看| 老巨人导航500精品| 91久久午夜| 欧美久久久久中文字幕| 亚洲精品综合| 欧美一区久久| 亚洲国产欧美久久| 欧美亚州韩日在线看免费版国语版| 在线视频你懂得一区二区三区| 午夜精品短视频| 亚洲精选91| 国产视频在线观看一区二区| 亚洲免费观看在线观看| 欧美在线视频在线播放完整版免费观看| 韩国精品一区二区三区| 欧美激情视频免费观看| 欧美一区二区三区视频在线观看| 欧美成人久久| 国产一区美女| 欧美成人精品在线观看| 亚洲天堂av电影| 免费成人你懂的| 久久精品国产一区二区电影| 99国产一区| 亚洲精选大片| 亚洲人体一区| 伊人色综合久久天天| 国产一在线精品一区在线观看| 国产精品久久久久aaaa| 欧美伦理视频网站| 欧美日韩精品久久| 欧美四级在线观看| 欧美三日本三级少妇三2023| 久久久99国产精品免费| 久久九九精品| 欧美精品www| 国产精品国产一区二区| 久久久999精品视频| 免费久久99精品国产自| 免费观看在线综合色| 欧美成人黄色小视频| 国产精品v日韩精品| 国产精品一区二区三区四区五区| 欧美日韩亚洲一区二区三区四区 | 美女日韩在线中文字幕| 欧美精品一区二区在线观看| 欧美国产日韩视频| 国产欧美va欧美va香蕉在| 亚洲国产精品一区二区尤物区| 亚洲欧美日韩国产一区| 亚洲韩日在线| 欧美成人免费网| 日韩视频在线一区二区| 亚洲激情国产| 麻豆精品精品国产自在97香蕉| 极品少妇一区二区三区精品视频| 亚洲少妇诱惑| 激情久久五月| 久久综合一区二区| 久久久99国产精品免费| 亚洲国产精品成人久久综合一区| 久久精品官网| 亚洲精品乱码久久久久久黑人 | 亚洲国产女人aaa毛片在线| 欧美韩国在线| 国产精品第2页| 国产精品99久久久久久久vr | 亚洲欧美视频一区| 99av国产精品欲麻豆| 久久久久久久久久久久久女国产乱 | 欧美韩国在线| 久久精品国产清高在天天线| 你懂的一区二区| 久久精品五月| 国产精品美女久久| 欧美gay视频| 激情伊人五月天久久综合| 最新中文字幕一区二区三区| 国产主播一区| 在线视频欧美日韩精品| 亚洲国产欧美一区二区三区久久| 亚洲视频狠狠| 亚洲一区二区三区高清 | 亚洲视频在线观看| 亚洲久久一区| 久热精品在线视频| 久久伊人精品天天| 国产精品婷婷| 亚洲欧美日韩电影| 欧美在线视频免费观看| 国产精品有限公司| 午夜精彩国产免费不卡不顿大片| 欧美护士18xxxxhd| 性色av香蕉一区二区| 国产精品久久久久天堂| 亚洲欧美一区二区视频| 裸体一区二区| 一区二区三区国产盗摄| 欧美福利在线观看| 亚洲欧洲在线播放| 夜夜狂射影院欧美极品| 欧美精品粉嫩高潮一区二区| 一区二区欧美日韩视频| 久久国产一区二区三区| 伊人夜夜躁av伊人久久| 欧美精品一区在线播放| 一本色道久久加勒比精品|