LINUX.ORG.RU

Кодировки


0

1

Здравствуйте. Есть файл сохраненный в latin1 но содержит символы двух кодировок Big5 и GB18030 нужно это все корректна перекодировать в UTF8, задача упрощается тем что одна строка в файле в одной кодировке: например строка 1 - latin1, строка 2 - Big5, строка 3 - GB18030. Может хто посоветовать какую тулзу или библиотеку, которая поможет это сделать. Написал PHP скрипт которой это делает, но расширение mbstring не умееет работать из кодировкой GB18030.

Как бы намекает твой ник :) Qt :)

Jetty ★★★★★
()
Ответ на: комментарий от Kosyak

Программа должна бить консольной, а в консоли что то не очень хочет Qt правильно работать из кодировками, если залить в окно редактора текст, а потом сохранять то гуд, а так нет.

За iconv спасибо, попробую, забыл за него совсем :).

suse_qt
() автор топика
Ответ на: комментарий от suse_qt

>Программа должна бить консольной,
Линкуй только с QtCore.

а в консоли что то не очень хочет Qt правильно работать из кодировками, если залить в окно редактора текст, а потом сохранять то гуд, а так нет.


Руки, rtfm. Весь функционал по перекодирования находится в QtCore и никакого gui здесь не нужно.

gogi
()
Ответ на: комментарий от gogi

QTextStream in(m_file);
in.setAutoDetectUnicode(false);

QTextStream out(m_output);
out.setCodec(QTextCodec::codecForName(«UTF-8»));

QString line = "";
do {
in.setCodec(QTextCodec::codecForName(«Big5»));
QString line = stream.readLine();

out << line;
} while (!line.isNull());

Что я делаю не так? Часть кода я упустил

suse_qt
() автор топика
Ответ на: комментарий от Eddy_Em

Хорошая вещь, но не поддерживает кодировки GB18030

suse_qt
() автор топика
Ответ на: комментарий от suse_qt

Что я делаю не так? Часть кода я упустил

Не вижу что такое «stream».

А вообще вот это у меня работает

#include <QCoreApplication>
#include <QDebug>
#include <QTextCodec>
#include <QTextStream>
#include <QFile>

int main(int argc, char ** argv)
{
	QCoreApplication app( argc, argv );
	QFile infile("in.txt");	
	QFile outfile("out.txt");	

	if (infile.open(QIODevice::ReadOnly | QIODevice::Text) && outfile.open(QIODevice::WriteOnly | QIODevice::Truncate))
	{
		QTextStream in(&infile);
		in.setAutoDetectUnicode(false);

		QTextStream out(&outfile);
		out.setCodec(QTextCodec::codecForName("UTF-8"));

		QString line = "";
		do {
			in.setCodec(QTextCodec::codecForName("Windows-1251"));
			QString line = in.readLine();
			out << line;
		} while (!line.isEmpty());
	}
	
	infile.close();
	outfile.close();

	app.quit();
}

gogi
()
Ответ на: комментарий от gogi

спасибо, :) работает. Вывод делал в консоль а там соответственно показывалось не то. Правда в вашем коде это:

QString line = "";
do {
in.setCodec(QTextCodec::codecForName(«Windows-1251»));
QString line = in.readLine();
out << line;
} while (!line.isEmpty());


стоит заменить на :
QString line = "";
do {
in.setCodec(QTextCodec::codecForName(«Windows-1251»));
line = in.readLine();
out << line;
} while (!line.isNull());
Иначе файл не будет весь прочитан.

suse_qt
() автор топика
Ответ на: комментарий от suse_qt

Да это я твой код скопировал, не заметил двойного объявления QString. :) А тестил на одной строке, поэтому всё проходило.
А пустоту строки лучше проверять всё же методом isEmpty().

Вывод делал в консоль а там соответственно показывалось не то.

На правильный вывод в консоль тоже настройка нужна. Тут уж зависит от системы.

gogi
()
Ответ на: комментарий от gogi

А пустоту строки лучше проверять всё же методом isEmpty().


Проверил на своем файле не лучше. У меня есть пустые строки в файле (дамп базы данных ) из за чего остальные строки не читались.

suse_qt
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.