2-Windows程式設計 -Unicode

httpcc發表於2021-11-22

  Unicode字符集和ASCII碼字符集

    

 

              

 

 

    下面是程式碼示例: ASCII碼字符集      Unicode字符集     通用版本字符集

       程式1

#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>
#include <tchar.h>

/* ASCII碼字符集   雙位元組字符集   多位元組字符集 */
//int main()
//{
//    char c = 'A';  //char是一個位元組
//    char *str = "日本";  //不推薦使用,容易發生亂碼,實際上還是ASCII字元
//    int i;
//    i =  strlen(str);
//    printf("%c\n", c);
//    printf("%s\n", str);
//    printf("%d\n", i);
//    return 0;
//}

/* Unicode寬字符集 */
//int main()
//{
//    wchar_t c = L'中';   //寬字元,Unicode,兩個位元組
//    wchar_t str[] =L"中國";
//    int i;
//    setlocale(LC_ALL,"chs");   //若是Unicode必須設定本地區域語言中文
//    i = wcslen(str);
//    wprintf(L"%lc\n", c);
//    wprintf(L"%ls\n", str);
//    wprintf(L"%d\n", i);
//}


//通用的型別、函式
int main()
{
    //char c;
    //wchar_t c;
    //CHAR c;
    //WCHAR c;
    TCHAR str[] = _T("印度");
    //setlocale(LC_ALL, "chs"); //若是Unicode字符集必須設定本地區域語言中文
    _tprintf(_TEXT("%s\n"), str);
    return 0;

}

    

    程式2  windows 通用函式

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInsance,
                    PSTR szCmdLine, int iCmdShow)
{
    TCHAR  *content= TEXT("hello 通用 中國 tchar");
    TCHAR  *title = TEXT("標題 通用 中國 tchar");

    MessageBoxA(NULL, "hello ASCII 中國", "ASCII 標題", MB_YESNO | MB_ICONINFORMATION);
    MessageBoxW(NULL, L"hello Unicode 中國", L"Unicode 標題", MB_YESNO | MB_ICONINFORMATION);
    MessageBox(NULL, TEXT("hello 通用 中國"), TEXT("通用 標題"), MB_YESNO | MB_ICONINFORMATION);
    MessageBox(NULL, content, title, MB_YESNO | MB_ICONINFORMATION);
}

                  

 

                  

 

     程式3 C語言標準函式

#include <stdio.h>
#include <stdarg.h>

int my_printf(const char *szFormat, ...)
{
    int iReturn;
    va_list pArgs;  // 標頭檔案定義 typedef char* va_list;

    va_start(pArgs, szFormat);   //指向 szFormat 的下一個引數

    //返回值 傳入的元素的個數
    iReturn = vprintf(szFormat, pArgs);  //pArgs  指向陣列的第一個指標

    va_end(pArgs);

    return iReturn;
}



//標準的C
int main()
{
    int i = 1;
    char szBuffer[100];
    int x=100, y=200, z=300;

    //會呼叫vprintf  
    printf("hello =  %d,%d,%d\n", x, y, z);   //傳入的引數是靈活多變的,上面的函式模仿
    
    my_printf("%d,%d\n", x, y);

    sprintf(szBuffer, "不安全的Hello %d\n", i);   //如果存的值很大就會佔用後面的記憶體區
    printf(szBuffer);

    _snprintf(szBuffer, 100, "安全的Hello %d\n", i); //擷取到50後就不在使用
    puts(szBuffer);

    printf("hello %d\n", i);
    return 0;
}

   

 

    程式4 windows函式

#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <locale.h>

//最後一個程式 使用 Unicode 字符集  顯示亂碼,未找到原因。

//ASCII字符集 版本
//int WINAPI WinMain(HINSTANCE hInstance,
//                    HINSTANCE hPrevInstance,
//                    PSTR szCmdLine,
//                    int iCmdShow
//                    )
//{
//    int i = 5;
//    char szBuffer[50];
//
//    //sprintf(szBuffer, "Hello %d\n", i);   //不安全標準的C語言函式,無法處理Unicode字符集
//    _snprintf(szBuffer,50, "安全的:Hello %d\n", i);   //安全標準的C語言函式,無法處理Unicode字符集
//
//    MessageBoxA(NULL, szBuffer, "ASCII版本", MB_YESNO | MB_ICONINFORMATION);
//    return 0;
//}



//Unicode字符集 版本
//int WINAPI WinMain(HINSTANCE hInstance,
//                    HINSTANCE hPrevInstance,
//                    PSTR szCmdLine,
//                    int iCmdShow
//                    )
//{
//    int i = 5;
//    wchar_t szBuffer[50];   //WCHAR
//
//    //swprintf(szBuffer,50, L"Hello %d\n", i); //不安全
//    _snwprintf(szBuffer, 50, L"安全的:Hello %d\n", i); //安全的
//
//    MessageBoxW(NULL, szBuffer, L"Unicode版本", MB_YESNO | MB_ICONINFORMATION);
//    return 0;
//}


//通用 版本
//int WINAPI WinMain(HINSTANCE hInstance,
//                    HINSTANCE hPrevInstance,
//                    PSTR szCmdLine,
//                    int iCmdShow
//                    )
//{
//    int i = 5;
//    TCHAR szBuffer[50];
//
////    _stprintf(szBuffer, TEXT("Hello %d\n"), i);  
//    _sntprintf(szBuffer,50, TEXT("安全的:Hello %d\n"), i);  //安全的
//
//    MessageBox(NULL, szBuffer, TEXT("通用版本"), MB_YESNO | MB_ICONINFORMATION);
//    return 0;
//}

int CDECL MessageBoxPrintf(TCHAR *szCaption,TCHAR *szFormat,...)
{
    TCHAR szBuffer[1024]; //定義字元陣列

    va_list pArgList;

    va_start(pArgList, szFormat);

    //把szFormat放在szBuffer字元陣列中
    _vsnprintf(szBuffer, sizeof(szBuffer) / sizeof(TCHAR), szFormat, pArgList);

    va_end(pArgList);

    return MessageBox(NULL, szBuffer, szCaption,MB_YESNO | MB_ICONINFORMATION);
}


int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    PSTR szCmdLine,
    int iCmdShow
)
{
    int x = 101,y = 201,z = 301;
    int cxScreen, cyScreen;


    cxScreen = GetSystemMetrics(SM_CXSCREEN);   //獲取電腦螢幕寬度
    cyScreen = GetSystemMetrics(SM_CYSCREEN);   //獲取電腦螢幕高度

    MessageBoxPrintf(TEXT("標題"), TEXT("Hello %d,%d,%d\n"), x,y,z);
    MessageBoxPrintf(TEXT("我的螢幕"), TEXT("螢幕寬度:%dpx,高度:%dpx"), cxScreen, cyScreen);

    return 0;
}

 

相關文章