Я все еще новичок с Си, и даже новичок в широких символах в Си.
В приведенном ниже коде должно отображаться
4 points to Smurfs
но это показывает
4 points to Smurfs
В GDB I см. это:
(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);
Как будто широкая кодировка константы добавляет этот символ впереди.