Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
 Аватар для igor_petrov
18 / 8 / 4
Регистрация: 26.01.2014
Сообщений: 164

Кодировка текста и wchar_t

12.03.2014, 16:25. Показов 3997. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем, такая проблема. Нужно вывести названия папок в окно. Ищу папки в директории и беру имена с помощью FindFirstFile(), FindNextFile() и WIN32_FIND_DATA::cFileName.
Строки вывожу с помощью
C++
1
Gdiplus::DrawString(const WCHAR*, INT, const Font*, const RectF, const StringFormat*, const Brush*)
которая принимает const WCHAR*, но почему-то вместо русских выводятся китайские или японские иероглифы. Английский язык выводится нормально. Прошу помочь, потому что искал и не нашел никакой инфы, кроме setlocale(), но это для консолей. Заранее спасибо!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.03.2014, 16:25
Ответы с готовыми решениями:

Не выходит реализовать wchar_t * -> LONG_PTR -> wchar_t *
как сделать чтобы в строку aa скопировать данные? непойму что я дедаю неправильно wchar_t * aa = (wchar_t *)malloc(500); wchar_t * bb...

Wchar_t и кодировка
Доброго времени суток! Возникла проблема при работе с openGL библиотекой DevIL в Embarcadero RAD Studio 10 Seattle. Собственно, нужно...

Сохранение в файл массива wchar_t. Кодировка?
Привет! Есть проблема. Нужно вывести в файл массив wchar_t* Text. Использую функцию fwprintf(out,L"%s",Text) Эта функция...

6
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
12.03.2014, 16:44
Ну всё верно, юникод и анси кодировки.
Преобразование будет функцией MultiByteToWideChar (вроде или наоборот, не помню потому что не заморачиваюсь и сразу делаю проэкт в анси)
0
 Аватар для igor_petrov
18 / 8 / 4
Регистрация: 26.01.2014
Сообщений: 164
15.03.2014, 18:38  [ТС]
Че-то не сходится, у меня в проекте установлена кодировка Unicode,
сначала идет загрузка названий папок во временный массив, где я поступаю вот так
C++
1
2
3
4
5
//переменная t объявлена как WCHAR *t;
//переменная cFileName это член структуры WIN32_FIND_DATA, которая вот так объявляется:
WCHAR cFileName[MAX_PATH];
 
m_theme[theme].t = ffd.cFileName; //по факту все ровно
прототип моей функции выглядит вот так:
C++
1
2
3
bool addObject(WCHAR *title, ...);
//а потом в рисующей функции такая обстановка:
g.DrawString((const WCHAR*)it->name, it->nameLength, m_font, Gdiplus::PointF(x, y), &b);
выводится так, как покажу в скриншоте ниже.

все должно работать, насколько я понимаю, здесь же нет конвертаций в другую кодироку, везде Unicode? или я не правильно понимаю. объясните пожалуйста
и по поводу того, что DrawString принимает const WCHAR*, а у меня WCHAR, правильно ли делаю так как выше, явное преобразование такого плана будет работать? или нужно использовать _cast какой-нибудь(просто читал про const *char, там говорили что нужно использовать какой-то rein... cast не помню точно)

очень нужна помощь в этом вопросе, замучался уже, спасибо!
Миниатюры
Кодировка текста и wchar_t  
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
15.03.2014, 23:00
Цитата Сообщение от igor_petrov Посмотреть сообщение
C++
1
2
//переменная t объявлена как WCHAR *t;
m_theme[theme].t = ffd.cFileName;
Вы копируете в указатель t адрес массива. И может быть, когда пытаетесь этот указатель использовать,
массива уже не существует.
Цитата Сообщение от igor_petrov Посмотреть сообщение
C++
1
g.DrawString((const WCHAR*)it->name, it->nameLength, m_font, Gdiplus::PointF(x, y), &b);
Что такое it->name (какое определение, какое значение)?
Если Вам нужна помощь, приведите более подробный код. А так что можно сказать?
Выводит иероглифы? Потому что it->name содержит иероглифы. Почему? Потому что их туда записали.
0
 Аватар для igor_petrov
18 / 8 / 4
Регистрация: 26.01.2014
Сообщений: 164
16.03.2014, 01:36  [ТС]
Alex5, потестил - да, вы правы, русский язык здесь ни при чем и ни при чем кодировка Unicode/Multibyte судя во всему.

Окей, опишу настолько подробно, насколько смогу.
Для начала я загоняю одним циклом имена папок в член класса, который называется THEME (член называется 't', типа WCHAR*)

После этого я передаю это значение уже в структуру кнопки, там тоже есть строковое значение типа WCHAR*, а потом я должен вывести текст с помощью DrawString() - которая принимает const WCHAR*.
Потестил тщательно - проблема на самом деле в том, что принимается указатель на строку, которая уничтожается после цикла.

Такой вопрос: есть переменная WCHAR cFileName[260], как записать ее значение в другую переменную, с условием того, что если в дальнейшем cFileName уничтожится, текст находящийся в переменной, в которую я записывал его останется там и никуда не пропадет?

const WCHAR*
WCHAR*
WCHAR[260] ?

Мало работал со строками, не могу разобраться с указателями/массивами, const* и т.п.
Прошу помочь, как можно скорее, спасибо!

Добавлено через 21 минуту
Вот, тестирую и показываю, что не получается конкретно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <iostream>
 
WCHAR *t;
 
void setup() {
    WCHAR *temp = L"Текст!";
    t = temp;
}
 
void txt(const WCHAR* output) {
    wprintf(output);
}
 
int main() {
    setlocale(LC_ALL, "Russian");
    
    setup();
    txt(t);
 
    _getch();
    return 0;
}
Если поменять WCHAR *temp = L"Текст!"; на WCHAR temp[260] = L"Текст!"; то не выводится ничего
Как правильно нужно выполнить присвоение?
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
16.03.2014, 14:26
Лучший ответ Сообщение было отмечено igor_petrov как решение

Решение

Цитата Сообщение от igor_petrov Посмотреть сообщение
есть переменная WCHAR cFileName[260], как записать ее значение в другую переменную
Скопировать не указатель на cFileName, а содержимое этой строки.
C++
1
2
3
const int N=260;
WCHAR arr[N];
lstrcpyW( arr, cFileName);
Цитата Сообщение от igor_petrov Посмотреть сообщение
не выводится ничего
Как правильно нужно выполнить присвоение?
C++
1
2
3
4
5
6
7
8
9
10
11
void setup2( WCHAR* a ) {
    WCHAR temp[] = L"Текст!";
    lstrcpyW( a, temp );
}
int main() {
    // ... 
    const int N = 100;
    WCHAR arr[N] = {};
    setup2( arr );
    // ... 
}
1
 Аватар для igor_petrov
18 / 8 / 4
Регистрация: 26.01.2014
Сообщений: 164
17.03.2014, 15:23  [ТС]
Манипуляции с lstrcpyW() дали результат, благодарю Вас!
От души!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.03.2014, 15:23
Помогаю со студенческими работами здесь

Почему const wchar_t* воспринимается как wchar_t* ?
Здравствуйте. Я написал вот так: const wchar_t* dir = directory.c_str(); StartModule(dir); и такая ошибка появляется : ...

Кодировка текста перестановкой столбцов в массиве, составленном из слов текста
Нужно заполнить двумерный массив с поля (Edit) после некоторых операций вывести массив в поле. Вопрос как заполнить массив с...

Ошибка при подключении к XE3 библиотеки для VS: "Please use native wchar_t type (/Zc:wchar_t)"
Господа, пытаюсь прикрутить к билдеру библиотеку для работы с автокадом. К сожалению она жестко прибита гвоздями к microsoft visual studio...

Wchar_t и unsigned wchar_t в windows
Печально, но факт: wchar_t - 2 байта, unsigned wchar_t - 4 байта Вопрос1: используется ли unsigned wchar_t для хранения...

Cannot convert from 'wchar_t' to 'const wchar_t *'
такой код, порылся в инете не помогло. ломать голову надоело может кто подскажет, буду благодарен. wchar_t * english = L&quot;abvgdee...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru