// вот вам пример крутой поддержки юникода от авторов самого посещаемого ИТ ресурса рунета, очень смешно
ВНЕЗАПНО, VS выдаст 8(восемь!)
struct x { int x; } x;
а гцц и клэнг верно выдают 4.
Определить — символ это или цифра, думаю, Си в состоянии, но не более того.
#include <wchar.h>
size_t wcslen(const wchar_t *s);
Да, пример достаточно надуманный просто для стёба. Понятно, что в ненормализованной форме никто юникод не сравнивает, и в базах обычно хранится какой-нибудь NFC, но весь к этому NFC ещё как-то надо привести? Либо писать свой костыль на тысячи строк, либо брать готовую библиотеку, которые пишут уже не один десяток лет.
Локали прописать? Что-то я не помню адекватной поддержки нормализации юникода в STL.
Можно ссылочки на гитхаб, пожалуйста?
#include <stdio.h>
#include <locale.h>
#include <wchar.h>
#include <wctype.h>
int main(void)
{
wint_t wc;
setlocale(LC_ALL, "ru_RU.UTF-8");
#if 1
wc = L'ẞ';
wprintf(L"Проверка показывает, что символ <%lc>:\n", wc);
wprintf(L"Алфавитный: %ls\n", iswalpha(wc) ? L"да" : L"нет");
wprintf(L" Цифровой: %ls\n", iswdigit(wc) ? L"да" : L"нет");
wprintf(L" Нижний: %ls\n", iswlower(wc) ? L"да" : L"нет");
wprintf(L" Верхний: %ls\n", iswupper(wc) ? L"да" : L"нет");
wprintf(L"Преобразование регистра <%lc>:\n", wc);
wprintf(L" В нижний: <%lc>\n", towlower(wc));
wprintf(L" В верхний: <%lc>\n", towupper(wc));
#endif
return 0;
}
[guest@localhost wchar]$ gcc -std=c99 -Wall utf8.c -o utf8
[guest@localhost wchar]$ ./utf8
Проверка показывает, что символ <ẞ>:
Алфавитный: да
Цифровой: нет
Нижний: нет
Верхний: да
Преобразование регистра <ẞ>:
В нижний: <ß>
В верхний: <ẞ>
[guest@localhost wchar]$
Вы в курсе, что реализация wchar_t у винды не соответствует стандарту ISO/IEC 10646 с бородатейших времён и до сих пор
соответственно, ни о какой переносимости кода речи быть не может
А авторов, в своё время, да, читал, никому неизвестного фреймворка Qt, твиттера, Trello, ICU, Boost и прочих неизвестных вещей.
www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (6.10.8, _ _STDC_ISO_10646_ _)
Ну, вы можете, конечно, запихнуть UTF-8 поток в массив char'ов, но ни одна нативная функция для работы со строками не будет с ним работать правильно. Даже длину строки никогда не сможет посчитать.
А учитывая, что язык Си изначально разрабатывался учёными для учёных
Поэтому, ответ прост: в C/C++ для работы с UTF8 используйте стороннюю библиотеку.
wchar_t это тупо костыль в дизайне языка, который признали даже создатели этих языков.
Кириллица занимает 16-битный диапазон, в 8 бит она не поместится.
Просто, однажды приняли, что он подходит для хранения позиций однобайтовых кодировок типа ASCII, ибо других на то время просто не существовало.
Касаемо языков, то прежде чем написать вопрос, самостоятельно его проробатывал и пришёл к выводу что вариантов для одной задачи масса.
Пока я не понял каких приглашать программистов, что от них требовать.
но в список не принято заносить файл, так как файл может оказаться огромным и оперативной памяти не хватит на него, он начнёт свопиться на диск и в итоге всё замедлится и повиснет.