Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
268 / 268 / 109
Регистрация: 22.08.2013
Сообщений: 907
1

Windows. iconv и командная строка

20.03.2017, 16:04. Просмотров 1529. Ответов 19
Метки нет (Все метки)

Привет.

В командной строке кодировка CP866 (через chcp проверял), код программы в UTF-8. Пытаюсь перекодировать UTF-8 строку в CP866 чтобы она нормально отображалась в командной строке, но выводится какой-то символ вместо буквы "п" (обратите внимание на первую строку на скриншоте).

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
#include <iostream>
#include <stdio.h>
 
#include <iconv.h>
 
int main()
{
    std::string inputString = "привет всем";
 
    iconv_t cd = iconv_open("UTF-8", "CP866");
 
    char* inbuf = &inputString[0];
 
    size_t inbytesleft = 1;
 
    char buf[100];
 
    char* outbuf = buf;
 
    size_t outbytesleft = 1;
 
    iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
 
    std::cout << buf << std::endl;
    std::cout << inputString << std::endl;
    std::cout << "lalka";
 
    return 0;
}
В чем может быть проблема? Заранее спасибо!
0
Миниатюры
Windows. iconv и командная строка  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.03.2017, 16:04
Ответы с готовыми решениями:

Командная строка
В командной строке задается признак фигуры, объем которой необходимо вычислить: s – шар...

Командная строка
как сделать вывод сообщений на русском языке(англ.) в командной строке? Почему ошибка в объявлении...

Командная строка в С++
В командной строке задается признак фигуры, объем которой необходимо вычислить: s – шар (аргумент...

командная строка
вот такой вопрос: можно ли получить в переменную то, что выводится в командной строке? например,...

19
6913 / 5978 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
20.03.2017, 16:32 2
Это какая-то самодельная библиотека, что ли? Ну мы же не знаем, что ты там напрограммировал.
В WinAPI есть функции для перекодировки.
0
268 / 268 / 109
Регистрация: 22.08.2013
Сообщений: 907
20.03.2017, 16:54  [ТС] 3
Цитата Сообщение от nmcf Посмотреть сообщение
Это какая-то самодельная библиотека, что ли? Ну мы же не знаем, что ты там напрограммировал.
Нет, это не самодельная.
https://www.gnu.org/software/libiconv/
0
6913 / 5978 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
20.03.2017, 17:30 4
Там сказано, что у iconv_open() порядок параметров обратный.
0
268 / 268 / 109
Регистрация: 22.08.2013
Сообщений: 907
20.03.2017, 17:52  [ТС] 5
Цитата Сообщение от nmcf Посмотреть сообщение
Там сказано, что у iconv_open() порядок параметров обратный.
Да, действительно. Я изменил порядок, но по-прежнему вместо нужной буквы выводится тот символ.
0
1201 / 723 / 165
Регистрация: 05.12.2015
Сообщений: 2,116
20.03.2017, 19:00 6
Razip, попробуйте явно указать литерал:
C++
1
std::string inputString = u8"привет всем";
0
268 / 268 / 109
Регистрация: 22.08.2013
Сообщений: 907
21.03.2017, 08:07  [ТС] 7
Цитата Сообщение от avgoor Посмотреть сообщение
Razip, попробуйте явно указать литерал:
C:\MyLittleProject\main.cpp|9|error: 'u8' was not declared in this scope|

Добавлено через 7 минут
Кстати, попробовал изменить кодировку на другую: из UTF-8 в UTF-8, из UTF-8 в CP1251, но все-равно выводился такой же символ. Возможно, проблема в том, как я пытаюсь вывести букву.
0
6913 / 5978 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
21.03.2017, 08:59 8
Ты описание до конца дочитал?
C++
1
2
3
4
5
6
7
8
9
10
11
    std::string inputString = "привет всем";
 
    iconv_t cd = iconv_open("CP866", "UTF-8");
 
    size_t inbytesleft = inputString.size();
 
    char buf[100];
 
    size_t outbytesleft = 100;
 
    iconv(cd, &(inputString.c_str()), &inbytesleft, &buf, &outbytesleft);
Добавлено через 2 минуты
Также не ясно, устанавливает ли функция '\0'.
Лучше WinAPI используй.
0
268 / 268 / 109
Регистрация: 22.08.2013
Сообщений: 907
21.03.2017, 11:13  [ТС] 9
Цитата Сообщение от nmcf Посмотреть сообщение
Ты описание до конца дочитал?
Нет.

Цитата Сообщение от nmcf Посмотреть сообщение
Также не ясно, устанавливает ли функция '\0'.
Что такое \0?

C:\MyLittleProject\main.cpp|18|error: lvalue required as unary '&' operand|

Вот это пишет про строку с iconv();

Добавлено через 4 минуты
Цитата Сообщение от nmcf Посмотреть сообщение
Лучше WinAPI используй.
А какие есть в WinAPI функции для изменения кодировки?

Добавлено через 17 секунд
Цитата Сообщение от nmcf Посмотреть сообщение
Лучше WinAPI используй.
А какие есть в WinAPI функции для изменения кодировки?

Добавлено через 1 час 34 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <fstream>
#include <iconv.h>
 
int main(int argc, char *argv[])
{
char src[] = "привет";
char dst[100];
 
size_t srclen = sizeof(src)/sizeof(*src);
size_t dstlen = srclen;
 
char * pIn = src;
char * pOut = ( char*)dst;
 
iconv_t conv = iconv_open("CP866","UTF-8");
iconv(conv, &pIn, &srclen, &pOut, &dstlen);
iconv_close(conv);
 
std::cout << dst;
}
В интернете нашел простой пример, переделал и все заработало. Буду разбираться в чем была проблема.
0
6913 / 5978 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
21.03.2017, 11:22 10
Я именно так и сделал, только длина была без учёта '\0'. Тогда так:
C++
1
2
3
4
5
6
7
8
9
10
11
    std::string inputString = "привет всем";
 
    iconv_t cd = iconv_open("CP866", "UTF-8");
 
    size_t inbytesleft = inputString.size() + 1;
 
    char buf[100];
 
    size_t outbytesleft = inbytesleft;
 
    iconv(cd, &(inputString.c_str()), &inbytesleft, &buf, &outbytesleft);
0
268 / 268 / 109
Регистрация: 22.08.2013
Сообщений: 907
21.03.2017, 12:12  [ТС] 11
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
#include <iostream>
#include <stdio.h>
 
#include <iconv.h>
 
int main()
{
    std::string inputString = "привет всем";
 
    iconv_t cd = iconv_open("CP866", "UTF-8");
 
    char* inbuf = &inputString[0];
 
    size_t inbytesleft = inputString.size() + 1;
 
    char buf[100];
 
    char* outbuf = buf;
 
    size_t outbytesleft = inbytesleft;
 
      iconv(cd, &(inputString.c_str()), &inbytesleft, &buf, &outbytesleft);
 
    std::cout << buf;
 
    return 0;
}
C:\MyLittleProject\main.cpp|22|error: lvalue required as unary '&' operand|

Ругается на строку с iconv().

Насколько мне известно, string.c_str() возвращает константу const char* или что-то в этом роде, а iconv надо char**.
0
6913 / 5978 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
21.03.2017, 15:50 12
C++
1
2
const char *inbuf = inputString.c_str();
iconv(cd, &inBuf, &inbytesleft, &buf, &outbytesleft);
0
Форумчанин
Эксперт CЭксперт С++
8160 / 5008 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
21.03.2017, 16:22 13
В чём глобально стоит задача?
Вывести русский текст?
C++
1
2
3
4
5
6
7
8
#include <iostream>
 
int main()
{
    setlocale(LC_ALL, "");
    std::string s = "Привет мир!";
    std::cout << s;
}
0
268 / 268 / 109
Регистрация: 22.08.2013
Сообщений: 907
22.03.2017, 07:46  [ТС] 14
Цитата Сообщение от nmcf Посмотреть сообщение
const char *inbuf = inputString.c_str();
iconv не устроит константа.
Цитата Сообщение от MrGluck Посмотреть сообщение
В чём глобально стоит задача?
Вывести русский текст?
Перекодировать текст из UTF-8 в CP866. Кстати, ваш код выводит кракозябры.

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
#include <iostream>
#include <fstream>
#include <string.h>
 
#include <iconv.h>
 
int main(int argc, char *argv[])
{
    std::string str = "привет";
 
    int srcSize = str.length() + 1;
 
    char *src = new char[srcSize];
    strcpy(src, str.c_str());
 
    char dst[srcSize];
 
    size_t srclen = srcSize;
    size_t dstlen = srclen;
 
    char * pIn = src;
    char * pOut = dst;
 
    iconv_t conv = iconv_open("CP866","UTF-8");
    iconv(conv, &pIn, &srclen, &pOut, &dstlen);
 
    std::cout << dst;
}
Вот код для работы со строкой, вместо массива. Вопрос уже решен.
0
6913 / 5978 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
22.03.2017, 08:53 15
Цитата Сообщение от Razip Посмотреть сообщение
iconv не устроит константа
Ты документацию внимательно читал?
C++
1
2
size_t iconv (iconv_t cd, const char* * inbuf, size_t * inbytesleft,
        char* * outbuf, size_t * outbytesleft);
0
268 / 268 / 109
Регистрация: 22.08.2013
Сообщений: 907
22.03.2017, 12:41  [ТС] 16
Цитата Сообщение от nmcf Посмотреть сообщение
Ты документацию внимательно читал?
C:\MyLittleProject\main.cpp|26|error: invalid conversion from 'const char**' to 'char**' [-fpermissive]|
c:\mingw\include\iconv.h|83|error: initializing argument 2 of 'size_t libiconv(libiconv_t, char**, size_t*, char**, size_t*)' [-fpermissive]|
Не знаю как в документации, но на деле так.
0
6913 / 5978 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
22.03.2017, 16:37 17
Значит, у тебя какая-то не та версия.
0
268 / 268 / 109
Регистрация: 22.08.2013
Сообщений: 907
22.03.2017, 17:11  [ТС] 18
Цитата Сообщение от nmcf Посмотреть сообщение
Значит, у тебя какая-то не та версия.
Да, у меня тут в комплекте с MinGW шла эта библиотека.
0
6913 / 5978 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
22.03.2017, 18:55 19
Средствами Windows:
C++
1
2
3
4
5
    string src = "привет";
    wchar_t wbuf[100];
    char dst[100];
    MultiByteToWideChar(CP_UTF8, 0, src.c_str(), -1, wbuf, 100); // utf-8 -> utf-16
    WideCharToMultiByte(866, 0, wbuf, -1, dst, 100, NULL, NULL); // utf-16 -> CP866
1
268 / 268 / 109
Регистрация: 22.08.2013
Сообщений: 907
23.03.2017, 06:56  [ТС] 20
Цитата Сообщение от nmcf Посмотреть сообщение
Средствами Windows:
Работает, буду использовать для Windows-онли программ.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.03.2017, 06:56

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Командная строка
Допустим мне нужно информацию команды system(&quot;wmic diskdrive get model&quot;) вывести в memo. c++...

C++ и командная строка
Как с помощью с++ открыть ком. строку и ввести команды?

Командная строка.
Сумма чисел. числа передаются в виде аргументов командной строки. #include &lt;iostream&gt; #include...

командная строка
помогите написать программку на СИ, буду мегаблагодарна :) В параметрах командной строки...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.