C++中国語文字処理

47950 ワード

文書ディレクトリ
  • 一、中国語文字列
  • 二、c++いくつかの符号化前の変換
  • 一、中国語文字列
  • 問題の出所:中国語の文字の長さは固定されていないで、バイトの処理によって往々にして文字化けしたり、誤って分割したりします.unicodeでは中国語ごとに2バイトですが、中国語の間に挟まれた英語と半角句読点は依然として1バイトです.
  • ソリューション:入力層、論理処理層、出力層の3つの論理構造を構築します.–入力レイヤはchar入力を受信し、wcharに変換します.論理処理レイヤはwchar*またはwstringに基づいて文字列操作を行います.この場合、操作の最小単位は中国語文字で、文字化けしはありません.–出力レイヤはwcharの結果を再びcharに変換し,外部に返す.このように、外部にとっては入力char*であり、出力char*であるが、この過程で漢字を分割する操作や文字化けしはない.
  • #include 
    #include 
    using namespace std;
    
    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;
    
    }
    
    int wputs(const wchar_t * wstr);
    
    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;
    
    }
    
    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 main()
    
    {
    
        //   :  char*  ,      wchar*
    
        string input = "      !!";
    
        string temp = " ";
    
        //    whcar* wstring           ,             ,      。
    
        wstring buff = str2wstr(input);
    
        wstring temp_buff = str2wstr(temp);
    
        cout << "input     :"<<wcslen(buff.c_str()) << "   temp     :" << wcslen(temp_buff.c_str()) << endl;
    
        cout << "  input      ' ':" << (buff[3] == temp_buff[0]) << endl;;
    
        //    wchar*        char*,     
    
        wputs(buff);
    
        return 0;
    
    }
    

    二、c++いくつかの符号化前の変換
    .h
    #pragma once  
    #include "stdafx.h"  
    #include "windows.h"  
    #include   
    #include   
    using namespace std;  
      
    //**************string******************//  
    // ASCII Unicode    
    wstring AsciiToUnicode(const string& str);  
    string  UnicodeToAscii(const wstring& wstr);  
    // UTF8 Unicode    
    wstring Utf8ToUnicode(const string& str);  
    string  UnicodeToUtf8(const wstring& wstr);  
    // ASCII UTF8    
    string  AsciiToUtf8(const string& str);  
    string  Utf8ToAscii(const string& str);  
    //**************CString******************//  
    // ASCII Unicode    
    CStringW    AsciiToUnicode_CSTR(const CStringA& str);  
    CStringA    UnicodeToAscii_CSTR(const CStringW& wstr);  
    // UTF8 Unicode    
    CStringW    Utf8ToUnicode_CSTR(const CStringA& str);  
    CStringA    UnicodeToUtf8_CSTR(const CStringW& wstr);  
    // ASCII UTF8    
    CStringA    AsciiToUtf8_CSTR(const CStringA& str);  
    CStringA    Utf8ToAscii_CSTR(const CStringA& str);  
    /************string-int***************/  
    // string   Int  
    int StringToInt(const string& str);  
    string IntToString(int i);  
    string IntToString(char i);  
    string IntToString(double i);  
    

    .cpp
    #pragma once  
    #include "stdafx.h"  
    #include "UTN.h"  
      
    wstring AsciiToUnicode(const string& str) {  
        //   -              
        int unicodeLen = MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, nullptr, 0);  
        //                    
        wchar_t *pUnicode = (wchar_t*)malloc(sizeof(wchar_t)*unicodeLen);  
        //               
        MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, pUnicode, unicodeLen);  
        wstring ret_str = pUnicode;  
        free(pUnicode);  
        return ret_str;  
    }  
    string UnicodeToAscii(const wstring& wstr) {  
        //   -              
        int ansiiLen = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, nullptr, 0, nullptr, nullptr);  
        //                    
        char *pAssii = (char*)malloc(sizeof(char)*ansiiLen);  
        //               
        WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, pAssii, ansiiLen, nullptr, nullptr);  
        string ret_str = pAssii;  
        free(pAssii);  
        return ret_str;  
    }  
    wstring Utf8ToUnicode(const string& str) {  
        //   -              
        int unicodeLen = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, nullptr, 0);  
        //                    
        wchar_t *pUnicode = (wchar_t*)malloc(sizeof(wchar_t)*unicodeLen);  
        //               
        MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, pUnicode, unicodeLen);  
        wstring ret_str = pUnicode;  
        free(pUnicode);  
        return ret_str;  
    }  
    string UnicodeToUtf8(const wstring& wstr) {  
        //   -              
        int ansiiLen = WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, nullptr, 0, nullptr, nullptr);  
        //                    
        char *pAssii = (char*)malloc(sizeof(char)*ansiiLen);  
        //               
        WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, pAssii, ansiiLen, nullptr, nullptr);  
        string ret_str = pAssii;  
        free(pAssii);  
        return ret_str;  
    }  
    string AsciiToUtf8(const string& str) {  
        return UnicodeToUtf8(AsciiToUnicode(str));  
    }  
    string Utf8ToAscii(const string& str) {  
        return UnicodeToAscii(Utf8ToUnicode(str));  
    }  
    // ASCII Unicode    
    CStringW    AsciiToUnicode_CSTR(const CStringA& str) {  
        return AsciiToUnicode(LPCSTR(str)).c_str();  
    }  
    CStringA    UnicodeToAscii_CSTR(const CStringW& wstr) {  
        return UnicodeToAscii(LPCWSTR(wstr)).c_str();  
    }  
    // UTF8 Unicode    
    CStringW    Utf8ToUnicode_CSTR(const CStringA& str) {  
        return Utf8ToUnicode(LPCSTR(str)).c_str();  
    }  
    CStringA    UnicodeToUtf8_CSTR(const CStringW& wstr) {  
        return UnicodeToUtf8(LPCWSTR(wstr)).c_str();  
    }  
    // ASCII UTF8    
    CStringA    AsciiToUtf8_CSTR(const CStringA& str) {  
        return UnicodeToUtf8_CSTR(AsciiToUnicode_CSTR(str));  
    }  
    CStringA    Utf8ToAscii_CSTR(const CStringA& str) {  
        return UnicodeToAscii_CSTR(Utf8ToUnicode_CSTR(str));  
    }  
    // string   Int     
    int StringToInt(const string& str) {  
        return atoi(str.c_str());  
    }  
    string IntToString(int i) {  
        char ch[1024];  
        memset(ch, 0, 1024);  
        sprintf_s(ch, sizeof(ch), "%d", i);  
        return ch;  
    }  
    string IntToString(char i) {  
        char ch[1024];  
        memset(ch, 0, 1024);  
        sprintf_s(ch, sizeof(ch), "%c", i);  
        return ch;  
    }  
    string IntToString(double i) {  
        char ch[1024];  
        memset(ch, 0, 1024);  
        sprintf_s(ch, sizeof(ch), "%f", i);  
        return ch;  
    }