Как найти встроенную функцию для работы с char16_t в C?

Скажите, пожалуйста, что такое версия char16_t для функций управления строками

такие как:

http://www.tutorialspoint.com/ansi_c/c_function_references.htm

Я нашел много ссылок на сайт, но никто не упомянул это.

Это особенно важно для функции печати, потому что она помогает мне проверить, работает ли функция манипуляции.

#include <stdio.h>
#include <uchar.h>



char16_t *u=u"α";
int main(int argc, char *argv[])
{
    printf("%x\n",u[0]); // output 3b1, it is UTF16



    wprintf("%s\n",u); //no ouput
    _cwprintf("%s\n",u); //incorrect output

    return 0;
}

2 ответа

Решение

wprintf и его коллеги по wchar тоже должны иметь строку формата th в wchar:wprintf( L"%s\n", u);

Для wchar L используется как префикс строковых литералов.

Редактировать:

Вот фрагмент кода (проверено на Windows):

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

void main()
{
    wchar_t* a = L"α";
    fflush(stdout); //must be done before _setmode
    _setmode(_fileno(stdout), _O_U16TEXT); // set console mode to unicode
    wprintf(L"alpha is:\n\t%s\n", a);      // works for me :)
}

Консоль не работает в юникоде и печатает "?" для не ASCII символов. В Linux вам нужно удалить префикс подчеркивания перед setmode а также fileno,

Примечание: для печати Windows GUI уже есть надлежащая поддержка, так что вы можете использовать wsprintf для форматирования строк Unicode.

Чтобы напечатать / прочитать / открыть запись и т. Д., Вам нужно преобразовать в 32-битные символы с помощью mbsrtowcs функция.

Для ВСЕХ намерений и целей char16_t является многобайтовым представлением, поэтому необходимо использовать mbr функции для работы с этим интегральным типом.

В нескольких ответах использовался L-префикс, который совершенно неверен. 16-битные строки требуют префикса u.

Следующий код дает вам все необходимое для работы с 8, 16 и 32-битными строковыми представлениями.

#include <string.h>
#include <wchar.h>
#include <uchar.h>

Вы можете Google процедуры, найденные в <wchar.h> если у вас нет справочных страниц (UNIX).

GLib от Gnome.org содержит замечательный код, который вы можете добавить, если проблема не в издержках.

char16_t а также char32_t ISO C11 (iso9899:2011) расширения.

Другие вопросы по тегам