summaryrefslogtreecommitdiffstats
path: root/src/codecs/tqutfcodec.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/codecs/tqutfcodec.cpp')
-rw-r--r--src/codecs/tqutfcodec.cpp23
1 files changed, 9 insertions, 14 deletions
diff --git a/src/codecs/tqutfcodec.cpp b/src/codecs/tqutfcodec.cpp
index 1125aa9f3..eba25e505 100644
--- a/src/codecs/tqutfcodec.cpp
+++ b/src/codecs/tqutfcodec.cpp
@@ -64,13 +64,10 @@ TQCString TQUtf8Codec::fromUnicode(const TQString& uc, int& lenInOut) const
if ( u < 0x0800 ) {
*cursor++ = 0xc0 | ((uchar) (u >> 6));
} else {
- if (u >= 0xd800 && u < 0xdc00 && i < l-1) {
- unsigned short low = ch[1].unicode();
- if (low >= 0xdc00 && low < 0xe000) {
- ++ch;
- ++i;
- u = (u - 0xd800)*0x400 + (low - 0xdc00) + 0x10000;
- }
+ if (ch[0].isHighSurrogate() && i < (l - 1) && ch[1].isLowSurrogate()) {
+ u = TQChar::surrogateToUcs4(ch[0], ch[1]);
+ ++ch;
+ ++i;
}
if (u > 0xffff) {
// see TQString::fromUtf8() and TQString::utf8() for explanations
@@ -179,16 +176,14 @@ public:
uc = (uc << 6) | (ch & 0x3f);
need--;
if ( !need ) {
- if (uc > 0xffff) {
+ if (TQChar::requiresSurrogates(uc)) {
// surrogate pair
- uc -= 0x10000;
- unsigned short high = uc/0x400 + 0xd800;
- unsigned short low = uc%0x400 + 0xdc00;
- *qch++ = TQChar(high);
- *qch++ = TQChar(low);
+ *qch++ = TQChar(TQChar::highSurrogate(uc));
+ *qch++ = TQChar(TQChar::lowSurrogate(uc));
headerDone = TRUE;
} else if ((uc < min_uc) || (uc >= 0xd800 && uc <= 0xdfff) || (uc >= 0xfffe)) {
- *qch++ = TQChar::replacement;
+ // overlong sequence, UTF16 surrogate or BOM
+ *qch++ = TQChar::replacement;
} else {
if (headerDone || TQChar(uc) != TQChar::byteOrderMark)
*qch++ = uc;