Автор Гілка: Кодування символів  (Прочитано 4491 раз)

Відсутній Markus

  • Дописувач
  • **
  • дописів: 79
  • Карма: +0/-0
  • Програматор
Привіт усім!
Стикнувся із проблемою: є файл збережений у latin1 але він містить символи двох кодувань Big5 та GB18030 потрібно це все коректно перекодувати в UTF8, задача спрощується тим що одна стірчка у файлі в одному кодуванні: наприклад стрічка 1 - latin1, стрічка 2 - Big5, стрічка 3 - GB18030. Може хтось знайомий із тулзою яка вміє таке робити чи із бібліотекою. Пробував писати PHP скріпт який би це робив але нажаль розширення mbstring не працює із кодуванням GB18030. Наперед вдячний за відповіді.
Чи потрібні Україні програмісти, які не знають англійської мови?

Відсутній Ubuntu_Linux

  • Графоман
  • ****
  • дописів: 275
  • Карма: +0/-0
Re: Кодування символів
« Відповідей #1 : 2010-12-08 13:33:52 »
QTextCodec
http://doc.trolltech.com/3.3/qtextcodec.html

Якщо читаєш наступний рядок, то перед цим просто змінюєш кодування.
А потім викликаш метод QString::toUTF8() для конвертації в потрібний формат.

Відсутній Markus

  • Дописувач
  • **
  • дописів: 79
  • Карма: +0/-0
  • Програматор
Re: Кодування символів
« Відповідей #2 : 2010-12-08 13:53:15 »
QTextStream in(m_file);
 in.setAutoDetectUnicode(false);

  QString line = "";
  do {
        in.setCodec(QTextCodec::codecForName("Big5"));
        QString line = stream.readLine();
        qWarning() << line.toUtf8() << endl;

     } while (!line.isNull());

Виводить каракулі, хоча вибраний правильний шрифт, який підтримує китайські символи. Що я роблю не так?
Чи потрібні Україні програмісти, які не знають англійської мови?

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: Кодування символів
« Відповідей #3 : 2010-12-08 14:46:57 »
Це не допоможе? : http://ykyuen.wordpress.com/2010/11/23/php-convert-big5-to-utf8/

Цитата
I am not familiar with the character encoding. I have a ISO-8859-1 string(Big5). After i convert it to UTF8 by the utf8_encode() function, garbage characters are shown in the HTML. Finally, i found another way to convert Big5 to UTF8.

The following function will break down a Big5 string into characters and convert them into UTF8 one by one.
view source
print?
     function big52utf8($big5str) {
      
          $blen = strlen($big5str);
          $utf8str = "";
      
          for($i=0; $i<$blen; $i++) {
              $sbit = ord(substr($big5str, $i, 1));
              //echo $sbit;
              //echo "<br>";
              if ($sbit < 129) {
                  $utf8str.=substr($big5str,$i,1);
              } elseif ($sbit > 128 && $sbit < 255) {
                  $new_word = iconv("BIG5", "UTF-8", substr($big5str,$i,2));
                  $utf8str.=($new_word=="")?"?":$new_word;
                  $i++;
              }
          }
      
          return $utf8str;
      
      }


Done =)

Як я розумію, Big5 - це двобайтне кодування, а latin1 - однобайтне.
[Fedora Linux]

Відсутній Ubuntu_Linux

  • Графоман
  • ****
  • дописів: 275
  • Карма: +0/-0
Re: Кодування символів
« Відповідей #4 : 2010-12-08 14:56:44 »
Власне кодек для самої QString не встановив, тому й трабли.

Відсутній Markus

  • Дописувач
  • **
  • дописів: 79
  • Карма: +0/-0
  • Програматор
Re: Кодування символів
« Відповідей #5 : 2010-12-08 15:21:28 »
Це не допоможе? : http://ykyuen.wordpress.com/2010/11/23/php-convert-big5-to-utf8/

Цитата
I am not familiar with the character encoding. I have a ISO-8859-1 string(Big5). After i convert it to UTF8 by the utf8_encode() function, garbage characters are shown in the HTML. Finally, i found another way to convert Big5 to UTF8.

The following function will break down a Big5 string into characters and convert them into UTF8 one by one.
view source
print?
     function big52utf8($big5str) {
      
          $blen = strlen($big5str);
          $utf8str = "";
      
          for($i=0; $i<$blen; $i++) {
              $sbit = ord(substr($big5str, $i, 1));
              //echo $sbit;
              //echo "<br>";
              if ($sbit < 129) {
                  $utf8str.=substr($big5str,$i,1);
              } elseif ($sbit > 128 && $sbit < 255) {
                  $new_word = iconv("BIG5", "UTF-8", substr($big5str,$i,2));
                  $utf8str.=($new_word=="")?"?":$new_word;
                  $i++;
              }
          }
      
          return $utf8str;
      
      }


Done =)

Як я розумію, Big5 - це двобайтне кодування, а latin1 - однобайтне.
Та власне справа в тому що в PHP із Big5 в мене проблем нема а от із GB18030 ...

Цитата
Власне кодек для самої QString не встановив, тому й трабли.
а як це робиться?
Чи потрібні Україні програмісти, які не знають англійської мови?

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: Кодування символів
« Відповідей #6 : 2010-12-08 16:15:12 »
iconv підтримує GB18030:

$ iconv -l | grep -i GB18030
GB18030//

[Fedora Linux]

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
[Fedora Linux]

Відсутній Markus

  • Дописувач
  • **
  • дописів: 79
  • Карма: +0/-0
  • Програматор
Re: Кодування символів
« Відповідей #8 : 2010-12-08 16:38:54 »
перевірено практично розширення iconv пхп не хоче перекодовувати із цього кодування.  :(
Чи потрібні Україні програмісти, які не знають англійської мови?

Відсутній Ubuntu_Linux

  • Графоман
  • ****
  • дописів: 275
  • Карма: +0/-0
Re: Кодування символів
« Відповідей #9 : 2010-12-08 17:09:35 »
void QTextCodec::setCodecForCStrings ( QTextCodec * c ) [static]

http://doc.trolltech.com/3.3/qtextcodec.html#setCodecForCStrings