Как найти встроенную функцию для работы с 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
) расширения.