Консультация № 142299
26.08.2008, 12:31
0.00 руб.
0 12 2
Здравствуйте!

Расскажите пожалуйста, как перекодировать строки из разных кодировок, win, koi, dos...

Делать, я как понимаю, лучше всего через юникод?

Вопрос касательно gcc или mingw. Под windows есть api и кодовые страници, но меня интересует независимый вариант.

Обсуждение

давно
Академик
20764
1861
26.08.2008, 13:02
общий
Про независимый вариант не знаю.
Судя по тому, что в C99 и POSIX определено несколько механизмов (btowc()/mbtowc() с коипанией, iconv()) - вряд ли такое вообще возможно.
Неизвестный
26.08.2008, 13:08
общий
А может быть есть какие-то библиотеки?
Кстати, а что делает iconv.dll, она же вроде с кодировками мудрит?
давно
Старший Модератор
17042
808
26.08.2008, 13:52
общий
это ответ
Здравствуйте, Талипов А Н!
Самый "независимый" способ - взаимная замена кодов одноимённых кириллических символов для двух кодировок по таблицам. Именно так осуществляется перекодировка в DOS-браузере Arachne. Но этот способ ручной набивки оставим врагу.
В библиотеке Qt, к счастью, существует класс QTextCodec, который позволяет осуществлять перекодировку символов, загруженных в текстовый поток (объект класса QTextStream) "на лету". Я как раз пишу одну программку, в приложении - фрагмент из неё для разных кодировок.

Приложение:
//-----------------------------------------------------------------------------
void TMainForm::ToolsCP1251EncodingSlot()
{
QFile TextFile(sOpenedFilePath); // Файл, из которого загружается текст
// Создаём указатель на кодек, ищем кодек по имени (в данном примере - Windows") и присваиваем указателю
QTextCodec* pCP1251Codec = QTextCodec::codecForName("CP1251");
if(TextFile.open(IO_ReadOnly == TRUE))
{
QTextStream TextStream(&TextFile); // Передаём текст из файла в поток...
TextStream.setCodec(pCP1251Codec); // ...и перекодируем
pFBBodyPanel->pBodyMemo->clear(); // Очищаем поле ввода
QString sText = TextStream.read(); // Считываем перекодированный текст из потока в строку...
pFBBodyPanel->pBodyMemo->setText(sText); // ...и присваиваем строку полю ввода.
}
}
//-----------------------------------------------------------------------------
void TMainForm::ToolsIbm866EncodingSlot()
{
QFile TextFile(sOpenedFilePath);
QTextCodec* pIbm866Codec = QTextCodec::codecForName("IBM 866");
if(TextFile.open(IO_ReadOnly == TRUE))
{
QTextStream TextStream(&TextFile);
TextStream.setCodec(pIbm866Codec);
pFBBodyPanel->pBodyMemo->clear();
QString sText = TextStream.read();
pFBBodyPanel->pBodyMemo->setText(sText);
}
}
//-----------------------------------------------------------------------------
void TMainForm::ToolsISOEncodingSlot()
{
QFile TextFile(sOpenedFilePath);
QTextCodec* pISOCodec = QTextCodec::codecForName("ISO8859-5");
if(TextFile.open(IO_ReadOnly == TRUE))
{
QTextStream TextStream(&TextFile);
TextStream.setCodec(pISOCodec);
pFBBodyPanel->pBodyMemo->clear();
QString sText = TextStream.read();
pFBBodyPanel->pBodyMemo->setText(sText);
}
}
//-----------------------------------------------------------------------------
void TMainForm::ToolsKOI8REncodingSlot()
{
QFile TextFile(sOpenedFilePath);
QTextCodec* pKOI8RCodec = QTextCodec::codecForName("KOI8-R");
if(TextFile.open(IO_ReadOnly == TRUE))
{
QTextStream TextStream(&TextFile);
TextStream.setCodec(pKOI8RCodec);
pFBBodyPanel->pBodyMemo->clear();
QString sText = TextStream.read();
pFBBodyPanel->pBodyMemo->setText(sText);
}
}
//-----------------------------------------------------------------------------
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
давно
Старший Модератор
17042
808
26.08.2008, 13:54
общий
P.S. Решение - для Qt 3.x. Но переписать для 4-ки, полагаю, не проблема.
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
давно
Старший Модератор
17042
808
26.08.2008, 15:20
общий
Цитата: 18117
С qt я не работал.


Тогда Вам сюда. В Linux Qt работает как раз в связке с gcc (точнее, с g++) и, поскольку именно на её основе построена графическая среда KDE (версия 3.5 включает Qt 3.3.8), то и устанавливать библиотеку не придётся. Для Windows по вышеприведённой ссылке можете скачать Qt 4.x OpenSource Edition, работающей в связке с MinGW, так что оба заявленных вами компилятора библиотекой поддерживаются. NB! Хотя текущая версия MinGW 5-я, Qt работает с 3-й, которую лучше всего скачать средствами самой Qt с сайта Trolltech.
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
давно
Академик
20764
1861
26.08.2008, 15:31
общий
Может, всё-таки лучше разобраться с тремя функциями iconv, чем из-за одного класса тащить весьма немалую графическую библиотеку, да ещё с кучей принадлежностей для сборки?
Неизвестный
26.08.2008, 15:46
общий

Да я-то не против iconv, но оно там вообще есть?
Мне бы конечно, вариант по легче предпочтителен.

Когда я впервые столкнулся с перекодировкой, то именно взял две строчки с кодировками и написал простенькую функцию которая конвертнула мой текст.

Когда я во второй раз столкнулся с перекодировкой, проект был импорта и экспорта из mysql. То особа не заморачиваясь я воспользовался функциями самого mysql.
Одна простенькая команда и у меня уже нужная кодировка из тысяч возможных.

Вот бы и сейчас так.

Но вариант с qt мне понравился ещё тем, что, как я понял, можно конвертировать поток чтения и записи в файл.

А у меня тут вообще-то более серьёзная проблема.
Нужно читать и писать файл в произвольной кодировке. В том числе utf-8, utf-16 и utf-32, что вообще меня приводит в ужас.
давно
Старший Модератор
17042
808
26.08.2008, 16:11
общий
Цитата: Хватов Сергей
Может, всё-таки лучше разобраться с тремя функциями iconv, чем из-за одного класса тащить весьма немалую графическую библиотеку, да ещё с кучей принадлежностей для сборки?


Ну, в Linux её тащить не придётся: есть уже. Кроме того, классов для работы кодировками в Qt >> 1... Выбирай на вкус. Да и сам QTextCodec класс с большими возможностями... Помнится, писал GUI для базы данных MySQL. И не мог примирить Unicode с Utf8. Достаточно оказалось написать несколько строчек, чтобы все кракозяблы в MySQL записях исчезли:
Код:
 
#include <qapplication.h>
#include <qtextcodec.h>
//------------------------------------------------------------------------
#include "TMainForm.h"
//------------------------------------------------------------------------
int main(int iArgc, char* iArgv[])
{
QApplication MyProgramme(iArgc, iArgv);
QTextCodec* pCodec = QTextCodec::codecForName("Utf8");
QTextCodec::setCodecForTr(pCodec);
QTextCodec::setCodecForCStrings(pCodec);
QTextCodec::setCodecForLocale(pCodec);
TMainForm* pMainWindow = new TMainForm;
MyProgramme.setMainWidget(pMainWindow);
pMainWindow->showMaximized();
return MyProgramme.exec();
}

Ну а возможность написать для своей программы кроссплатформенный GUI кому помешает? Хотя бы как перспектива на будущее?

Цитата: 18117
Но вариант с qt мне понравился ещё тем, что, как я понял, можно конвертировать поток чтения и записи в файл.


Вот именно. Что вышеприведённый фргмент кода и делает: загружает текст из файла в поток и, если текст в окне ввода отображается кракозяблами, очищает окно и вновь выводит текст в кодировке, выбранной пользователем. Разумеется, всё это проделывается и в обратном порядке. Кстати, список приведённых в примере кодировок, мягко говоря, далеко не полон...
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
давно
Старший Модератор
17042
808
26.08.2008, 16:30
общий
P.S. Справедливости ради: iconv может делать то же самое. Но исходники OpenSource обычно весьма скверно комментированы / документированы... Qt - счастливое исключение, так что разобраться проще будет.
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
Неизвестный
27.08.2008, 19:42
общий
это ответ
Здравствуйте, Талипов А Н!
Мне кажется, что QT как раз таки независимым вариантом не будет - она привязывает нас к конкретной среде. А что, если пользователь вообще не хочет иметь дело с QT? Если он заядлый фанат GTK. Достаточно независимым вариантом будет iconv. Документирована она достаточно, правда на английском. Не удивлюсь, если узнаю, что ваш QT сам использует iconv для конвертирования. Я где-то даже видел интерфес для iconv для c++. Впрочем 3 функции iconv не настолько сложнопонимаемы, чтобы использовать объектный интерфейс.
давно
Старший Модератор
17042
808
01.09.2008, 08:36
общий
To Fenixk19
Коллега! Ваш пост был замечателен, если бы он был представлен здесьминифоруме ответа). Но именно как ответ Ваше сообщение пусто, поскольку не несёт никакой конкретной, пусть даже уточняющей информации. Поясню. В чём суть Вашего ответа? В предложении использовать iconv? Но это предложение внёс ранее уважаемый Хватов Сергей, так что как ответ - это плагиат. Всё остальное - Ваше мнение, место которому - на форуме по C / C++, либо в минифоруме.
Кроме того, ИМХО, Ваш ответ содержит неточности.
Цитата: 14898
Мне кажется, что QT как раз таки независимым вариантом не будет - она привязывает нас к конкретной среде.

Простите, к какой среде? Речь идёт ведь о привязке к компиляторам? Или Вы имеете в виду Qt? Так это не IDE, а библиотека. - ?
А если речь шла о привязке к конкретной библиотеке, то не вижу особой разницы, к какой библиотеке привязываться: Qt, Gtk или iconv: лишь бы было удобнее. Это я по поводу
Цитата: 14898
А что, если пользователь вообще не хочет иметь дело с QT?

О чём Вы? Пользователю абсолютно безразлично, что "зашито" в программе, лишь бы последняя делала своё дело, работала правильно. А программист (в лице спрашивающего Артёма Талипова) конкретных предпочтений не указал.
А вообще, как я уже писал ранее, действительно независимым способом является "взаимная замена кодов одноимённых кириллических символов для двух кодировок по таблицам", без использования каких-либо библиотек. Так, например (приведу фрагмент из файла recode.c):

Код:
 
#define BUF_SZ 8192

/* Special char codes */

#define BS 8
#define CR 13
#define LF 10

#define DOS_EOF 26 /* Ctrl-Z */
#define UNIX_EOF 4 /* Ctrl-D */

// ...

#define out(x) fputs(x,stdout) /* info */
#define outE(x) fputs(x,stdout) /* error */

// ...

unsigned char koi_table[TBL_SIZE] = {
192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
238,160,161,230,164,165,228,163,229,168,169,170,171,172,173,174,
175,239,224,225,226,227,166,162,236,235,167,232,237,233,231,234,
158,128,129,150,132,133,148,131,149,136,137,138,139,140,141,142,
143,239,144,145,146,147,134,130,156,155,135,152,157,153,151, -1};

unsigned char win_table[TBL_SIZE] = {
0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0,
0, 96, 39, 34, 34,249, 45, 45, 0, 0, 0, 62, 0, 0, 0, 0,
0, 0, 0, 74,253, 0,124, 21,240, 0, 0, 17, 0,196, 0, 73,
248,241, 73,105, 39, 0, 20,250,241,252, 0, 16,106, 83,115,105,
128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239};

// и т.д.

unsigned char *table[] ={ NULL, koi_table, win_table, gost_table, bulg_table};
char *charset[] = { "Alt", "Koi8", "Win", "GOST", "Bulgar" };
enum { ALT, KOI, WIN, GOST, BULG }
charset_in, charset_out;
unsigned char buf_in[BUF_SZ], buf_out[BUF_SZ];
int used_in = BUF_SZ, pos_in = BUF_SZ, pos_out;

// ...

int char_in( void )
{
if ( pos_in >= used_in ) {
if( ( used_in = read( h1, buf_in, BUF_SZ ) ) <= 0 )
return -1;
pos_in = 0; }
return buf_in[ pos_in++ ];
}

//...

int ch, pred_ch = BS, pred_cr, bsoff, d2u = -1, over, comma;
char *src, *dest;

//...

/** do recoding **/

while( ( ch = char_in() ) >= 0 ) {
switch( d2u ) {
case 0:
if( ch == UNIX_EOF ) break;
if( ch == LF && !pred_cr ) putx(CR);
putx(ch);
pred_cr = ( ch == CR );
break;
case 1:
if( ch == DOS_EOF ) break;
if( ch != LF && pred_cr ) putx(CR);
if( ( pred_cr = ( ch == CR ) ) == 0 )
putx( ch );
break;
default:
putx(ch);
} /* switch */
} /* while */


Цитата: 14898
Документирована она достаточно, правда на английском.


А вот с этим позволю себе не согласиться. Библиотеку iconv сопровождают 4 файла документации: /usr/share/man/man1/iconv.1.gz, /usr/share/man/man3/iconv.3.gz, /usr/share/man/man1p/iconv.1p.gz и /usr/share/man/man3p/iconv.3p.gz
Первый отношения к программированию не имеет, т.к. описывает использование утилиты iconv. Второй относится к секции Linux Programmer's Manual (3) (то, что нужно) и информирует, что перекодировку осуществляет функция iconv (последующие файлы содержат практически ту же информацию, но относятся к секции POSIX):
Код:
 
#include <iconv.h>

size_t iconv(iconv_t cd,
char **inbuf, size_t *inbytesleft,
char **outbuf, size_t *outbytesleft);


Далее сообщается, что "The argument cd must be a conversion descriptor created using the function iconv_open()". Идём по ссылке и смотрим iconv_open():
Код:

#include <iconv.h>

iconv_t iconv_open(const char *tocode, const char *fromcode);

При этом нигде не приводится ни одного примера практического применения этой функции, в частности, значения разрешённых для использования кодеков. Рекомендуется воспользоваться командой iconv --list. Но! Как известно, встроенные системные кодеки могут иметь несколько имён (псевдонимов). Причём (выделено мной) это не обязательно означает, что можно использовать любые комбинации данных имён в параметрах командной строки. Занавес. Совершенно непонятно, как, собственно, использовать iconv для конкретной кодировки. Это я и называю плохой документацией.
Дальше можно было бы не продолжать. Но читаем "Description": "The values permitted for fromcode and tocode and the supported combinations are system dependent". Т.е. непосредственная работа iconv является платформозависимой. Так о какой "независимости" идёт речь???

Цитата: 14898
Не удивлюсь, если узнаю, что ваш QT сам использует iconv для конвертирования.

Во-первых, к кому Вы обращались? Если к автору вопроса, то он о Qt никак не упоминал. Если же к автору предыдущего ответа (т.е. ко мне), то могу Вас заверить, что права на эту библиотеку принадлежат не мне, а компании Trolltech.
Во-вторых, предположения не должны звучать в ответе; они имеют право лишь опять-таки здесь (в минифоруме). Тем более, если это предположение неверно. Обратимся к исходным кодам библиотеки (файл qtextcodec.cpp):
Код:
 
QString QWindowsLocalCodec::toUnicode(const char* chars, int len) const
{
if ( len == 1 && chars ) { // Optimization; avoids allocation
char c[2];
c[0] = *chars;
c[1] = 0;
return qt_winMB2QString( c, 2 );
}
if ( len < 0 )
return qt_winMB2QString( chars );
QCString s(chars,len+1);
return qt_winMB2QString(s);
}

QCString QWindowsLocalCodec::fromUnicode(const QString& uc, int& lenInOut ) const
{
QCString r = qt_winQString2MB( uc, lenInOut );
lenInOut = r.length();
return r;
}

Т.е. из одного фрагмента видно, что библиотека обращается к системной локали, после чего выполняет преобразование в соответствии с полученным значением. iconv не используется.
И напоследок. Никогда принципиально не понимал ответов в рассылке по C / C++, в которых не приводится ни одной строчки кода. Призываете использовать iconv - где пример? Знаете, что существует "C++-интерфейс" к iconv (кстати, зачем он? Си входит в C++ как подмножество) - где пример использования?
Не обижайтесь, но в порядке товарищеской критики: я - не член Совета Экспертов, но будь им, то на экзаменах такой "ответ" "зарубил" бы. Жаль, что он успел уйти в рассылку.
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
давно
Старший Модератор
17042
808
02.09.2008, 08:33
общий
To Fenixk19
Поскольку обсуждение началось публично, но Вы ещё не достигли 5-го класса, позволю себе процитировать почти полностью Ваше личное сообщение здесь с моим ответом.
Цитата: 14898
Начнем с того, что в силу моего уровня - 4 класса - я не имею права оставлять сообщения на минифорумах. Поэтому единственным путем моих мыслей в мир остается ответ на вопрос. А если проследить хронологию(а я думаю, задававший вопрос читал сообщения именно в порядке их написания), то можно понять к чему относятся слова о QT.

Напомню, что я писал:
Цитата: Андрей Кузнецов aka Dr_Andrew
Всё остальное - Ваше мнение, место которому - на форуме по C / C++, либо в минифоруме.

Таким образом, если Вы хотели публично высказать свою мысль, то ответ на вопрос - отнюдь не единственный путь. На специализированной ветке форума каждый посетитель или эксперт может начать дискуссию, а спрашивающего пригласить к ней ссылкой в личном сообщении. Второй путь - приватное обсуждение с автором вопроса в личных сообщениях. Наконец, обратиться к администратору рассылки либо к любому эксперту с высоким статусом с просьбой разместить Ваше мнение в минифоруме.

Цитата: 14898
Я соглашусь, что ошибся, назвав QT средой. Но все-таки QT - это большая библиотека, и ради банальной задачи преобразования кодировок вряд ли стоит прибегать к ее использованию. Это мне кажется некрасивым подходом, при том что существуют специальные библиотеки.

Что ж, это Ваше мнение. Но это не ответ. Это просто +1 к мнению Хватов Сергей, которое было высказано до Вас ранее.

Цитата: 14898
К вопросу о документированности. Вы подозреваете о существовании официальных сайтов у большинства открытых библиотек? Там вам и примеры, где разжевана каждая строчка, и описание всех функций, и списки поддерживаемых кодировок. Странно, что кроме ман страниц вы ничего не стали смотреть, чтобы понять принцип работы.

Во-первых, когда я пишу о документированности, то да, я имею в виду ту документацию, которая сопровождает саму библиотеку. Хорошей документированностью я считаю либо хорошую закомментированность самих исходных текстов, как в случае с kmdcodec (не составит труда на его основе создать нужный кроссплатформенный класс, просто вырезав всё KDE-специфическое), либо man-страницы, HTML- и PDF-справочники, сопровождающие библиотеку. Как в случае с Qt, содержащей информацию от установки на различные платформы и пошаговых руководств для newbies, до описания каждого метода каждого входящего в её состав класса. Обращение к интернет - это уже дополнительная информация.
Во-вторых, не нужно делать поспешных выводов о том, что "кроме ман страниц Вы ничего не стали смотреть, чтобы понять принцип работы", тем более, что принцип вполне понятен; остаются неясности по конкретному применению iconv. С официальным сайтом библиотеки я знаком; скорее, либо Вы сами на него не заглядывали , либо мы говорим о разных официальных сайтах. На http://www.gnu.org/software/libiconv/ нет ничего похожего на "примеры, где разжевана каждая строчка". Единственные примеры, которые там приводятся, как и в документации (man-страницах), - это использование утилиты iconv. Список поддерживаемых кодировок на сайте есть, однако нет примеров разрешённых пар, а напомню в документации к iconv ясно сказано: "The iconv() function may fail if: The cd argument is not a valid open conversion descriptor". Но это самая мелкая из проблем. В вопросе заявлены gcc и MinGW. И если с первым проблем не возникает, то ответа на то, как "прикручивать" iconv к компилятору под Windows, нет ни в сопровождающей документации, ни на официальном сайте. Вместо этого мы узнаём о дополнительных проблемах: "On systems other than GNU/Linux, the iconv program will be internationalized only if GNU gettext has been built and installed before GNU libiconv. This means that the first time GNU libiconv is installed, we have a circular dependency between the GNU libiconv and GNU gettext packages, which can be resolved by building and installing either first libiconv, then gettext, then libiconv again, or (on systems supporting shared libraries, excluding AIX) first gettext, then libiconv, then gettext again". Если разрешение этого вопроса кажется Вам тривиальным, то Вы были должны либо дать описание решения, либо ссылку на него в интрнет. ИМХО. Кроме того, в связи с вышеизложенным (предположим, что программист "прикрутил" библиотеку к компилятору успешно) возникает проблема дистрибуции бинарных файлов (поставки готового программного решения на компьютер пользователя) - см. выше о циркулярной зависимости. Если использовать библиотеку, как предлагается на сайте, в виде плагина, то возникает задача написания wrapper'а. Пример кода? На сайте нет. Вы знаете? Почему не писали?

Цитата: 14898
Платформозависимость? Это уже проблема либо неправильного понимания, либо неправильного перевода. В приведенном вами фрагменте документации написано о различиях в преобразованиях в некоторых кодировках. Сама же по себе библиотека является платформонезависимой, как и любой проект GNU - она может использоваться на любой POSIX совместимой системе.

Во-первых, любая библиотека, обращающаяся к системным кодекам - платформозависимая. В том числе и Qt. Но в последней имеется оболочка - класс QTextCodec, который за счёт директив условной компиляции делает программу переносимой на уровне исходного кода. В случае iconv подобную оболочку придётся писать самостоятельно. А насчёт любого проекта GNU - не горячитесь. Как насчёт Notepad++, например?

Цитата: 14898
Я обращался ко всем, кто предлагал QT к использованию(ваш - это еще и множественное число, между прочим). Приведенный вами код ничего не доказывает, так как является всего лишь оберткой к другой QT функции, внутренности которой мне неизвестны. А это предположение не имело отношение к сути вопроса, а было всего лишь дополнением. Неужели после ответа на вопрос я не могу высказать предположение, которое, по моему мнению, может заинтересовать вопрошающего?

А почему неизвестны? Исходные тексты библиотеки доступны. Вся задача - ознакомиться с файлом qtextcodec.cpp. Либо, как вариант, поверить мне на слово, что ссылок на iconv там нет.
Насчёт предположения: высказать на форуме - имеете полное право (либо на минифоруме, когда достигнете 5-го класса). Ответ - это предоставление вопрошающему точной и полезной информации. Где точность? Где полезность? На это Вам уже указывали, к слову, экзаменаторы:
Цитата: Экзаменатор
Нужно использовать поменьше фраз типа : "Может так тоже можно, но я об этом не знаю", "Может я чего-то не знаю", а точно знать о чем вы говорите в своем ответе.


Цитата: 14898
Я не понимаю этих требований кода. Неужели программист нормального уровня не обладает достаточным навыком поиска информации? Я предпологаю, что раз человек обратился, значит он не знает выхода из ситуации. Но надо ли разжевывать ему пошагово путь к решению? Недостаточно ли дать ему подсказку? Неужели он дурак, который по словам iconv не сможет найти кода и примеров?

Приводить код - это не требование. Это моё мнение о степени полезности ответа, которое, к слову, совпадает с мнением членов Совета Экспертов, высказанное Вам на экзамене:
Цитата: Экзаменатор
Ответы остались неразвёрнутыми и иногда не слишком понятными для непосвящённого. Ответы больше похожи на рассуждение на тему, больше подходящее к минифоруму, чем для формы ответа.

Во-первых, не факт, что человек, читающий эту рассылку - программист (я им не являюсь, к слову).
Во-вторых, что он - программист "нормального уровня".
В-третьих, что он имеет возможности (время, финансы) для поиска кода и примеров. Если всё решается Google Code Search - зачем RusFAQ?
Вот если бы Вы обратились ко мне с жалобами на кашель с мокротой, а я после осмотра дал Вам рекомендацию: "Начните с макролидов 2-го поколения в стандартной дозировке. Наблюдение за своим состоянием будете проводить согласно рекомендациям ВОЗ по ведению больных ОРИ в амбулаторных условиях. Если не поможет, то после появления соответствующих показаний, перейдите на фторированные хинолоны в максимальной дозировке. Противопоказания - посмотрите на сайте производителя". Вам понравилась бы подобная рекомендация? А ведь всё это в интернет доступно. На официальном сайте ВОЗ, например...
Идеальный Ваш ответ на тему вопроса выше, на мой взгляд, был бы следующим:
"Для решения вопроса перекодировки лучше всего подходит библиотека iconv, потому что (аргументы). Пошаговые инструкции по установке iconv в связке с MinGW Вы можете найти здесь (ссылка). Код, иллюстрирующий преобразование текста в кодировке N из файла a.txt в кодировку Z с последующим его сохранением в файл b.txt Вы можете посмотреть в приложении". Тогда не возникло бы необходимости в моём посте выше.

Цитата: 14898
Язык C не является подмножеством C++, а C++ является расширением C. Это более верно с исторической точки зрения. Зачем нужен C++ интерфейс? Затем же, зачем C, собственно, расширили до C++ - с целью облегчения для программиста его задачи. Этот интерфейс я всего лишь упомянул, потому что не помню, где его найти. Если человек будет заинтересован, он найдет сам, или в конце концов напишет мне. Я все таки не энциклопедию пишу, а краткую справку, которая должна включать информацию всеохватывающую, но не полную(избыточную). В конце концов, я писал ответ с целью объяснить человеку, что выбор QT, с моей точки зрения, полностью некорректен. Трудно назвать эту мысль плагиатом, ведь она не высказывалась больше нигде здесь. Вряд ли бы я стал повторять как попугай чужие слова.

Насчёт C++ - это предмет теоретической дискуссии, к которой я не склонен. Но с точки зрения практического использования - что пнём об сову, что сову об пенёк. А вот насчёт того, что использование Qt полностью некорректно, внятных аргументов Вы не привели. Аргументы за:
1. Dual license позволяет использовать библиотеку как в свободных, так и в коммерческих проектах.
2. Лёгкость установки для различных ОС и компиляторов (плюс наличие пошаговых руководств).
3. Обилие классов, позволяющих реализовать перекодировку различными (наиболее удобными для решения данной конкретной задачи) способами.
4. Наличие класса для работы с потоками (QTextStream).
5. Лёгкость поставки готового программного продукта на компьютер пользователя (для Windows в случае Qt 3.x присоединяем 1 dll, в случае Qt 4.x - 2).
6. Возможность использования как в консольных приложениях (Non-GUI классы), так и создание кроссплатформенного графического интерфейса.
А насчёт того, что "она (мысль) не высказывалась больше нигде здесь" - неправда, цитирую:
Цитата: Хватов Сергей
в C99 и POSIX определено несколько механизмов (btowc()/mbtowc() с коипанией, iconv())
Может, всё-таки лучше разобраться с тремя функциями iconv, чем из-за одного класса тащить весьма немалую графическую библиотеку?

Эти посты были даны ранее. Что нового в Вашем ответе?
На этом считаю дискуссию оконченной. Удачи!
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
Форма ответа