vswprintf сохраняет префикс символа метки порядка байтов - PullRequest
0 голосов
/ 08 мая 2018

Я все еще новичок с Си, и даже новичок в широких символах в Си.

В приведенном ниже коде должно отображаться

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);

Как будто широкая кодировка константы добавляет этот символ впереди.

1 Ответ

0 голосов
/ 09 мая 2018

Нашел ..

Я следовал руководству, в котором было рекомендовано добавить этот флаг компилятора: -fwide-exec-charset=utf-32

Мой код вообще не работал на Cygwin, и я прочитал, что Windows сконцентрирована на utf-16, поэтому я убрал этот флаг компилятора, и он начал работать на Cygwin.

Тогда из любопытства я убрал флаг компилятора на Raspbian, и теперь он работает там же, как и ожидалось, больше нет меток порядка байтов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...