Есть ли какой-либо символ, который один из них не может представить?
В теории: Нет.
Все эти форматы могут представлять все кодовые точки Unicode.
На практике: зависит.
Windows API использует UCS-2 (который в значительной степени является первым блоком UTF-16) и не всегда правильно обрабатывает суррогаты. Таким образом, вы можете захотеть использовать UTF-16, чтобы ваша программа работала как можно более «нормально» по сравнению с другими программами, вместо того, чтобы усекать высокоуровневые кодовые точки UTF-32 вручную.
Что-нибудь еще?
Да: используйте UTF-8!
Он не имеет порядка байтов, поэтому вы избегаете проблем с порядком байтов, которые вызывают боль в задней части.
Конечно, если вы работаете в Windows, вам нужно конвертировать в UTF-16 перед их использованием.