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.
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
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 использовать совсем не хочется. А явное перекодирование - путь к
ошибкам. Где-нибудь явно перекодирую дважды или забуду перекодировать...
AG>> 1. Перекодировать строки в oem-кодировку (желательно в runtime).
AG>> 2. Использовать std::wstring и L"c:\\тест\\". Это уже будет Unicode.
DT> wstring использовать совсем не хочется.
В файловой системе всех современных ОС имена файлов всё равно пишутся в
unicode. Поэтому использование wstring - вполне разумно.