Я использую StackOverflow с самого начала, и иногда у меня возникало искушение публиковать вопросы, но я всегда либо разбирался в них сам, либо находил ответы, опубликованные в конце концов... до сих пор. Кажется, это должно быть довольно просто, но я часами безрезультатно бродил по Интернету, поэтому перехожу сюда:
У меня есть довольно стандартный текстовый файл utf-16 со смесью английских и китайских символов. Я хотел бы, чтобы эти символы заканчивались строкой (технически, wstring). Я видел много ответов на связанные вопросы (здесь и в других местах), но они либо пытаются решить гораздо более сложную проблему чтения произвольных файлов без знания кодировки, либо преобразования между кодировками, либо просто обычно смущен тем, что «Unicode» является диапазоном кодировок. Я знаю источник текстового файла, который я пытаюсь прочитать, это всегда будет UTF16, у него есть спецификация и все такое, и он может оставаться таким.
Я использовал решение, описанное здесь, которое работал для текстовых файлов, которые были полностью английскими, но после обнаружения определенных символов он переставал читать файл. Единственное другое предложение, которое я нашел, заключалось в том, чтобы использовать ICU, что, вероятно, сработает, но я действительно не хотел бы включать целый большой библиотеку в приложении для распространения, просто чтобы прочитать один текстовый файл в одном месте. Однако меня не волнует системная независимость - мне это нужно только для компиляции и работы в Windows. Решение, которое не полагалось бы на этот факт, было бы, конечно, красивее, но я был бы так же счастлив за решение, которое использовало бы stl, полагаясь на предположения об архитектуре Windows, или даже решения, включающие функции win32 или ATL; Я просто не хочу включать еще одну большую стороннюю библиотеку, такую как ICU. Мне все еще не повезло, если я не хочу переделать все это самостоятельно?
редактировать: я застрял в использовании VS2008 для этого конкретного проекта, поэтому код C++ 11, к сожалению, не поможет.
изменить 2: я понял, что код у меня был раньше заимствовал, не терпел неудачу с неанглийскими символами, как я думал. Скорее, он не работает с определенными символами в моем тестовом документе, в том числе ':' (ПОЛНОШИРИННАЯ ТОЛЧКА, U+FF1A) и ')' (ПОЛНОШИРИННАЯ ПРАВАЯ СКОБКА, U+FF09). Опубликованное решение bames53 также в основном работает, но те же персонажи ставят его в тупик?
редактировать 3 (и ответ!): исходный код, который я использовал, в основном работал - как bames53 помог мне обнаружить, что ifstream просто нужно было открыть в двоичном режиме, чтобы он работал.
wchar_t*
для инициализацииwstring
. Единственное, что я бы проверил, это то, что файл открыт в двоичном режиме, но я бы не ожидал, что ошибка покажет ваш симптом. - person Mark Ransom   schedule 09.05.2012