Ожидаемая кодировка аргумента wcwidth () - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь выяснить, какова ожидаемая кодировка аргумента wcwidth(). Страница руководства абсолютно ничего не говорит об этом, и я потратил впустую часы, пытаясь выяснить, что это такое. Вот пример, в C:

#include <stdio.h>
#include <wchar.h>

void main()
{
    wchar_t c = L'h';
    printf("%d\n", wcwidth(c));
}

Я хочу знать, как я должен кодировать этот символьный литерал, чтобы эта программа печатала 2 вместо -1.

Вот Rustпример:

extern "C" {
    fn wcwidth(c: libc::wchar_t) -> libc::c_int;
}

fn main() {
    let c = 'h';
    println!("{}", unsafe { wcwidth(c as libc::wchar_t) });
}

Точно так же я хочу преобразовать эту символьную константу в wchar_t (i32), чтобы эта программа печатала 2.

Спасибо.

ОБНОВЛЕНИЕ: Извините за мою формулировку, я сделал этот звук специфичным для длинных букв C. Я хочу кодировать символьные литералы на любом языке как 32-разрядное целое число, чтобы при передаче его в wcwidth я получил правильный ответ. Поэтому мой вопрос не относится к длинным символам C или C.

ОБНОВЛЕНИЕ 2: Я также был бы рад другой функции, такой как wcwidth, которая лучше определена (и, возможно, даже независима от платформы). Например, тот, который принимает символ в кодировке UTF-8 и возвращает количество столбцов, необходимых для его рендеринга в моно-космическом терминале.

1 Ответ

2 голосов
/ 01 октября 2019

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

Попробуйте это:

#define _XOPEN_SOURCE 700

#include <stdio.h>
#include <locale.h>
#include <wchar.h>

int main(void)
{
    setlocale(LC_CTYPE, "");

    wchar_t c = L'h';

    printf("%d\n", wcwidth(c));
    return 0;
}
...