utf-8 batch 檔命令列參數的錯誤

utf-8 batch 檔命令列參數的錯誤


結論:要使用命令列參數的 batch 檔不要做成 utf-8 的


或是


Win10記事本(Notepad)預設編碼UTF-8修改為ANSI

http://blog.udn.com/amisay168/128020244


用 Visual Studio 產生出來的 .h、.cpp、.c 等程式碼的文字檔,預設都是 ansi 的。如果在程式碼裡放個日文,預設存檔會變成 UTF8 BOM,以下程式是可以正常執行的


#include <iostream>

#include <windows.h>

using namespace std;


void PrintfUnicode(const wchar_t* szFormat, ...) //在 console 印出 Unicode

{

    const int MAX_PRINT_NUM = 1024;

    wchar_t szPrint[MAX_PRINT_NUM] = L"";

    va_list pArgs;

    va_start(pArgs, szFormat);

    vswprintf_s(szPrint, szFormat, pArgs);

    va_end(pArgs);


    WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), szPrint, (DWORD)wcslen(szPrint), NULL, NULL);

}


int main()

{

    wchar_t szPrint[512] = L"ハリー・ポッター";

    PrintfUnicode(L"%s\n", szPrint);

    system("pause");

    return 0;

}


但是下面針對命令列參數的研究是失敗的。









utf-8 batch 檔本身的字碼是沒有問題的,但不知道為什麼,傳進 exe 檔就會錯誤。


e4 = -28

b8 = -72

ad = -83

e6 = -26

96 = -106

87 = -121





#include <iostream>

using namespace std;

#include "K:\hklibrary\include\hkcommon.h"

#include "K:\hklibrary\include\filetxt.h"


int main(int argc, char* argv[])

{

cout << "argv[1]" << endl;

cout << (int)argv[1][0] << endl;

cout << (int)argv[1][1] << endl;

cout << (int)argv[1][2] << endl;

cout << (int)argv[1][3] << endl;

cout << (int)argv[1][4] << endl;

cout << (int)argv[1][5] << endl;

cout << (int)argv[1][6] << endl;

//cout << argv[2] << endl;


cout << endl;


wchar_t szUni[128] = L"";

char szBig51[128] = "";

strcpy_s(szBig51, 128, argv[1]);

szBig51[4] = -106;

szBig51[5] = -121;

szBig51[6] = 0;

hkstr::UTF8ToUnicode(szUni, szBig51);

hkstr::PrintfUnicode(szUni);

cout << endl;

cout << (int)szBig51[0] << endl;

cout << (int)szBig51[1] << endl;

cout << (int)szBig51[2] << endl;

cout << (int)szBig51[3] << endl;

cout << (int)szBig51[4] << endl;

cout << (int)szBig51[5] << endl;

cout << (int)szBig51[6] << endl;

cout << (int)szBig51[7] << endl;

cout << (int)szBig51[8] << endl;

cout << (int)szBig51[9] << endl;

/*cout << (int)szUni[0] << endl;

cout << (int)szUni[1] << endl;

cout << (int)szUni[2] << endl;

cout << (int)szUni[3] << endl;*/


cout << endl;


CAFileTxt txt3;

txt3.ReadFile("test_utf8.txt");

string str3 = txt3.GetLine(1);

wchar_t szUni3[128] = L"";

char szBig53[128] = "";

strcpy_s(szBig53, str3.c_str());

hkstr::UTF8ToUnicode(szUni3, str3.c_str());

hkstr::PrintfUnicode(szUni3);

cout << endl;

cout << (int)szBig53[0] << endl;

cout << (int)szBig53[1] << endl;

cout << (int)szBig53[2] << endl;

cout << (int)szBig53[3] << endl;

cout << (int)szBig53[4] << endl;

cout << (int)szBig53[5] << endl;

cout << (int)szBig53[6] << endl;

cout << (int)szBig53[7] << endl;

cout << (int)szBig53[8] << endl;

cout << (int)szBig53[9] << endl;

/*cout << (int)szUni3[0] << endl;

cout << (int)szUni3[1] << endl;

cout << (int)szUni3[2] << endl;

cout << (int)szUni3[3] << endl;*/


cout << endl;

#if 0

CWFileTxt txt2;

txt2.ReadFile("read1_unicode_chinese.txt");

wstring str2 = txt2.GetLine(1);

wchar_t szUni2[128] = L"";

wcscpy_s(szUni2, 128, str2.c_str());

hkstr::PrintfUnicode(szUni2);

cout << endl;

cout << (int)szUni2[0] << endl;

cout << (int)szUni2[1] << endl;

cout << (int)szUni2[2] << endl;

cout << (int)szUni2[3] << endl;

#endif

#if 0

char szBig51[128] = "";

hkstr::UTF8ToBig5(szBig51, argv[1], true);

cout << szBig51 << endl;

cout << strlen(szBig51) << endl;

cout << (int)szBig51[0] << endl;

cout << (int)szBig51[1] << endl;

cout << (int)szBig51[2] << endl;

cout << (int)szBig51[3] << endl;


char szBig511[128] = "中文";

cout << szBig511 << endl;

cout << strlen(szBig511) << endl;

cout << (int)szBig511[0] << endl;

cout << (int)szBig511[1] << endl;

cout << (int)szBig511[2] << endl;

cout << (int)szBig511[3] << endl;


char szBig52[128] = "";

hkstr::UTF8ToBig5(szBig52, argv[2]);

cout << szBig52 << endl;


char szBig512[128] = "數學1";

cout << szBig512 << endl;

#endif


system("pause");

return 0;

}

留言

這個網誌中的熱門文章

MSVC 與 CRT 之間的恩怨情仇

EXCEL VBA

演員筆記