Из моего опыта работы с различными кодировками символов я бы порекомендовал вам иметь дело только с UTF-8 при загрузке и сэкономить время. Вам будет очень больно, если вы попытаетесь сохранить внутреннее представление в UTF-8, поскольку один символ может быть любым от 1 байта до 4. Поэтому простые операции, такие как strlen, требуют, чтобы каждый байт решал, а не len выделенный буфер (хотя вы можете оптимизировать, посмотрев на первый байт в последовательности символов, например, 00..7f - это однобайтовый символ, c2..df указывает на 2-байтовый символ и т. д.).
Люди часто ссылаются на «строки Unicode», когда они имеют в виду UTF-16, а в Windows wchar_t имеет фиксированные 2 байта. В Windows я думаю, что wchar_t это просто:
typedef SHORT wchar_t;
Полное 4-байтовое представление UTF-32 редко требуется и очень расточительно, вот что говорит по этому поводу стандарт Unicode (5.0):
"В среднем более 99% всех UTF-16 выражается в единичных единицах кода ... UTF-16 обеспечивает правильное сочетание компактных размеров с возможностью обработки случайных символов вне BMP"
Короче говоря, используйте whcar_t в качестве внутреннего представления и выполняйте преобразования при загрузке и сохранении (и не беспокойтесь о полном Unicode, если вы не уверены, что он вам нужен).
Что касается выполнения фактического преобразования, взгляните на проект ICU:
http://site.icu -project.org /