Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

VC++: Открытие файла с русским именем

0 views
Skip to first unread message

Damir Tenisheff

unread,
Aug 18, 2007, 4:22:48 PM8/18/07
to
Рад приветствовать тебя All!

VS.net 2005

С удивлением обнаружил, что в обычном Win32 App, сформированном визардом
простой код вида

std::string s("c:\\тест\\kub.x");
std::ifstream in(s.c_str());

не работает. Причина - русскоязычное имя каталога "тест" в первой строке.
Ставил все варианты работы Character Set: UNICODE/Multi-byte/Not set.

Раньше как-то об этом даже не задумывался - был уверен, что это работает.
Hеужели необходимо явно преобразовывать кодировку строки перед открытием
потока? Есть ли более простые функции?

У меня есть фрагменты кода, где результат ::GetOpenFileName сразу идёт в
работу на открытие файла. Hадо везде писать перекодировку? Hакладненько...


Удачи в бою!.. ;)
Damir.


Alexander Grebenkov

unread,
Aug 20, 2007, 12:22:00 AM8/20/07
to
Ура.

DT> std::string s("c:\\тест\\kub.x");
DT> std::ifstream in(s.c_str());
DT> не работает. Причина - русскоязычное имя каталога "тест" в первой строке.
DT> Ставил все варианты работы Character Set: UNICODE/Multi-byte/Not set.

А с чего бы ему работать? В консольных приложениях по умолчанию используется
кодовая страница OEM (для нас обычно 866), а исходники ты редактировал в GUI,
там 1251 или Unicode.

Учитывая, что у тебя простой string - никаким Unicode там и не пахнет, он
8-битный вне зависимости от того, что ты там выставил в Character set.

Вариантов у тебя в общем-то два:

1. Перекодировать строки в oem-кодировку (желательно в runtime).
2. Использовать std::wstring и L"c:\\тест\\". Это уже будет Unicode.

С приветом, Шурик Гребеньков. e-mail: grebenkov [не собака] gmail dot com

Damir Tenisheff

unread,
Aug 23, 2007, 2:52:11 PM8/23/07
to
Рад приветствовать тебя Alexander!

DT>> std::string s("c:\\тест\\kub.x");
DT>> std::ifstream in(s.c_str());
DT>> не работает. Причина - русскоязычное имя каталога "тест" в первой строке.
DT>> Ставил все варианты работы Character Set: UNICODE/Multi-byte/Not set.

AG> А с чего бы ему работать? В консольных приложениях по умолчанию
AG> используется кодовая страница OEM (для нас обычно 866), а исходники ты
AG> редактировал в GUI, там 1251 или Unicode.

Hет, я специально создал Win32 Project.
Это не консольное приложение.

AG> Учитывая, что у тебя простой string - никаким Unicode там и не
AG> пахнет, он 8-битный вне зависимости от того, что ты там выставил в
AG> Character set.

AG> Вариантов у тебя в общем-то два:
AG> 1. Перекодировать строки в oem-кодировку (желательно в runtime).
AG> 2. Использовать std::wstring и L"c:\\тест\\". Это уже будет Unicode.

То есть в чистом (портабельном) виде точно никак не заставить работать?

wstring использовать совсем не хочется. А явное перекодирование - путь к
ошибкам. Где-нибудь явно перекодирую дважды или забуду перекодировать...

Alexander Grebenkov

unread,
Aug 24, 2007, 1:24:32 AM8/24/07
to
Ура.

AG>> 1. Перекодировать строки в oem-кодировку (желательно в runtime).
AG>> 2. Использовать std::wstring и L"c:\\тест\\". Это уже будет Unicode.

DT> wstring использовать совсем не хочется.

В файловой системе всех современных ОС имена файлов всё равно пишутся в
unicode. Поэтому использование wstring - вполне разумно.

0 new messages