我仍然是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 ..
答案 0 :(得分:0)
找到它..
我已经按照教程建议添加此编译器标志:
-fwide-exec-charset=utf-32
我的代码根本没有在Cygwin上运行,我读到Windows以utf-16为中心,所以我删除了那个编译器标志,它开始在Cygwin上运行。
然后出于好奇我删除了Raspbian上的编译器标志,它现在也按预期工作,没有更多的字节顺序标记。