Правильное чтение текстового файла utf -16 в строку без внешних библиотек?

Я использую StackOverflow с самого начала, и иногда у меня возникало искушение публиковать вопросы, но я всегда либо разбирался в них сам, либо находил опубликованные ответы... до сих пор. Это кажется должно быть довольно простым, но я часами бродил по Интернету безуспешно, поэтому я поворачиваюсь сюда:

У меня есть довольно стандартный текстовый файл utf -16, со смесью английских и китайских иероглифов. Я хотел бы, чтобы эти символы заканчивались строкой (технически, wstring ). Я видел много связанных вопросов с ответами (здесь и в других местах ), но они либо пытаются решить гораздо более сложную проблему чтения произвольных файлов без знания кодировки, либо конвертируют между кодировки, или просто обычно запутались в том, что "Юникод" является диапазоном кодировок. Я знаю источник текстового файла, который я пытаюсь прочитать, это всегда будет UTF16, у него есть спецификация и все такое, и он может оставаться таким.

Я использовал решение, описанное здесь , которое работало для текстовых файлов, которые были полностью английскими, но после обнаружения определенных символов оно прекращало чтение файла. Единственное другое предложение, которое я нашел, заключалось в использовании ICU , что, вероятно, сработает, но я действительно предпочел бы не включать целую большую библиотеку в приложение для распространения, а просто читать один текстовый файл в одном месте. Меня не волнует системная независимость, хотя -мне это нужно только для компиляции и работы в Windows. Решение, которое не опиралось бы на этот факт, было бы, конечно, красивее ,но я был бы так же счастлив за решение, которое использовало бы stl, полагаясь на предположения об архитектуре Windows, или даже решения, которые включали бы функции win32 или ATL; Я просто не хочу включать другую большую стороннюю библиотеку -, такую ​​как ICU. Мне все еще не повезло, если я не хочу переделать все это самостоятельно?

изменить :Я застрял в использовании VS2008 для этого конкретного проекта, поэтому код C++11, к сожалению, не поможет.

редактировать 2 :Я понял, что код , который я заимствовал раньше, не терпел неудачу с не -английскими символами, как я думал. Скорее, он не работает с определенными символами в моем тестовом документе, в том числе ':' (ПОЛНОШИРИННЫЙ ЗАТОЧКА, U+FF1A )и ')' (ПОЛНОШИРИНА ПРАВАЯ СКОБКА, U+FF09 ). Опубликованное решение bames53 также в основном работает, но те же персонажи ставят его в тупик?

редактировать 3 (и ответ! ):исходный код, который я использовал, -действительно -в основном работал -как bames53 помог мне обнаружить, что ifstream просто нужно было открыть в двоичном режиме, чтобы он работал.

6
задан neminem 9 May 2012 в 20:39
поделиться