![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
mrgloom |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
почему то wcstombs обрезает путь, то ли из-за того что русские буквы в названии папок то ли из-за того что пробелы, в чём причина? |
|||
|
||||
Static |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 6.11.2008 Репутация: 1 Всего: 2 |
Первый раз вижу макрос ARRAYSIZE, быстрое гугление показало, что он возвращает количество элементов в массиве. А функция wcstombs третьим параметром принимает количество байт
--------------------
Я не настолько безнадежен, как кажется... |
|||
|
||||
mrgloom |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
замена на sizeof(path) не дала результата, тем более что вроде как размер char это и есть 1 байт.
похоже отрезает путь именно до папки с русским названием. Добавлено через 3 минуты и 13 секунд например D:\Новая папка\file.dat превращается в D:\ а например D:\test folder\file.dat работает |
|||
|
||||
mrgloom |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
по всей видимости
как раз возвращает -1. только непонятно почему не может сконвертировать русские буквы? |
|||
|
||||
Static |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 6.11.2008 Репутация: 1 Всего: 2 |
mrgloom, а что функция возвращает при этом? -1?
опередил ![]() Это сообщение отредактировал(а) Static - 26.11.2013, 16:04 --------------------
Я не настолько безнадежен, как кажется... |
|||
|
||||
mrgloom |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
http://habrahabr.ru/post/164193/
боль вообще функция определена как
а вызывается
т.е. передается CString вроде как, может он там автоматом конвертируется? т.е. даже не надо писать
и да у меня юникод проект, если это важно. Это сообщение отредактировал(а) mrgloom - 26.11.2013, 17:01 |
||||||
|
|||||||
mrgloom |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
вообщем так вроде работает
|
|||
|
||||
smalcom |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 494 Регистрация: 16.10.2004 Где: Dnepr Репутация: нет Всего: 7 |
а wcslen заюзать, не?
-------------------- What DA F...??? |
|||
|
||||
mrgloom |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
дело то не в этом, там от длины не зависит, именно обрубает начиная от вхождения первой русской папки.
хоть вместо
напиши
Это сообщение отредактировал(а) mrgloom - 28.11.2013, 18:21 |
||||
|
|||||
vinter |
|
||||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
Ну что же не читаем документацию на функции?
|
||||
|
|||||
mrgloom |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
ну да можно и через изменение локали, но я решил с этим не разбираться, потому что непонятно какую ставить и она как я понял меняется глобально, т.е. потом её надо менять обратно?
|
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
да, менять придётся на всё приложение. Вообще, нужно использовать юникод везде и не переводить в ANSI+codepage.
|
|||
|
||||
mrgloom |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
дело в том, что в функцию передаётся TCHAR* , а внутри используется библиотечная функция которая хочет char* .
|
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
TCHAR у вас Unicode, а char - ANSI. Перевод из Unicode в ANSI вещь неоднозначная, и сама по себе зависит от локали, в которой вы хотите этот самый ANSI получить. Так что для любой функции перевода Unicode -> ANSI нужно так или иначе задавать локаль (или кодовую страницу). Для wcstombs это делается настройкой локали в CRT, для WideCharToMultiByte кодовая страница задается при вызове
|
|||
|
||||
akizelokro |
|
||||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
TCHAR это TCHAR, в случае если определен _UNICODE это wchar_t (из башки вылетело как wide string символ обозначается, wchar_t или wchar), в ином случае это char (multibyte string character). Это подставляется на стадии компиляции.
В случае, если идут проблемы с конвертацией национальных симоволов (кириллицы в том числе) в символьный массив char[] порядок действий следующий: 1. Проверяется locale на соответствие национальной кодировке 2. Если и это не срабатывает, проверяется на размер массива-приёмника (на каком символе обрезается, на первом национальном или в другом месте). судя по тому, что размер массива установлен в MAX_PATH, в данном случае проблемка с установкой национальной кодовой страницы. В данном случае можно переписать
на
В случае с CString уже на стадии копиляции происходит преобразование TCHAR в wchar_t или char, а дальше подыскивается способ преобразования CStringA или CStringW к TCHAR* (используемый по умолчанию при компиляции тип CString тоже зависит от наличия либо отстутсвия _UNICODE) -------------------- a = a + b; b = a - b; a = a - b; |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |