包含Unicode字符的Unicode字符串始终为空

包含Unicode字符的Unicode字符串始终为空,c,windows,unicode,mingw,C,Windows,Unicode,Mingw,我正在使用-municode-DUNICODE-duunicode标志进行编译,并使用\u tmain启用UNICODE支持 但是,当我对任何包含unicode字符的TCHAR数组执行操作时,字符串最终在该字符所在的位置被截断 例如: TCHAR buffer[255]; wcscpy(buffer, L"test-"); wcscat(buffer, L"Азәрбајҹан"); /* buffer now contains "test-&q

我正在使用
-municode-DUNICODE-duunicode
标志进行编译,并使用
\u tmain
启用UNICODE支持

但是,当我对任何包含unicode字符的
TCHAR
数组执行操作时,字符串最终在该字符所在的位置被截断

例如:

TCHAR buffer[255];
wcscpy(buffer, L"test-");
wcscat(buffer, L"Азәрбајҹан");
/* buffer now contains "test-" */
我的实际用例是检索一个用户名,如果它包含特殊字符,那么不管它来自
GetEnvironmentVariable
GetUsername
还是像上面这样的硬编码字符串,最终都将是空的

编辑:

以下是一个完整的最小可重复性示例:

使用以下目录下的
gcc-o error.exe error.c-municode
编译:

gcc.exe (Rev3, Built by MSYS2 project) 10.1.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
代码:

\define\u UNICODE
#定义UNICODE
#包括
#包括
#包括
int_tmain(int argc,TCHAR*argv[]){
文件*fp;
TCHAR缓冲区[255];
_tcscpy(缓冲区,即“测试-”);
_tcscat(缓冲器);
_tprintf(_T(“长度:%d,内容:%ls\n”),_tcslen(缓冲区),缓冲区);
fp=_-tfopen(_-T(“test.txt”),_-T(“w”);
_ftprintf(fp,_T(“%ls”),缓冲区);
fclose(fp);
返回0;
}

本例打印
15 test-
,并将
test-
放入test.txt。

对于我通常使用的宽字符
wchar\u t

如果这是一个选项,您可以使用以下内容:

#include <tchar.h>
#include <fcntl.h>
#include <io.h>
#include <stdio.h>

int _tmain() {

#ifdef UNICODE
    _setmode(_fileno(stdin), _O_WTEXT);
    _setmode(_fileno(stdout), _O_WTEXT);
#endif

    wchar_t buffer[255];

    wcscpy(buffer, L"test-");
    wcscat(buffer, L"Азәрбајҹан");
    wprintf(L"%s\n", buffer);

    return 0;
}
#包括
#包括
#包括
#包括
int_tmain(){
#ifdef UNICODE
_设置模式(_fileno(stdin),_owtext);
_setmode(_fileno(stdout),_owtext);
#恩迪夫
wchar_t缓冲区[255];
wcscpy(缓冲区,L“测试-”);
wcscat(缓冲区,L“Азәбаааааааааааа;
wprintf(L“%s\n”,缓冲区);
返回0;
}
输出:

与2019年相比,在MSVC和使用Unicode字符集的情况下:

使用gcc 9.2.0版(tdm64-1):


我正是在我的环境中这样做的(使用GNU GCC编译器使用Code::Blocks,它输出的正是OP显示的内容,即测试-@Ryker,windows?@Ryker,在VS2019中,您可以将设置更改为多字节或Unicode,我使用多字节,但Unicode似乎也在工作。我知道您可以在代码中定义它,但我不记得是如何定义的。@Ryker)“顺便说一句,
WCHAR
只是一个宏,对于未定义
UNICODE
的环境,定义为
char
,对于定义了
UNICODE
的环境,定义为
WCHAR\t
"-这一点都不正确。
WCHAR
在所有系统上都一直被定义为
WCHAR\t
。你想的是
TCHAR
,它确实映射到
WCHAR\t
char
基于
UNICODE
定义的存在或缺乏。@anastaciu TDM64是f mingw-W64您列出的编译器标志是指Windows API宏,它们与
wcscpy
或C标准规定的其他功能无关。此处要求OP进行编辑以提供,如果没有其他需要显示的内容,则包括
main()
这是使用过的,但不明白为什么否决票。OP从问题被激活的时候就开始积极参与,问题显示出比我今天在这个网站上看到的许多赞成票的问题更多的努力和研究。我无法让它起作用。这个TCHAR垃圾不在C标准之内。扔掉它。使用UTF-8 internall当需要时,y和转换。当我很不幸,不得不为Windows编写一些东西时,我就是这样做的。如果你要允许UTF-8,你无论如何都不会为ANSI编译。那么…源文件编码是什么?
gcc
可能希望它是UTF-8。Microsoft假定ANSI编码没有
/UTF-8
编译器switch,或使用UTF-8 w/BOM编码。
#include <tchar.h>
#include <fcntl.h>
#include <io.h>
#include <stdio.h>

int _tmain() {

#ifdef UNICODE
    _setmode(_fileno(stdin), _O_WTEXT);
    _setmode(_fileno(stdout), _O_WTEXT);
#endif

    wchar_t buffer[255];

    wcscpy(buffer, L"test-");
    wcscat(buffer, L"Азәрбајҹан");
    wprintf(L"%s\n", buffer);

    return 0;
}