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

iconv - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Проверка многоугольника на выпуклость http://www.cyberforum.ru/cpp-beginners/thread730427.html
Здравствуйте. Не заходит вырезано задача. Не могу понять, почему. Проверял на схожесть знаков ориентированные площади треугольников из точек. Код: #include <iostream> #include <vector> #include <algorithm>
C++ Перевод из 2-ой в 8-ую СС Необходимо реализовать перевод чисел из двоичной в восьмеричную систему счисления. http://www.cyberforum.ru/cpp-beginners/thread730410.html
Матрица (Найти вектор B(l), каждый элемент которого равен среднему арифметическому элементов...) C++
Задана матрица A(k,l). Найти вектор B(l), каждый элемент которого равен среднему арифметическому элементов соответствующего столбца матрицы А. Похожие темы http://www.cyberforum.ru/csharp-beginners/thread591028.html http://www.cyberforum.ru/turbo-pascal/thread515227.html мой код #include <iostream> #include <time.h> using namespace std;
Составить процедуру, выполняющую сжатие массива удалением элементов, значение которых меньше заданного числа C++
Составить процедуру, выполняющую сжатие массива удалением элементов, значение которых меньше заданного числа. Вывести на экран максимальное значение среди удалённых элементов. Решите пожалуйста, кто сможет. Я в программировании не шарю, а лабу надо сделать
C++ Прочитать одной строкой с файла http://www.cyberforum.ru/cpp-beginners/thread730382.html
собственно в этом и вопрос, как считать целой строкой #include <iostream> #include <iomanip> #include <sstream> #include <string> #include <fstream> using namespace std; void process_all_transactions
C++ Строки (Расположить слова строки в порядке, обратном исходному) Здравствуйте,помогите пожалуйста. Задание: Расположить слова строки в порядке, обратном исходному. подробнее

Показать сообщение отдельно
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.12.2012, 13:10     iconv
Я вот так писал в свое время.

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
    template <class CharT, class ExternCharT>
    std::codecvt_base::result convert(CharT*& in_pointer, size_t in_size, ExternCharT*& out_pointer, size_t out_size,
            const std::string& from_code, const std::string& to_code)
    {
        iconv_t converter = iconv_open(to_code.c_str(), from_code.c_str());
        if (converter == iconv_t(-1))
        {
            throw IconvError("Converter opening error: " + Impl::errno_open());
        }
        char* in_pointer_for_conv = (char*)in_pointer;
        char* out_pointer_for_conv = (char*)out_pointer;
        Impl::trace(in_pointer_for_conv, in_size, out_pointer_for_conv, out_size);
        size_t result = iconv(converter, &in_pointer_for_conv, &in_size, &out_pointer_for_conv, &out_size);
        Impl::trace(in_pointer_for_conv, in_size, out_pointer_for_conv, out_size);
        in_pointer = (CharT*)in_pointer_for_conv;
        out_pointer = (ExternCharT*)out_pointer_for_conv;
        if (result == size_t(-1))
        {
            Impl::errno_convert();
            iconv_close(converter);
            if (errno == E2BIG || errno == EINVAL)
            {
                return std::codecvt_base::partial;
            }
            return std::codecvt_base::error;
        }
        iconv_close(converter);
        return std::codecvt_base::ok;
    }
Но у меня используется эта обретка через std::codecvt.

К примеру перекодировка из ucs2 в 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
27
28
29
30
31
32
33
34
35
36
template<class CharT>
typename ucs2utf8codecvt<CharT>::result 
ucs2utf8codecvt<CharT>::do_out(std::mbstate_t& /* state */,
                        const intern_type* from,
                        const intern_type* from_end,
                        const intern_type*& from_next,
                        extern_type* to,
                        extern_type* to_end,
                        extern_type*& to_next) const
{
    to_next = to;
    from_next = from;
    size_t from_size = (from_end - from_next) * sizeof(intern_type);
    size_t to_size = (to_end - to_next) * sizeof(extern_type); 
    return convert(from_next, from_size, to_next, to_size, 
                    (ucs2_be ? "UCS-2BE" : "UCS-2LE"), "UTF-8");
 
} // do_out
 
template<class CharT>
typename ucs2utf8codecvt<CharT>::result 
ucs2utf8codecvt<CharT>::do_in(std::mbstate_t& /* state */,
                       const extern_type* from,
                       const extern_type* from_end,
                       const extern_type*& from_next,
                       intern_type* to,
                       intern_type* to_end,
                       intern_type*& to_next) const
{
    to_next = to;
    from_next = from;
    size_t to_size = (to_end - to) * sizeof(intern_type);
    size_t from_size = (from_end - from) * sizeof(extern_type);
    return Locale::Convert::convert(from_next, from_size, to_next, to_size, "UTF-8", 
                    (ucs2_be ? "UCS-2BE" : "UCS-2LE"));
} // do_in
Добавлено через 10 минут
Ну и само использование из класса converter типа такого:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    do
    {
      charT* to_next;
      const fromCharT* old_from_next = from_next;
      r = cvt.in(state, from_next, str.data() + str.length(), from_next, 
                 to_, to_ + toSize_, to_next);
      if (r == std::codecvt_base::noconv)
      {
         converted.append(no_conversion(str));
         break;
      }
      if (r == std::codecvt_base::partial && old_from_next == from_next)
      {
         r = std::codecvt_base::error;
      }
      converted.append(to_, static_cast<size_t>(to_next - to_));
    }
    while (r == std::codecvt_base::partial);
 
Текущее время: 11:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru