Здесь есть две проблемы. Во-первых, какие символы разрешены в коде C ++ (и комментариях), например имена переменных. Во-вторых, какие символы допускаются в строках и строковых литералах.
Как отмечалось, компиляторы C ++ должны поддерживать очень ограниченный набор символов на основе ASCII для символов, разрешенных в коде и комментариях. На практике этот набор символов не очень хорошо работал с некоторыми европейскими наборами символов (и особенно с некоторыми европейскими клавиатурами, у которых не было нескольких доступных символов - таких как квадратные скобки), поэтому концепция орграфов и триграфов была представил. В настоящее время многие компиляторы принимают больше, чем этот набор символов, но нет никакой гарантии.
Что касается строк и строковых литералов, в C ++ есть концепция широких символов и строк широких символов. Однако кодировка для этого набора символов не определена. На практике это почти всегда Unicode, но я не думаю, что здесь есть какая-либо гарантия. Строковые литералы широких символов выглядят как L "строковый литерал", и их можно назначить std :: wstring's.
В C ++ 11 добавлена явная поддержка строк и строковых литералов Unicode, закодированных как UTF-8, UTF-16 с прямым порядком байтов, UTF-16 с прямым порядком байтов, UTF-32 с большим порядком байтов и UTF-32 с прямым порядком байтов.