crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> проблема кодировок
eldar85
  опции профиля:
сообщение 27.9.2010, 12:35
Сообщение #1


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

Спасибо сказали: 0 раз(а)




Репутация:   0  


Такая проблемка, хочу чтобы поддерживались две кодировки 1251 и utf-8 в QTextEdite. Проект написан на utf-8 а в QString стоит кодировка 1251 это вызвано нуждами программы, так вот если я вывожу файл который сохранен в utf-8 то кирилица вся конечно же кашей и в начале этот долбаный знак "п»ї" означающий что файл в utf-8 .
Хотелось сделать чтобы прога понимала какой файл в нее вставляют и выводила нормальную кодировку.
написал такой код:
QFile file( "c:/....txt" );
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        QMessageBox::about(this, tr( "Error" ),
                           tr( "<FONT color=red>Не возможно открыть файл!</FONT>" ));
    }
    else
    {

        QString tmp;
        tmp  = file.readAll();

        if( tmp.contains( "п»ї" ) )        //проблема тут, п»ї не видет и выводит все как 1251
            textForEdit->setText( tmp.toUtf8()  );
        else
            textForEdit->setText( tmp  );     //всегда срабатывает эта строка


        file.close();
}


но этот знак "п»ї" не видет прога так как проект написан в utf-8. Как же быть?

Сообщение отредактировал eldar85 - 27.9.2010, 15:06
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 27.9.2010, 17:54
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(eldar85 @ 27.9.2010, 16:35) *
а в QString стоит кодировка 1251
это как так?

Цитата(eldar85 @ 27.9.2010, 16:35) *
этот долбаный знак "п»ї" означающий что файл в utf-8 .
затрудняюсь сказать при каких преобразованиях появляются такие символы. Но большинство текстовых редакторов первые два байта - маркер, просто игнорируют.

Глянь пример examples\tools\codecs
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 27.9.2010, 21:16
Сообщение #3


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

Спасибо сказали: 0 раз(а)




Репутация:   0  


ну в main.cpp у меня стоит кодировка для QString
такой знак "п»ї" появляется когда файл в utf_8 открываешь как 1251.
 QTextCodec::setCodecForCStrings(QTextCodec::codecForName("windows-1251"));

а сам проект на utf-8, получается то если я пишу tmp.contains( "п»ї" ) в редакторе этот символ "п»ї" похоже не воспринемается или не видится или черт его знает, в общем в QTextEdit у меня все выводиться в 1251 так как QString в кодировке 1251 - это для моей программы обязательно.
мне нужно чтобы вот эта строка tmp.contains( "п»ї" ) когда нужно срабатывала и преобразовывала когда необходимо в нужный формат, а вот не срабатывает хотя там этот знак и есть...
кто же навыдумывал столько кодировок)))

Сообщение отредактировал eldar85 - 27.9.2010, 21:20
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 27.9.2010, 21:40
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(eldar85 @ 28.9.2010, 1:16) *
ну в main.cpp у меня стоит кодировка для QString
Цитата(eldar85 @ 28.9.2010, 1:16) *
setCodecForCStrings
перевожу на русский название этого метода:
установитьКодекДляСиСтрок ("Си" - язык программирования). У QString кодировка всегда UTF-16. А этот метод устанавливает кодек, когда нужно QBateArray в QString преобразовать
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 27.9.2010, 21:49
Сообщение #5


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

Спасибо сказали: 0 раз(а)




Репутация:   0  


вот блин, а я и внимание не обращал и в правду, хотя всегда срабатывало)))))))))


Сообщение отредактировал eldar85 - 27.9.2010, 21:49
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 28.9.2010, 10:40
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


eldar85, ты пример посмотрел?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 28.9.2010, 11:56
Сообщение #7


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

Спасибо сказали: 0 раз(а)




Репутация:   0  


не могу найти его по этой ссылке examples\tools\codecs
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 28.9.2010, 16:26
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


в каталоге Qt есть каталог с примерами
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Sokoloff
  опции профиля:
сообщение 28.9.2010, 18:12
Сообщение #9


Участник
**

Группа: Участник
Сообщений: 237
Регистрация: 1.4.2009
Из: Москва
Пользователь №: 654

Спасибо сказали: 50 раз(а)




Репутация:   11  


Вот кусок из моего проекта, он на питоне, но идея думаю будет понятна.

     if f.open(QIODevice.ReadOnly | QIODevice.Text):
            self._cueData = QStringList()

            while not f.atEnd():
                self._cueData.append(QString(f.readLine()))

            #****************************************************
            # Delete BOM
            # see http://en.wikipedia.org/wiki/Byte_Order_Mark
            #****************************************************
            if (self._cueData[0].startsWith("\xEF\xBB\xBF")):   # UTF-8
                self._codePage = 'UTF-8'
                self._cueData[0] = self._cueData[0].remove(0, 3)

            if (self._cueData[0].startsWith("\xFE\xFF")):       # UTF-16 (BE)
                self._codePage = 'UTF-16BE'
                self._cueData[0] = self._cueData[0].remove(0, 2)

            if (self._cueData[0].startsWith("\xFF\xFE")):       # UTF-16 (LE)
                self._codePage = 'UTF-16LE'
                self._cueData[0] = self._cueData[0].remove(0, 2)

            self.parseCue(self._cueData)
            f.close()
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 7.10.2010, 6:21
Сообщение #10


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

Спасибо сказали: 0 раз(а)




Репутация:   0  


Большое спасибо, идея понятна)))) приеду с отпуска опробую и отпишусь)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.11.2024, 21:59