Qt。 コーデック ペレストロイカ

Qt Perestroika こんにちは QTextCodecのソースコード(名前が示すように、テキストコーデックを操作するためのQtクラス)に入る必要がありました-私はかなり面白いコードを見ました-開発者が世界中の膨大な数のユーザーのために正しい作業を保証するために倒れる必要がなくなるとすぐに





オリジナル:
// For the probably_koi8_locales we have to look. the standard says // these are 8859-5, but almost all Russian users use KOI8-R and // incorrectly set $LANG to ru_RU. We'll check tolower() to see what // it thinks ru_RU means. // If you read the history, it seems that many Russians blame ISO and // Perestroika for the confusion. // // The real bug is that some programs break if the user specifies // ru_RU.KOI8-R. static const char * const probably_koi8_rlocales[] = { "ru", "ru_SU", "ru_RU", "russian", 0 }; static QTextCodec * ru_RU_hack(const char * i) { QTextCodec * ru_RU_codec = 0; #if !defined(QT_NO_SETLOCALE) QByteArray origlocale(setlocale(LC_CTYPE, i)); #else QByteArray origlocale(i); #endif // unicode koi8r latin5 name // 0x044E 0xC0 0xEE CYRILLIC SMALL LETTER YU // 0x042E 0xE0 0xCE CYRILLIC CAPITAL LETTER YU int latin5 = tolower(0xCE); int koi8r = tolower(0xE0); if (koi8r == 0xC0 && latin5 != 0xEE) { ru_RU_codec = QTextCodec::codecForName("KOI8-R"); } else if (koi8r != 0xC0 && latin5 == 0xEE) { ru_RU_codec = QTextCodec::codecForName("ISO 8859-5"); } else { // something else again... let's assume... *throws dice* ru_RU_codec = QTextCodec::codecForName("KOI8-R"); qWarning("QTextCodec: Using KOI8-R, probe failed (%02x %02x %s)", koi8r, latin5, i); } #if !defined(QT_NO_SETLOCALE) setlocale(LC_CTYPE, origlocale); #endif return ru_RU_codec; } #endif
      
      





コメントの無料翻訳:
 //   probably_koi8_locales,   . //  ,      8859-5,  //      KOI8-R  //      $LANG  "ru_RU." //      tolower(), //         ru_RU. //    , ,     ISO  //   . // //    ,      ,  //   ru_RU.KOI8-R. static const char * const probably_koi8_rlocales[] = { "ru", "ru_SU", "ru_RU", "russian", 0 }; static QTextCodec * ru_RU_hack(const char * i) { QTextCodec * ru_RU_codec = 0; #if !defined(QT_NO_SETLOCALE) QByteArray origlocale(setlocale(LC_CTYPE, i)); #else QByteArray origlocale(i); #endif // unicode koi8r latin5 name // 0x044E 0xC0 0xEE CYRILLIC SMALL LETTER YU // 0x042E 0xE0 0xCE CYRILLIC CAPITAL LETTER YU int latin5 = tolower(0xCE); int koi8r = tolower(0xE0); if (koi8r == 0xC0 && latin5 != 0xEE) { ru_RU_codec = QTextCodec::codecForName("KOI8-R"); } else if (koi8r != 0xC0 && latin5 == 0xEE) { ru_RU_codec = QTextCodec::codecForName("ISO 8859-5"); } else { // - ...  ... * * ru_RU_codec = QTextCodec::codecForName("KOI8-R"); qWarning("QTextCodec: Using KOI8-R, probe failed (%02x %02x %s)", koi8r, latin5, i); } #if !defined(QT_NO_SETLOCALE) setlocale(LC_CTYPE, origlocale); #endif return ru_RU_codec; } #endif
      
      








All Articles