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

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

Показать сообщение отдельно
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,048
Записей в блоге: 17

iconv - C++

13.12.2012, 22:29. Просмотров 5951. Ответов 11
Метки (Все метки)

Есть такая библиотека как 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, уменьшаются на количество преобразованных символов, т.е. показывают сколько еще осталось в выходном буфере места и сколько осталось преобразовать символов в входной строке соответственно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru