c++ 中文字串處理方法

來源:互聯網
上載者:User

C++處理中文的問題困擾我很久了。之前一旦遇到中文基本就投諸java懷抱了。

今天看到一個漂亮的c++程式,遂豁然開朗。總結一下分享給大家:

 

問題描述:

c++ 中 char*/string 形式的字串無法正確的對中文字串進行處理(如 find, strlen, substr 等常規操作) 。

比如當你在char* 中 find 英文逗號時,有可能匹配的不只是逗號,還找到了某個漢字的一個位元組,而你無法在char*中區分它們。

 

問題原因:

中文字元長度不固定,按位元組處理往往出現亂碼或錯誤分割。在unicode中每個中文為2個位元組,而中文中間夾雜的英文和半形標點則仍然是1個位元組。

 

解決方案:

構造三層邏輯結構:輸入層、邏輯處理層、輸出層。

   -- 輸入層接收char*輸入,並將其轉換為wchar*.

   -- 邏輯處理層在 wchar* 或 wstring 的基礎上進行字串操作,此時操作最小單位為中文字元,不會再有亂碼。

   -- 輸出層將wchar*的結果再次轉換為char* ,返回給外部。

這樣,對外部來說,仍然是輸入char*, 輸出char*, 但在這個過程中不再有分割漢字的操作或亂碼。

 

核心轉碼:

#include<wchar.h>

 

wchar_t * MBCS2Unicode(wchar_t * buff, const char * str)

{

    wchar_t * wp = buff;

    char * p = (char *)str;

    while(*p)

{

        if(*p & 0x80)

{

            *wp = *(wchar_t *)p;

            p++;

        }

        else{

            *wp = (wchar_t) *p;

        }

        wp++;

        p++;

    }

    *wp = 0x0000;

    return buff;

}

 

char * Unicode2MBCS(char * buff, const wchar_t * str)

{

    wchar_t * wp = (wchar_t *)str;

    char * p = buff, * tmp;

    while(*wp){

        tmp = (char *)wp;

        if(*wp & 0xFF00){

            *p = *tmp;

            p++;tmp++;

            *p = *tmp;

            p++;

        }

        else{

            *p = *tmp;

            p++;

        }

        wp++;

    }

    *p = 0x00;

    return buff;

}

 

wstring str2wstr(string str)

{

    size_t len = str.size();

    wchar_t * b = (wchar_t *)malloc((len+1)*sizeof(wchar_t));

    MBCS2Unicode(b,str.c_str());

    wstring r(b);

    free(b);

    return r;

}

 

string wstr2str(wstring wstr)

{

    size_t len = wstr.size();

    char * b = (char *)malloc((2*len+1)*sizeof(char));

    Unicode2MBCS(b,wstr.c_str());

    string r(b);

    free(b);

    return r;

}

 

int wputs(wstring wstr)

{

    wputs(wstr.c_str());

    return 0;

}

 

int wputs(const wchar_t * wstr)

{

    int len = wcslen(wstr);

    char * buff = (char *)malloc((len * 2 + 1)*sizeof(char));

    Unicode2MBCS(buff,wstr);

    printf("%s",buff);

    free(buff);

    return 0;

}

 =============================================

(另外大家關心的UTF8如何轉換,添加一段轉自End2012的UTF8--Unicode轉換程式)

wchar_t * UTF8ToUnicode( const char* str )

{

     int textlen ;

     wchar_t * result;

     textlen = MultiByteToWideChar( CP_UTF8, 0, str,-1, NULL,0 ); 

     result = (wchar_t *)malloc((textlen+1)*sizeof(wchar_t)); 

     memset(result,0,(textlen+1)*sizeof(wchar_t)); 

     MultiByteToWideChar(CP_UTF8, 0,str,-1,(LPWSTR)result,textlen ); 

     return result; 

}

char * UnicodeToUTF8( const wchar_t* str )

{

     char* result;

     int textlen;

     textlen = WideCharToMultiByte( CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL );

     result =(char *)malloc((textlen+1)*sizeof(char));

     memset(result, 0, sizeof(char) * ( textlen + 1 ) );

     WideCharToMultiByte( CP_UTF8, 0, str, -1, result, textlen, NULL, NULL );

     return result;

}

==========================================

原創帖,歡迎評論交流。轉載請註明出處。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.