Форум программистов, компьютерный форум 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++ Строки (Расположить слова строки в порядке, обратном исходному) Здравствуйте,помогите пожалуйста. Задание: Расположить слова строки в порядке, обратном исходному. подробнее

Показать сообщение отдельно
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
13.12.2012, 22:29     iconv
Есть такая библиотека как iconv для преобразования кодировок http://www.cyberforum.ru/blogs/131347/blog533.html
Стоит задача написать простенькую обвертку для преобразования utf8 в win1251 в плюсовом стиле вроде
C++
1
std::string utf8_to_win1251(const std::string& instr)
Но вот не могу найти нормально руководства где описывалось что и как http://www.gnu.org/software/libc/man...sion-Interface
C++
1
size_t iconv (iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft)
В общем непонятно что именно возвращает ф-ция, и почему параметры указатели на указатель, и почему размеры передаются тоже по адресу.

И главный вопрос как узнать какого размера нужен будет выходной буфер что бы все поместилось...

Набросок пока такой
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
#include <string>
#include "iconv.h"
#pragma comment(lib,"iconv-bcb.lib") // либа под Builder
//---------------------------------------------------------------------------
namespace my{
//---------------------------------------------------------------------------
std::string utf8_to_win1251(const std::string& instr)
{
    iconv_t cd;
 
    cd = iconv_open("CP1251", "UTF-8");
    if( cd == (iconv_t)(-1) )
                         throw std::runtime_error("Не удалось открыть iconv");
 
    errno = 0;  // ???
    int se;
 
    size_t in_length= instr.length();
    size_t out_length = 4048; // ???
 
    const char* in_buf= instr.c_str();   // ???
    char* out_buf= new char[out_length];   // ???
 
    const char* in = in_buf;
    char* out = out_buf;
 
    size_t  k = iconv(cd, &in,   &in_length,
                                                &out,  &out_length );
    se = errno;   // ???
 
    if(k)  throw std::runtime_error("Ошибка в k=/=0 ");
    if(se)  throw std::runtime_error("Ошибка в errno");
 
    iconv_close(cd);
 
    std::string outstr(out_buf); 
 
    delete[] out_buf;  // ???
    return outstr;
}
//---------------------------------------------------------------------------
}
//---------------------------------------------------------------------------
Добавлено через 5 часов 2 минуты

Решил так
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
//---------------------------------------------------------------------------
namespace my{
//---------------------------------------------------------------------------
std::string utf8_to_win1251(const std::string& instr)
{
    std::string outstr;
    iconv_t cd;
 
    cd = iconv_open("CP1251", "UTF-8");
    if( cd == (iconv_t)(-1) )
                         throw std::runtime_error("Не удалось открыть дескриптор iconv");
 
    size_t in_size= instr.size();
    const char* in= instr.c_str();
 
    char out_buf[BUF_SIZE];
    char* out;
    size_t out_size;
 
    size_t  k;
 
    while(in_size > 0)
        {
            out = out_buf;
            out_size = BUF_SIZE;
 
            errno = 0;
            k = iconv(cd, &in,  &in_size, &out, &out_size );
 
            if(k == (size_t)-1 && errno) throw std::runtime_error("Ошибка");
            outstr.append(out_buf,BUF_SIZE-out_size);
        }
 
     if(iconv_close(cd)!=0 )
            std::runtime_error("Не удается закрыть дескриптор iconv");
 
return outstr;
}
//---------------------------------------------------------------------------
}
//---------------------------------------------------------------------------
Добавлено через 6 минут
Дело в том что ф-ция iconv() использует передаваемые ей параметры и изменяет их.

После её вызова outbytesleft, inbytesleft, уменьшаются на количество преобразованных символов, т.е. показывают сколько еще осталось в выходном буфере места и сколько осталось преобразовать символов в входной строке соответственно
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 03:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru