Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 09.03.2014
Сообщений: 14

И снова кодировка

09.11.2023, 09:48. Показов 686. Ответов 10

Студворк — интернет-сервис помощи студентам
Хотелось бы уже разобраться в вопросе, насколько это вообще возможно. Лучше на конкретном примере.
Действующие лица и исполнители:
Code::Blocks 20.03
wxWidgets 3.2
wxTreeCtrl
JsonCpp
Задача простая - загружать структуру из json в TreeCtrl, редактировать и сохранять обратно.
Загружаем:
C++
1
2
3
4
5
6
7
8
9
10
    wxTreeItemId root = TreeCtrl1->GetRootItem();
    Json::Value JSONval;
    Json::Reader reader;
    std::ifstream file("data_load.json");
    reader.parse(file, JSONval);
 
    Json::Value places = JSONval["places"];
    for (Json::ValueIterator i=places.begin(); i!=places.end(); ++i){
        TreeCtrl1->AppendItem(root, ((*i)["place"].asString()));
    }
Сохраняем:
C++
1
2
3
4
5
6
7
8
9
10
    wxTreeItemId root = TreeCtrl1->GetRootItem();
    Json::Value JSONdb;
    JSONdb["places"] = getChildKnot(root, TreeCtrl1); //заполняю json
    Json::StyledWriter wrtr;
    std::string str = wrtr.write(JSONdb);
    std::ofstream fl("data.json");
    if(fl.is_open()){
        fl<<str;
        fl.close();
    }
файл сохраняется в utf-8, символы кириллицы отображаются в Notepad++ как то так - \u0430\u0433\u0430\u0437\u0438\u043d
Если в Notepad++ вручную пишу кириллицей в TreeCtrl загружается так же как отображается в Notepad++ при переключении на кодировку ANSI - Магазин. Если в Notepad++ преобразовать в ANSI, загружается корректно.
По логике нужно либо сохранять json в ANSI, либо открывать utf-8 преобразовывать в ANSI и "скармливать" TreeCtrl.
Вопрос как это осуществлять практически. Про кодировки писали уже даже самые ленивые, но это либо общая информация, либо конкретные случаи в которых ничего полезного для себя я так и не нашел.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.11.2023, 09:48
Ответы с готовыми решениями:

Снова кодировка из Windows-1251 в UTF-8
Извините за надоедливый вопрос. Есть текстовый файл в кодировке Windows-1251. (Редактор Notepad++ показывает ANSI). Необходимо перевести...

И снова кодировка
Друзья, понимаю, что уже наверно замонали, но очень прошу, помогите, третий день потею, ничего не понимаю. На домашнем старом компьютере...

Снова кодировка.
Здравствуйте уважаемые, снова это вопрос с кодировкой. Русские символы отправляются в базу данных как привет...

10
фрилансер
 Аватар для Алексей1153
6440 / 5634 / 1127
Регистрация: 11.10.2019
Сообщений: 14,980
09.11.2023, 10:11
LarryFlint,

в файле хранить в utf8
любая строка из файла через библу json загружается в std::string в кодировке utf8. Дальше по обстоятельствам - конвертируй в нужную кодировку.
Перед записью в json так же - из любой кодировки конвертируешь в utf8, помещаешь в std::string , отправляешь в библу -> файл

Добавлено через 2 минуты
Цитата Сообщение от LarryFlint Посмотреть сообщение
((*i)["place"].asString())
вот это выражение возвращает строку в utf8

если дереву надо не так, то вставить тут перекодировку
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
09.11.2023, 10:27
Не знаю как это в Code::Blocks делается, но если уж потребовалось честно работать с utf8, где не только кириллица может быть - я бы сделал юникодное приложение и конвертировать в юникод.

А по остальному Алексей1153 верное место указал для конвертации.
Для обратной конвертации в UTF8 тоже надо место найти, вероятно где-то здесь:

C++
1
JSONdb["places"] = getChildKnot(root, TreeCtrl1); //заполняю json
Но, правда, это какая-то готовая функция, сохраняющая список, надо бы в ее потрошки залезть чтобы каждую строку конвертировать отдельно.

Добавлено через 1 минуту
Цитата Сообщение от LarryFlint Посмотреть сообщение
Про кодировки писали уже даже самые ленивые, но это либо общая информация, либо конкретные случаи в которых ничего полезного для себя я так и не нашел.
Не понятно что конкретное вы хотите найти?
Вам нужен код фнукции, конвертирующей между UTF8 и другими кодировками? или что?
0
...
 Аватар для anmartex
1910 / 1329 / 966
Регистрация: 12.02.2013
Сообщений: 2,172
09.11.2023, 10:29
C++
1
2
3
//...
   TreeCtrl1->AppendItem(root, wxString::FromUTF8(((*i)["place"].asString())));
//...
0
0 / 0 / 0
Регистрация: 09.03.2014
Сообщений: 14
09.11.2023, 16:48  [ТС]
[/QUOTE]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Дальше по обстоятельствам - конвертируй в нужную кодировку.
Вот тут-то и проблема, что и где нужно конвертировать, я вроде как понимаю. А то как это делать, какое-то настолько очевидное знание, что никто об этом нигде не пишет.
Цитата Сообщение от Алексей1153 Посмотреть сообщение
C++
1
((*i)["place"].asString())
вот это выражение возвращает строку в utf8
Вот тут и хотелось бы разобраться, Json::ValueIterator вроде как предоставляет доступ к очередному Json::Value в котором по ключу "place" находится нужное мне значение в кодировке utf-8. А как его скормить wxTreeCtrl?
Вот уважаемый anmartex вроде бы дело предлагает (пока не пробовал)
Цитата Сообщение от anmartex Посмотреть сообщение
C++
1
TreeCtrl1->AppendItem(root, wxString::FromUTF8(((*i)["place"].asString())));
И как обратно записать из TreeCtrl (вроде как wxString) в utf-8?
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
09.11.2023, 17:50
Цитата Сообщение от LarryFlint Посмотреть сообщение
А то как это делать, какое-то настолько очевидное знание, что никто об этом нигде не пишет.
Так вы бы так и спросили
А то wx, Code::Blocks, JSon
А оказывается вопрос-то простой и конкретный

Добавлено через 3 минуты
Цитата Сообщение от LarryFlint Посмотреть сообщение
И как обратно записать из TreeCtrl (вроде как wxString) в utf-8?
Гугл же "wxString to utf8"

https://docs.wxwidgets.org/lat... tring.html

Public Member Functions --> Conversions
C++
1
2
const wxScopedCharBuffer    utf8_str () const
const std::string   utf8_string () const
0
0 / 0 / 0
Регистрация: 09.03.2014
Сообщений: 14
10.11.2023, 10:01  [ТС]
Цитата Сообщение от KSergey9 Посмотреть сообщение
C++
1
2
const wxScopedCharBuffer utf8_str () const
const std::string utf8_string () const
Я как раз об этом. Вот что это такое?
Вроде как функция "utf8_str ()", константная, возвращает значение типа "wxScopedCharBuffer", или как? "const" там в начале что означает? wxScopedCharBuffer кто такой, чем знаменит?

К примеру вот я получаю от TreeCtrl значение wxString, нужно его записать в Json::Value, Json::Value сохраняет файл в utf8, т.е. ему надо сконвертировать wxString в utf8
C++
1
2
3
4
5
6
Json::Value getChildKnot(wxTreeItemId root, wxTreeCtrl* tree){
    Json::Value result;
    result["name"] = std::string(tree->GetItemText(root));
     ........................
    return result;
}
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
10.11.2023, 10:14
Цитата Сообщение от LarryFlint Посмотреть сообщение
кто такой, чем знаменит?
Вы всерьёз полагаете, что кто-то будет для вас искать нужные места в справке и вам сюда копировать?
Вы прочитали справку? что для вас там не понятно? что-то не понятно - задать уточняющий вопрос на форуме - дело нормальное. А ожидать, что вам кто-то всё разжует... ну эта, школа закончилась же. Взрослая жизнь, все дела.

Добавлено через 6 минут
Во я просто взял и загуглил "wxwidgets GetItemText"
В списке нагугленного выбрал ссылку про wxTreeCtrl Class Reference
(я рассказываю не для хвастовства, а вам подсказать алгоритм "как узнавать то, что я не знаю")

В справке находим:

virtual wxString GetItemText (const wxTreeItemId &item) const
Returns the item label. More...

Отлично, возвращает wxString, по моему сообщению выше мы уже видели, что у этого класса есть метод utf8_string() - он нам явно подходит, сразу std::string возвращает.

Тогда по идее должно получиться так:
C++
1
result["name"] = tree->GetItemText(root).utf8_string();
Добавлено через 3 минуты
Цитата Сообщение от LarryFlint Посмотреть сообщение
"const" там в начале что означает?
Либо в любой книжке по С++ найти раздел, где это написано, либо прям так и загуглить ваш вопрос:

"C++ что означает const для возвращаемого из метода типа"
Например, первая же ссылка в моём гугле ведут на этот форум.
Надеюсь, там есть ответ (не читал)
Ключевое слово const для возвращаемого значения из функции

Ну и другие результаты поиска - тоже по делу

(я бы написал ответ, но я сам его не очень точно знаю, сорри)
0
 Аватар для Nishen
1357 / 856 / 365
Регистрация: 26.02.2015
Сообщений: 3,814
10.11.2023, 14:32
const там, потому что Мейерс говаривал использовать const везде, где только можно. Если просто возвращать объект из метода, то иногда его можно использовать довольно необычным способом:

C++
1
2
3
4
5
6
const Rational operator*(const Rational& lhs, const Rational& rhs);
 
Rational a, b, c;
 
(a * b) = c;
if (a * b = c) ...
Возврат константного объекта на этапе компиляции покажет тут ошибку.
1
0 / 0 / 0
Регистрация: 09.03.2014
Сообщений: 14
10.11.2023, 15:07  [ТС]
Цитата Сообщение от KSergey9 Посмотреть сообщение
Тогда по идее должно получиться так:
C++
1
result["name"] = tree->GetItemText(root).utf8_string();
Должно, но не получается
JSON
1
2
3
4
5
     "places" : [
         {
            "name" : "\u041c\u0430\u0433\u0430\u0437\u0438\u043d"
         }
      ]
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
10.11.2023, 15:21
Это вполне нормальная запись для Json / XML
Вполне возможно, что JsonCpp иначе не умеет.
Ну либо надо смотреть настройки JsonCpp, может там можно задать режим.

В любом случае прочитаться такой Json должен корректно

Добавлено через 2 минуты
Вообще если вам надо записать простой Json статичной структуры - я бы просто сформировал его текст в программе - да и все, без всяких библиотек.

Добавлено через 1 минуту
Вот ответ прям на ваш вопрос.
Опять же гугл и 4 минуты

https://stackoverflow.com/ques... ed-unicode
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.11.2023, 15:21
Помогаю со студенческими работами здесь

Снова кодировка.
Значит не понятно вообще в чем проблема. Вот файл my.ini (версия Mysql 5.1): SHOW CREATE TABLE моятаблица; DEFAULT...

Опять и снова кодировка
Привет форумчанам! Закинула сайт на хостинг, все файлы в кодировке utf8, БД создала тоже в utf8, информация отображает прекрасно, НО...

И снова кодировка в Debian lenny
Третий день мучаюсь с кодировкой в системе. Настроил на cp1251 для совместимости с виндой. Проблема: при создании нового файла или...

Снова хром, снова сапопроизвольно открывается, снова bkrfdf.xyz и казино
Здравствуйте! Собственно, проблема уже не новая, хотя, как показывают сообщения форума, за последние дни выскочившая у многих. Через...

Как сделать чтобы таймер дойдя до 0 стартовал снова и снова?
Здравствуйте :) Как сделать чтобы таймер дойдя до 0 стартовал снова и снова? TimerSec = 59; TimerMin = 6; for(int i = TimerSec;...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru