Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
 Аватар для SkYMaaN
25 / 19 / 9
Регистрация: 05.04.2019
Сообщений: 338

Проблема преобразования символов типа wstring в string

31.10.2020, 18:32. Показов 5624. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть следующий код который преобразовывает wstring in string, но при попадании символов выводит кракозяблики:
C++
1
2
3
const wchar_t* s = sheet->readStr(row, col);
wstring wstr(s);
string str(wstr.begin(),wstr.end());
Как это исправить?
Или может есть более удобный способ получить символы из const wchar_t* в формате UTF-8?

Добавлено через 11 минут
Цитата Сообщение от SkYMaaN Посмотреть сообщение
символов
буквенных**
с числами всё ок
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.10.2020, 18:32
Ответы с готовыми решениями:

Ошибки преобразования числа типа Double в String
Доброго времени суток, форумчане. У меня серьезная проблема с преобразованием , взгляните: begin begin var i: Double; ...

Преобразование типов: проблема преобразования string во float
Всем привет. Подскажите как побороть ошибку: Неявное преобразование типа "string" в "float" невозможно То есть на экран у...

Проблема преобразования текстового типа данных в числа?
Ситуация такая есть число в формате текста, например '8.1230000', так вот стандартные типы преобразований типов данных типа CDec или CDbl...

33
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.10.2020, 18:38
Цитата Сообщение от SkYMaaN Посмотреть сообщение
попадании символов выводит кракозяблики:
при попадении чего и куда?
строки string в стратосферу?

ты в состоянии внятно выражать свои мысли?
у нас тут нынче все телепаты в отпусках.

Цитата Сообщение от SkYMaaN Посмотреть сообщение
способ получить символы из const wchar_t* в формате UTF-8?
для Windows:

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#ifdef _WIN32
 
 
#include <string>
#include <cassert>
#include <windows.h>
//==============================================================================
//==============================================================================
 
template<class ch> 
inline size_t str_length(const ch* text) noexcept
{
    assert(text);
    const auto* cur = text;
    while(*cur != 0)
        ++cur;
    return static_cast<size_t>(cur - text);
}
 
//==============================================================================
//==============================================================================
 
namespace tools
{
    // Convert a wide Unicode string to an UTF8 string  (wchar_t ---> char)
    namespace utf8
    {
        ::std::string convert(const wchar_t* text, const size_t len)
        {
            assert(text);
            assert(::str_length(text) >= len);
 
            if (text[0] == 0)
                return ::std::string();
 
            const int size_needed = ::WideCharToMultiByte(
                CP_UTF8, 0, text,
                static_cast<int>(len),
                NULL, 0, NULL, NULL
            );
 
            assert(size_needed > 0);
            const size_t cnt = static_cast<size_t>(size_needed);
            ::std::string strTo(cnt, 0);
 
            ::WideCharToMultiByte(
                CP_UTF8, 0, text,
                static_cast<int>(len),
                &strTo[0],
                size_needed,
                NULL, NULL
            );
            return strTo;
        }
 
        ::std::string convert(const wchar_t* text)
        {
            assert(text);
            if (text[0] == 0)
                return ::std::string();
            const size_t len = ::str_length(text);
            return ::tools::utf8::convert(text, len);
        }
        
        ::std::string convert(const ::std::wstring& text)
        {
            return ::tools::utf8::convert(
                text.c_str(),
                text.length()
            );
        }
 
    } // namespace utf8
 
    // Convert an UTF8 string to a wide Unicode String  (char ---> wchar_t)
    namespace utf8
    {
        ::std::wstring convert(const char* text, const size_t len)
        {
            assert(text);
            assert(::str_length(text) >= len);
 
            if (text[0] == 0)
                return std::wstring();
 
            int size_needed = ::MultiByteToWideChar(
                CP_UTF8, 0, text,
                static_cast<int>(len),
                NULL, 0
            );
 
            assert(size_needed > 0);
            const size_t cnt = static_cast<size_t>(size_needed);
            ::std::wstring wstrTo(cnt, 0);
 
            ::MultiByteToWideChar(
                CP_UTF8, 0, text,
                static_cast<int>(len),
                &wstrTo[0],
                size_needed
            );
            return wstrTo;
        }
 
        ::std::wstring convert(const char* text)
        {
            assert(text);
            if (text[0] == 0)
                return ::std::wstring();
            const size_t len = ::str_length(text);
            return ::tools::utf8::convert(text, len);
        }
        
        ::std::wstring convert(const ::std::string& text)
        {
            return ::tools::utf8::convert(
                text.c_str(),
                text.length()
            );
        }
 
    } // namespace utf8 
 
} // namespace tools
 
//==============================================================================
//==============================================================================
 
#endif // _WIN32

кросс-платформенный способ.
требует с++11
объявлен морально-устаревшим в с++17

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#ifndef _WIN32
 
// #define _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING
 
#include <codecvt>
#include <cassert>
#include <string>
//==============================================================================
//==============================================================================
 
template<class ch> 
inline size_t str_length(const ch* text) noexcept
{
    assert(text);
    const auto* cur = text;
    while(*cur != 0)
        ++cur;
    return static_cast<size_t>(cur - text);
}
 
//==============================================================================
//==============================================================================
namespace tools
{
    namespace utf8
    {
        ::std::string convert(const wchar_t* s, const size_t len)
        {
            assert(s);
            assert(::str_length(s) >= len);
 
            using conv = ::std::codecvt_utf8<wchar_t>;
            ::std::wstring_convert<conv, wchar_t>
                converter;
            return converter.to_bytes(s, s + len);
        }
 
        ::std::string convert(const wchar_t* s)
        {
            assert(s);
            using conv = ::std::codecvt_utf8<wchar_t>;
            ::std::wstring_convert<conv, wchar_t>
                converter;
            return converter.to_bytes(s);
        }
 
        ::std::string convert(const ::std::wstring& s)
        {
            using conv = ::std::codecvt_utf8<wchar_t>;
            ::std::wstring_convert<conv, wchar_t>
                converter;
            return converter.to_bytes(s);
        }
    } // namespace utf8 
 
//..............................................................................
 
    namespace utf8 
    {
        ::std::wstring convert(const char* s, const size_t len)
        {
            assert(s);
            assert(::str_length(s) >= len);
 
            using conv = ::std::codecvt_utf8<wchar_t>;
            ::std::wstring_convert<conv, wchar_t>
                converter;
            return converter.from_bytes(s, s + len);
        }
 
        ::std::wstring convert(const char* s)
        {
            assert(s);
            using conv = ::std::codecvt_utf8<wchar_t>;
            ::std::wstring_convert<conv, wchar_t>
                converter;
            return converter.from_bytes(s);
        }
 
        ::std::wstring convert(const ::std::string& s)
        {
            using conv = ::std::codecvt_utf8<wchar_t>;
            ::std::wstring_convert<conv, wchar_t>
                converter;
            return converter.from_bytes(s);
        }
 
    } // namespace utf8 
 
} // namespace tools
 
//==============================================================================
//==============================================================================
#endif // !!_WIN32
1
 Аватар для SkYMaaN
25 / 19 / 9
Регистрация: 05.04.2019
Сообщений: 338
31.10.2020, 18:40  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
ты в состоянии внятно выражать свои мысли?
Прошу прощения.
Цитата Сообщение от hoggy Посмотреть сообщение
для Windows:
Благодарю.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
31.10.2020, 18:41
Цитата Сообщение от SkYMaaN Посмотреть сообщение
Как это исправить?
Не делать так.

Цитата Сообщение от SkYMaaN Посмотреть сообщение
Или может есть более удобный способ получить символы из const wchar_t* в формате UTF-8?
Этот способ вообще ничего не делает с символами, это просто копирование целочисленных значений из одного типа в другой.
А вам же нужно преобразование кодировок.
Если принять, например, что в wstring находится utf-32, то utf-8 получается так:
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
27
28
29
30
31
32
33
34
std::string convert(std::wstring const & src)
{
    std::string result;
    for(auto cp : src) {
        if (cp < 0x80) {
            result.push_back(static_cast<uint8_t>(cp));
        }
        else if (cp < 0x800) {  
            uint8_t chs[] = { 
                static_cast<uint8_t>((cp >> 6) | 0xc0),
                static_cast<uint8_t>((cp & 0x3f) | 0x80)                     
            };
            result.append(std::begin(chs), std::end(chs));
        }
        else if (cp < 0x10000) {
            uint8_t chs[] = { 
                static_cast<uint8_t>((cp >> 12) | 0xe0),
                static_cast<uint8_t>(((cp >> 6) & 0x3f) | 0x80),
                static_cast<uint8_t>((cp & 0x3f) | 0x80)
            };
            result.append(std::begin(chs), std::end(chs));
        }
        else {
            uint8_t chs[] = { 
                static_cast<uint8_t>((cp >> 18) | 0xf0),
                static_cast<uint8_t>(((cp >> 12) & 0x3f)| 0x80),
                static_cast<uint8_t>(((cp >> 6) & 0x3f) | 0x80),
                static_cast<uint8_t>((cp & 0x3f) | 0x80)
            };
            result.append(std::begin(chs), std::end(chs));
        }
    }
    return result;
}
Здесь есть онлайн пример: https://rextester.com/QFV79174

Для wstring в UTF-16 (Windows) алгоритм будет немного другой.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.10.2020, 18:47
Цитата Сообщение от SkYMaaN Посмотреть сообщение
Благодарю.
к себе в проект добавляй 3 файла.
первые два я тебе уже выше показал.

а 3й - хэдер, который ты и будешь прицеплять к своим main.cpp



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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
// utf8.hpp
 
#pragma once
#ifndef dTOOLS_UTF8_USED_ 
#define dTOOLS_UTF8_USED_ 1
 
#include <type_traits>
#include <cassert>
#include <string>
 
//==============================================================================
//==============================================================================
namespace tools
{
    namespace utf8 
    {
        // Convert a wide Unicode string to an UTF8 string
        ::std::string convert(const wchar_t* text, const size_t len);
        ::std::string convert(const wchar_t* text);
        ::std::string convert(const ::std::wstring& text);
 
        // Convert an UTF8 string to a wide Unicode String
        std::wstring convert(const char* text, const size_t len);
        std::wstring convert(const char* text);
        std::wstring convert(const ::std::string& text);
 
        // char ------------> std::string
        // wchar_t ---------> std::wstring
        template<class s> auto convert(const s& src)
        { 
            const auto* p = &src[0];
            assert(p);
            return ::tools::utf8::convert(p); 
        } 
 
        template<class ch, class s>
            decltype(auto) convert_to(s&& src);
 
    } // namespace utf8 
 
} // namespace tools
 
//==============================================================================
//=== dfor_lvalue ==============================================================
#ifndef dTOOLS_FOR_LVALUE_USED_ 
#define dTOOLS_FOR_LVALUE_USED_
namespace tools
{
    #define dfor_lvalue(t) ::tools::for_lvalue<t>* = nullptr
    template<class t, class ret = void> 
        using for_lvalue
            = ::std::enable_if_t<
                ::std::is_lvalue_reference<t>::value,
                ret
            >;
 
    #define dfor_not_lvalue(t) ::tools::for_not_lvalue<t>* = nullptr
    template<class t, class ret = void> 
        using for_not_lvalue
            = ::std::enable_if_t<
                ! ::std::is_lvalue_reference<t>::value,
                ret
            >;
 
} // namespace tools
#endif // !dTOOLS_FOR_LVALUE_USED_
 
//==============================================================================
//==============================================================================
namespace tools
{
    namespace utf8 
    {
        namespace detail
        {
            template<bool> struct converter
            {
                template<class s, dfor_lvalue(s&&) > 
                static decltype(auto) convert(s&& src) noexcept
                    { return ::std::forward<s>(src); }
 
                template<class s,  dfor_not_lvalue(s&&)> 
                static auto convert(s&& src) noexcept
                    { return src; }
            };
 
            template<> struct converter<false>
            {
                template<class s>
                static auto convert(const s& src)
                    { return ::tools::utf8::convert(src); }
            };
 
        } // namespace detail
 
        template<class ch, class s> 
        decltype(auto) convert_to(s&& src)
        { 
            const auto* p = &src[0];
            assert(p);
            (void) p;
 
            using x = ::std::remove_pointer_t<decltype(p)>;
            using z = ::std::remove_cv_t<x>;
            enum { v = ::std::is_same<z, ch>::value };
            using conv_t = ::tools::utf8::detail::converter<v>;
            return conv_t::convert(::std::forward<s>(src)); 
        } 
 
    } // namespace utf8 
 
} // namespace tools
 
//==============================================================================
//==============================================================================
 
#endif // !dTOOLS_UTF8_USED_
после чего ты сможешь делать convert(твоя_строка);
и умная функция сама разбереццо куда и как ей конвертить.
она оптимизирована под особенности разных источников данных.
1
 Аватар для SkYMaaN
25 / 19 / 9
Регистрация: 05.04.2019
Сообщений: 338
31.10.2020, 18:51  [ТС]
hoggy, благодарю, сейчас попробую.
0
 Аватар для SkYMaaN
25 / 19 / 9
Регистрация: 05.04.2019
Сообщений: 338
31.10.2020, 19:10  [ТС]
hoggy,
Я создал два файла формата .cpp в них скопировал содержимое из ваших сообщений:
Цитата Сообщение от hoggy Посмотреть сообщение
для Windows:
и
Цитата Сообщение от hoggy Посмотреть сообщение
объявлен морально-устаревшим в с++17
Так же в каждом .cpp прописал #include к созданному .h
Создал .h и скопировал содержимое с вашего сообщения:
Цитата Сообщение от hoggy Посмотреть сообщение
а 3й - хэдер, который ты и будешь прицеплять к своим main.cpp
Подключил созданный .h к существующему .h своего проекта. Но кодировка при вызове функции
C++
1
convert()
не изменилась:
C++
1
2
3
const wchar_t* s = ....;
string str = tools::utf8::convert(s);
cout << "(" << col << " | " << row << ") = " << str << endl;
Что я неправильно сделал?
Миниатюры
Проблема преобразования символов типа wstring в string   Проблема преобразования символов типа wstring в string  
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.10.2020, 19:26
Цитата Сообщение от SkYMaaN Посмотреть сообщение
не изменилась
это - отличная новость.

я задал тебе три вопроса:
Цитата Сообщение от hoggy Посмотреть сообщение
при попадении чего и куда?
строки string в стратосферу?
ты в состоянии внятно выражать свои мысли?
вот что ты мне ответил:

Цитата Сообщение от SkYMaaN Посмотреть сообщение
Прошу прощения.
я тебя прощаю.
только я так и не понял: таки где у тебя там кракозябры то? в стратосфере?

и вот только сейчас картинка начинает проясняццо.
оказывается: проблема с кракозябрами в консоли.

запомни на будущие:
сначала ты должен сказать какая у тебя ось.
а затем: детальное описание проблемы.
приложив все необходимые криншоты, текст компилятора и тп.

что бы люди не тратили зря время на гадание на кофейной гуще.


тебе вообще не нужно конвертировать wstring в string
тебе нужно настроить консоль.

обычно во всех примерах показывается как настраивать консоль на режим 1251

utf-8:
C++
1
std::setlocale(LC_CTYPE, ".UTF-8");
1
 Аватар для SkYMaaN
25 / 19 / 9
Регистрация: 05.04.2019
Сообщений: 338
31.10.2020, 19:31  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
запомни на будущие:
Учту, моя оплошность.
Цитата Сообщение от hoggy Посмотреть сообщение
тебе вообще не нужно конвертировать wstring в string
Консоль только для наглядности.
Мне нужно ложить данные в JSON объект, библиотека которую я использую работает ( со слов разработчика ) только с UTF-8 кодировкой.
ht tps://git hub.com/nlohm ann/json/discussi ons/2455
0
 Аватар для SkYMaaN
25 / 19 / 9
Регистрация: 05.04.2019
Сообщений: 338
31.10.2020, 19:39  [ТС]
OC: Windows 10 PRO x64
Компилятор и среда - стандартные в Visual Studio
При попытке присвоить данные после использования функции:
C++
1
convert()
C++
1
2
3
const wchar_t* s = sheet->readStr(row, col);
string str = tools::utf8::convert(s);
j["р.Дніпро(річкова_вода)"] = str;
Получаю ошибку как раньше, что символы не UTF-8 кодировки:
Миниатюры
Проблема преобразования символов типа wstring в string  
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.10.2020, 19:56
Цитата Сообщение от SkYMaaN Посмотреть сообщение
Консоль только для наглядности.
судя по кракозябрам на твоем скриншоте,
данные были успешно преобразованы в utf-8

Цитата Сообщение от SkYMaaN Посмотреть сообщение
Мне нужно ложить данные в JSON
вот опять...
json - это что такое? чья-то библиотека, или сферический факкум?

ты как партизан на допросе.
1
 Аватар для SkYMaaN
25 / 19 / 9
Регистрация: 05.04.2019
Сообщений: 338
31.10.2020, 19:57  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
чья-то библиотека
Да, библиотека nlohmann::json
https://github.com/nlohmann/json
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.10.2020, 20:01
Лучший ответ Сообщение было отмечено SkYMaaN как решение

Решение

Цитата Сообщение от SkYMaaN Посмотреть сообщение
Получаю ошибку как раньше, что символы не UTF-8 кодировки:
судя по скриншоту это - nlohmann

он не умеет std::wstring
Note the library only supports UTF-8.

Цитата Сообщение от SkYMaaN Посмотреть сообщение
const wchar_t* s = sheet->readStr(row, col);
string str = tools::utf8::convert(s);
j["р.Дніпро(річкова_вода)"] = str;
заменить на:

C++
1
2
3
4
5
6
7
const wchar_t* s = sheet->readStr(row, col);
assert(s);
 
const auto key = tools::utf8::convert(L"р.Дніпро(річкова_вода)");
const auto val  = tools::utf8::convert(s);
 
j[key ] = val;
важно:
кодировка исходного файла так же должна быть utf-8
1
 Аватар для SkYMaaN
25 / 19 / 9
Регистрация: 05.04.2019
Сообщений: 338
31.10.2020, 20:04  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
он не умеет std::wstring
Да, мне разработчик так и ответил, я поэтому тему и создал
https://github.com/nlohmann/json/discussions/2455
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
31.10.2020, 20:30
Ну, преобразуйте в utf8.
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
std::string toUtf8(const std::wstring&str)
{
    std::string result;
    for(auto value:str)
    {
        if(value<128)
            result.push_back(value);
        else
        {
            std::string temp;
            unsigned sizeMask=128;
            for(;value>=64;value>>=6,sizeMask=(sizeMask>>1)|128)
                temp.push_back((value&63)|128);
            temp.push_back(sizeMask|value);
            result.insert(result.end(),temp.rbegin(),temp.rend());
        }
    }
    return result;
}
 
int main()
{
    std::wstring str=L"色は匂へど散りぬるを我が世誰ぞ常ならむ有為の奥山今日越えて浅き夢見じ酔ひもせず";
    std::cout<<toUtf8(str)<<std::endl;
    return 0;
}
1
 Аватар для SkYMaaN
25 / 19 / 9
Регистрация: 05.04.2019
Сообщений: 338
31.10.2020, 21:09  [ТС]
Renji,
если я вывожу в консоль значение j["р.Дніпро(річкова_вода)"] сразу после присвоения туда элементов - всё вывод на ура.
C++
1
2
3
4
5
 const wchar_t* s = sheet->readStr(row, col);
wstring wstr(s);
string str = toUtf8(wstr);
 j["р.Дніпро(річкова_вода)"] = str;
cout << j["р.Дніпро(річкова_вода)"] << endl;
Но если я вывожу функцией весь JSON элемент j:
C++
1
2
3
4
void getJ()
{
    cout << j.dump();
}
то получаю ошибку кодировки:
Миниатюры
Проблема преобразования символов типа wstring в string  
0
 Аватар для SkYMaaN
25 / 19 / 9
Регистрация: 05.04.2019
Сообщений: 338
31.10.2020, 21:11  [ТС]
Функция
C++
1
j.size()
перед
C++
1
j.dump()
возвращает цифру 6
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
31.10.2020, 21:20
Цитата Сообщение от SkYMaaN Посмотреть сообщение
Но если я вывожу функцией весь JSON элемент j:
А если вы вводите информацию не через toUtf8(wstr), а через u8"тот же самый текст"?
C++
1
2
if(toUtf8(L"ваш текст")==u8"ваш текст")
        std::cout<<"С toUtf8 все нормально, спрашивайте с автора json-библиотеки"<<std::endl;
1
 Аватар для SkYMaaN
25 / 19 / 9
Регистрация: 05.04.2019
Сообщений: 338
31.10.2020, 21:27  [ТС]
Renji, тоже подумал, что разницы нету.
А вот так выводит по одному присвоеному значению без ошибок:
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
27
    void getJ()
    {
        for (const auto& element : j["Найменування_показників"])
        {
            cout << element << endl;
        }
        for (const auto& element : j["Одиниці_вимірювання"])
        {
            cout << element << endl;
        }
        for (const auto& element : j["р.Десна(річкова_вода)"])
        {
            cout << element << endl;
        }
        for (const auto& element : j["р.Дніпро(річкова_вода)"])
        {
            cout << element << endl;
        }
        for (const auto& element : j["Дніпровська_водопровідна_станція"])
        {
            cout << element << endl;
        }
        for (const auto& element : j["Деснянська_водопровідная_станція"])
        {
            cout << element << endl;
        }
    }
Может ошибка допущена мной в создании JSON объекта? Вот его вид:
C++
1
2
3
4
5
6
7
8
9
json j =
    {
            { "Найменування_показників", {}},
            { "Одиниці_вимірювання", {}},
            { "р.Дніпро(річкова_вода)",   {}},
            { "р.Десна(річкова_вода)", {}},
            { "Дніпровська_водопровідна_станція", {}},
            { "Деснянська_водопровідная_станція", {}},
    };
Миниатюры
Проблема преобразования символов типа wstring в string  
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
31.10.2020, 21:47
Никаких проблем с созданием лично я не вижу. Делайте минимальный тестовый пример (json на одну пару имя:значение, вместо readStr просто L"какой-то текст") и пишите багреппорт.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.10.2020, 21:47
Помогаю со студенческими работами здесь

Отделение символов типа string
Не могли бы вы подсказать методы, строчки кода, которые бы позволили отделить от целевого предложения string, часть которую мне нужно...

В класс Money добавить перегрузку преобразования типа Money в string (и наоборот)
Здравствуйте, необходимо в класс Money добавить перегрузку преобразования типа Money в string (и наоборот). Вроде перегрузку...

Из string в wstring
Как можно получить wstring-строку из string-строки? (символы в строке латинские, поэтому проблем вроде бы возникать не должно)

Проблема с вводом данных типа String с клавиатуры
У меня есть к примеру вот такая часть кода и мне необходимо ввести данные с клавиатуры (несколько слов). Но после того как я записываю...

Смена мест символов в строке типа string
Допустим у меня есть какая-то строка, где есть символы 'A' 'B' и 'C': getline(cin, line); // line - строка типа string, например я ввёл...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru