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;
}





留言
張貼留言