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

时间:2018-05-08 14:53:52

标签: c printf

我仍然是C的新秀,甚至更新的C中的广角。

以下代码应显示

4 points to Smurfs

但它显示

4 points to Smurfs

在gdb中我这个:

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

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

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

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

显然,问题&#65279中的字符是Unicode字符'ZERO WIDTH NO-BREAK SPACE'(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 points to %ls",4,L"Smurfs"+1);

好像常量的宽编码在前面添加了char ..

1 个答案:

答案 0 :(得分:0)

找到它..

我已经按照教程建议添加此编译器标志: -fwide-exec-charset=utf-32

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

然后出于好奇我删除了Raspbian上的编译器标志,它现在也按预期工作,没有更多的字节顺序标记。