In Terminal.app, open preferences > profiles > advanced, ensure your terminal is set to xterm-256color, and your text encoding set to Unicode UTF-8, and open a new tab, and try again.
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main(void)
{
setlocale(LC_ALL, "");
printf("❄️\n");
printf("%s", u8"🍁\n");
exit( EXIT_SUCCESS );
}
$ /Users/MrHoffman/Library/Developer/Xcode/DerivedData/.../C\ tests
❄️
🍁
$ locale
LANG="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL=
$
With C, you get to tangle directly with Unicode, with ASCII and its UTF-8 superset, and with wchar_t encoding for both. Given my choice here, I'd run with UTF-8 directly and avoid wchar_t. UTF-8 is multi-byte, so don't assume that one character, err, that one glyph is one byte, because that only works with ASCII, and which means strlen and sizeof and buffer allocations can all provide run-time surprises.
This is easier in ObjC and Swift, if either are options here.