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

iconv - C++

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

Показать сообщение отдельно
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
14.12.2012, 13:10
Я вот так писал в свое время.

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);
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru