Форум программистов, компьютерный форум CyberForum.ru

[mingw] не видит <codecvt> - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Обертка над boost::lexical_cast для работы с unsigned типами http://www.cyberforum.ru/cpp/thread1651946.html
Пару дней назад выяснилось, что boost::lexical_cast не удовлетворяет нескольким требованиям в моей программе. boost::lexical_cast отказывается обрабатывать и выбрасывает исключение, если имеются пробелы в начале или в конце входной строки. Также для unsigned типов, отрицательные значения обрабатываются нормально, т.е., например, boost::lexical_cast<unsigned int>("-1") даст вполне валидное...
C++ Hex to Ascii Всем привет! Работаю с АЦП, и ему надо отправить ascii код (55H 55H 00H 00H AAH). (в виде char будет (UU ª), просто так отправить не удалось) Попробовал отправить hex (55 55 00 00 AA), не принимает. Кто-нибудь может мне помочь вывести строчку "UU ª" хотя бы на командную строку? http://www.cyberforum.ru/cpp/thread1650678.html
C++ QtCipherSqlitePlugin sqlite3_rekey не шифрует
Пытаюсь сменить пароль на БД. QSqlDriver *driver=myDatabase.driver(); QVariant handle=driver->handle(); Q_ASSERT_X(handle.isValid(), Q_FUNC_INFO, "Invalid handle of QSqlDriver"); if(handle.isValid() && qstrcmp(handle.typeName(), "sqlite3*")!=0) return false; sqlite3* db=*static_cast<sqlite3* const*>(handle.data()); if(db==NULL)
C++ Инструмент для быстрого создания установщиков программ
Есть ли какой-нибудь инструмент для быстрого создания установщиков программ, как например InnoSetup, но для C++? Или хотя бы приближенный к этому.
C++ Как скомпилировать Lammps под windows? http://www.cyberforum.ru/cpp/thread1648671.html
Добрый день! Очень нужна помощь в установке и запуске программы молекулярной динамики LAMMPS под Windows. Программу установил, создал bat. файл запуска,но программа все равно не работает. Я новичок в программировании, есть ли простой способ установки и запуска данной программы.
C++ Как правильно создать ModBus ASCII запрос? Адрес - 26 Код функции 03h начало - 0000 Количество -0004 расчет LRC char calculateLRC( char b, int n){ char lrc = 0x00; for (int i = 1; i < n; i++) { подробнее

Показать сообщение отдельно
hoggy
6369 / 2587 / 452
Регистрация: 15.11.2014
Сообщений: 5,722
Завершенные тесты: 1

[mingw] не видит <codecvt> - C++

31.01.2016, 21:50. Просмотров 577. Ответов 10
Метки (Все метки)

всем привет.

есть библиотека, которая изначально разрабатывалась в msvc2013.
к библиотеке есть требование - кросс-платформа,
и отсутствие внешних зависимостей.

то есть, нельзя подтягивать буст,
и подобные тяжеловесные вещи.

казалось бы - никаких левых зависимостей,
стандартная библиотека во все поля.
однако, при попытке портануться на mingw (942, что идет в коробке с qt5.5.1),
вылезла проблема:

для работы понадобилось выполнять преобразования кодировок текста.
наиболее актуальным является конвертация utf8 <----> unicode

что в коде выглядит,
как преобразование std::string <----> std::wstring

что бы было понятнее,
проиллюстрирую этот момент:

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
// cmdconv.h
 
#pragma once
 
namespace cmd{
 
// =======================================================================
// =======================================================================
 
    namespace multibyte {
        std::string  convert(const wchar_t* s);
        std::wstring convert(const char*    s);
        std::string  convert(const std::wstring& s);
        std::wstring convert(const std::string&  s);
    }// namespace multibyte 
 
    namespace utf8 {
        std::string  convert(const std::wstring& s);
        std::wstring convert(const std::string&  s);
    }// namespace utf8 
 
    namespace stdlocal {
 
        std::string convert(
            const wchar_t* s,
            const size_t len,
            const std::locale& loc = std::locale(),
            const char default_char = '?'
        );
        std::string convert(
            const wchar_t* s, 
            const std::locale& loc = std::locale(""), 
            const char default_char = '?'
        );
        std::string convert(
            const std::wstring& s, 
            const std::locale& loc = std::locale(""), 
            const char default_char = '?'
        );
        std::wstring convert(
            const char* s,
            const std::locale& loc = std::locale("")
        );
        std::wstring convert(
            const std::string& s, 
            const std::locale& loc = std::locale("") 
        );
        std::wstring convert(
            const char* s, 
            const size_t len, 
            const std::locale& loc = std::locale()
        );
 
    } //namespace stdlocal 
 
// =======================================================================
// =======================================================================
 
}//namespace cmd
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
130
131
132
133
134
135
136
137
138
//cmdconv.cpp
 
#include "precompiled.h"
 
#include <cmd/cmdconv.h>
 
namespace cmd{
 
// =======================================================================
// =======================================================================
 
    namespace multibyte {
 
        std::string convert(const std::wstring& s)
            { return convert( s.c_str() ); }
        std::wstring convert(const std::string& s)
            { return convert(s.c_str()); }
 
        std::string convert(const wchar_t* s)
        { 
            const size_t len = wcslen(s);
            std::string result(len,'\0');
 
            #ifdef _MSC_VER
                size_t count = 0;
                const auto size_ = result.size();
                wcstombs_s(&count, &result[0], size_, s, size_ );
            #else
                std::mbstate_t state = std::mbstate_t();
                std::wcsrtombs( &result[0], &s, result.size(), &state);
            #endif
 
            return result;
        }
 
        std::wstring convert(const char* s)
        { 
            std::mbstate_t state  = std::mbstate_t(); 
        
            size_t len;
            wchar_t wc[4] = {};
            std::wstring result;
            const char* end = s + std::strlen(s);
        
            //TODO: remove warning:
            //conversion to 'size_t {aka unsigned int}' from 'int' 
            //may change the sign of the result [-Wsign-conversion] 
            while ((len = std::mbrtowc(wc, s, end - s, &state)) > 0 )
            {
                result += wc; s += len;
                for (auto& ch: wc)  ch = L'\0';
            }
            return result;
        }
    }//namespace multibyte
 
 
    namespace utf8 {
        
    #if defined(__MINGW__) || defined(__MINGW32__)
    
    // no support
    
    #else
 
        std::string convert(const std::wstring& s)
        { 
            typedef std::codecvt_utf8<wchar_t>
                convert_typeX;
            std::wstring_convert<convert_typeX,wchar_t>
                converterX;
            return converterX.to_bytes(s);
        }
        std::wstring convert(const std::string&  s)
        { 
            typedef std::codecvt_utf8<wchar_t>
                convert_typeX;
            std::wstring_convert<convert_typeX,wchar_t>
                converterX;
            return converterX.from_bytes(s);
        }
    #endif
            
    }//namespace utf8 
 
    namespace stdlocal {
 
        std::wstring convert(const char* first, const size_t len, const std::locale& loc)
        {
            if(len == 0)
                return std::wstring();
 
            const std::ctype<wchar_t>& facet =
                std::use_facet< std::ctype<wchar_t> >(loc);
 
            const char* last = first + len;
 
            std::wstring result(len, L'\0');
 
            facet.widen(first, last, &result[0]);
            return result;
        }
 
        std::string convert(
            const wchar_t* first,
            const size_t len,
            const std::locale& loc,
            const char default_char
        )
        {
            if(len == 0)
                return std::string();
 
            const std::ctype<wchar_t>& facet =
                std::use_facet<std::ctype<wchar_t> >(loc);
 
            const wchar_t* last  = first + len;
 
            std::string result( len, default_char );
            facet.narrow( first, last, default_char, &result[0] );
            return result;
        }
 
        std::string  convert( const wchar_t* s, const std::locale& loc, const char default_char )
            { return convert(s, std::wcslen(s), loc, default_char); }
        std::string  convert(const std::wstring& s, const std::locale& loc, const char default_char)
            { return convert(s.c_str(), s.length(), loc, default_char);  }
        std::wstring convert( const char* s, const std::locale& loc)
            { return convert(s, std::strlen(s), loc); }
        std::wstring convert( const std::string& s, const std::locale& loc)
            { return convert(s.c_str(), s.length(), loc); }
 
    }//namespace stdlocal
 
// =======================================================================
// =======================================================================
 
}//namespace cmd


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//precompiled.h
 
#pragma once
 
#pragma message("PRECOMPILE CMDCONV HEADER ...")
 
#include <cassert>
 
#if defined(__MINGW__) || defined(__MINGW32__)
    #include <stdexcept>
    #include <cstring>
    #include <locale>
#else
 
    //TODO: No such file or directory
    // WTF ????
    #include <codecvt>
#endif
 
#include <string>
оказывается, mingw не умеет юникод!
он вообще не знает ни о каких
C++
1
#include <codecvt>
гугл не утешителен.
в основном советуют смотреть в сторону boost.


но я себе этого позволить не могу.

какие могут быть обходные пути?
или как можно заставить работать мои конвертеры?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru