chcp
活动代码页: 936

windows cmd使用的字符集为GBK，CPP文件字符集为UTF-8


给g++编译器加两个参数即可
-fexec-charset=GBK
-finput-charset=UTF-8

第一个参数指定窄字符或窄字符串的字面值常量的内部编码方式，默认为UTF-8。例如指定此选项为GBK，则窄字符或窄字符串常量将会以GBK编码方式存储而不是默认的UTF-8编码方式。
第二个参数，可能不需要加，加了第一个参数后还有乱码可以试试这个，意思是指定源文件的文件编码。

如果你是直接编译
g++ -fexec-charset=GBK test.cpp -o test

就是给编译器加上选项：-fexec-charset=GBK，和windows默认的统一，就OK了。


SDL2 里
SDL_DROPFILE 使用的是 UTF-8


char *fn = "集锦1A.2.DFC9.vz";
FILE* fp = fopen(fn,"rb");
if(fp) printf("fopen OK");

文件名UTF-8 不能打开，GBK可以。

文件名 UTF-8 需要转 CP936 打开

char* loc_fn = Utf8ToLoc(fn);
FILE* fp = fopen(loc_fn,"rb");

// Windows 平台 UTF-8 编码转换为本机编码
char* Utf8ToLoc(const char* s)
{
    int len = strlen(s);

    int wb_len = MultiByteToWideChar(CP_UTF8, 0, s, len, 0, 0);

    char *wbuf = (char*)malloc(sizeof(wchar_t)*(wb_len+1));
    memset(wbuf, 0, sizeof(wchar_t)*(wb_len+1));

    MultiByteToWideChar(CP_UTF8, 0, s, len, wbuf, wb_len);

    UINT cp = GetACP();
    int b_len = WideCharToMultiByte(cp, 0, wbuf, wb_len, 0, 0, 0, 0);
    char *buf = (char*)malloc(b_len+1);
    memset(buf, 0, b_len + 1);
    WideCharToMultiByte(cp, 0, wbuf, wb_len, buf, b_len, 0, 0);

    free(wbuf);

    return buf;
}

------------------------------------------------------------------------------------------
_wfopen是 Microsoft 扩展

fopen支持 Unicode 文件流。 若要打开 Unicode 文件，请将传递ccs指定为所需的编码的标志fopen
FILE *fp = fopen("newfile.txt", "rt+, ccs=encoding");

fopen并 _fdopen对应于oflag 中使用的参数_open并_sopen，按如下所示。

中的字符模式下字符串	等效oflag值_打开 /_sopen
a	_O_WRONLY | _O_APPEND (usually _O_WRONLY | _O_CREAT | _O_APPEND)
a+	_O_RDWR | _O_APPEND (usually _O_RDWR | _O_APPEND | _O_CREAT )
r	_O_RDONLY
r+	_O_RDWR
w	_O_WRONLY (usually _O_WRONLY | _O_CREAT | _O_TRUNC)
w+	_O_RDWR (usually _O_RDWR | _O_CREAT | _O_TRUNC)
b	_O_BINARY
t	_O_TEXT
c	无
n	无
S	_O_顺序
R	_O_RANDOM
T	_O_SHORTLIVED
D	_O_临时
ccs=UNICODE	_O_WTEXT
ccs=UTF-8	_O_UTF8
ccs=UTF-16LE	_O_UTF16
