osa1
osa1

Reputation: 7088

Expected encoding of wcwidth() argument

I'm trying to find out what the expected encoding of wcwidth() argument is. The man page says absolutely nothing about this, and I wasted hours trying to find out what it is. Here's an example, in C:

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

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

I want to know how should I encode this character literal so that this program prints 2 instead of -1.

Here's a Rust example:

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

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

Similarly I want to convert this character constant to wchar_t (i32) so that this program prints 2.

Thanks.

UPDATE: Sorry for my wording, I made this sound specific to C's long char literals. I want to encode character literals in any language as a 32-bit int so that when I pass it to wcwidth I get a right answer. So my question is not specific to C or C's long char literals.

UPDATE 2: I'd also be happy with another function like wcwidth that is better specified (and maybe even platform independent). E.g. one that takes UTF-8 encoded character and returns number of cols needed to render it in a monospace terminal.

Upvotes: 0

Views: 220

Answers (1)

David Ranieri
David Ranieri

Reputation: 41045

You need to add support for _XOPEN_SOURCE and also you need to set your locales.

Try this:

#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;
}

Upvotes: 2

Related Questions