gpt4 book ai didi

c - vswprintf 保持前缀字节顺序标记字符

转载 作者:太空宇宙 更新时间:2023-11-03 23:59:39 25 4
gpt4 key购买 nike

我仍然是 C 的新手,甚至对 C 中的宽字符更陌生。

下面的代码应该显示

蓝 Sprite 4分

但它显示

蓝 Sprite 4分

在 gdb 中,我看到这个:

(gdb) p buffer
$1 = L" 4 points to Smurfs",

但是当我从控制台复制粘贴时,空格神奇地消失了:

(gdb) p buffer
$1 = L"4 points to Smurfs",

此外,buffer[0] 根据 gdb 包含此内容:65279 L' '

显然,有问题的字符  是 Unicode 字符“零宽度不间断空间”(U+FEFF)。我重新输入了代码,确保我没有输入这个。我不知道这是从哪里来的。我还根据 https://stackoverflow.com/a/9691839/7602 在记事本中打开了代码那里没有多余的字符。

我不在乎 ncurses 是否会停止将其显示为空格。

代码(大幅缩减):

#include <time.h>
#include <stdio.h>
#include <errno.h>
#include <wchar.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <locale.h>
#define NCURSES_WIDECHAR 1
#include <ncursesw/ncurses.h>

#include "types.h"
#include "defines.h"
#include "externs.h"

WINDOW * term;

/*row column color n arguments */
void rccn(int row, int col, const wchar_t *fmt, ...)
{
wchar_t buffer[80];
int size;

va_list args;
va_start(args, fmt);
size = vswprintf(buffer, 80, fmt, args);
va_end( args );

if(size >= 80){
mvaddwstr(row, col, L"Possible hacker detected!");
}else{
mvaddwstr(row, col, buffer);
}
}


int main(void)
{
int ch;
setlocale(LC_ALL,"");
term = initscr();

rccn(1,1,L"%i points to %ls",4,L"Smurfs");
ch = getch();

return EXIT_SUCCESS;
}

问题随着rccn(1,1,L"%i 指向 %ls",4,L"Smurfs"+1);

好像常量的宽编码在前面添加了那个字符..

最佳答案

找到了..

我遵循了一个教程,其中建议添加这个编译器标志:-fwide-exec-charset=utf-32

我的代码根本没有在 Cygwin 上运行,我读到 Windows 是以 utf-16 为中心的,所以我删除了那个编译器标志,它开始在 Cygwin 上运行。

然后出于好奇,我删除了 Raspbian 上的编译器标志,现在它也可以正常工作,不再有字节顺序标记。

关于c - vswprintf 保持前缀字节顺序标记字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50236550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com