[SCM] WebKit Debian packaging branch, debian/unstable, updated. debian/1.1.15-1-40151-g37bb677

darin darin at 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Sat Sep 26 07:30:04 UTC 2009


The following commit has been merged in the debian/unstable branch:
commit d206196b43d9653d4f0bf2e52c78a814df0260bb
Author: darin <darin at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Tue Mar 18 22:13:33 2003 +0000

            Reviewed by Maciej.
    
    	- fixed 3164522 -- text encoding conversion is done a chunk at a time with no state; won't work in some cases
    	- fixed 3164557 -- pages served with encoding UTF-16LE but no BOM character won't be decoded correctly
    	- fixed 3164569 -- pages without BOM that have a server-specified encoding of utf-16 will fail to decode
    	- fixed 3165002 -- can't open link with tilde (~) in page with Japanese encoding
    	- fixed 3181297 -- can't open link with backslash (\) in page with Japanese encoding (download at netscape.com)
    	- fixed 3182977 -- "unicode" encoding handled as UTF-16 rather than UTF-8 at www.delcom-eng.com
    
            * khtml/misc/decoder.h: Add an optional "8-bit-only" parameter to the
            setEncoding method.
            * khtml/misc/decoder.cpp:
            (Decoder::setEncoding): Add an "8-bit-only" parameter. Use the new
            codeForNameEightBitOnly method when that parameter is true. Use the new
            usesVisualOrdering constant rather than all the hardcoded logic here to
            tell logical from visual Hebrew encodings.
            (Decoder::decode): Pass true for "8-bit-only" when the encoding came out
            of an HTML header, since we are already parsing the file by this point so
            it makes no sense to use a non-8-bit encoding.
            (Decoder::flush): Pass true for the "flush" parameter when calling the decoder.
    
            * kwq/KWQCharsets.h: Add a new KWQEncodingFlags enum, and return a parameter of
            that type (optionally) from KWQCFStringEncodingFromIANACharsetName.
            * kwq/KWQCharsets.mm:
            (buildDictionaries): Make the dictionaries lead to table entries so we can get
            both the flags and the encoding.
            (KWQCFStringEncodingFromIANACharsetName): Get the flags as well as the encoding.
            (KWQCFStringEncodingToIANACharsetName): Use the new dictionary format.
            (encodingNameHash): Removed special case for hash for 0. This was useful in
            JavaScriptCore where this hash function came from, but it's not relevant for
            a CF hash function.
    
            * kwq/KWQTextCodec.h: Added codecForNameEightBitOnly function to QTextCodec. Added optional
            KWQEncodingFlags parameter to QTextCodec constructor. Replaced isISOLatin1Hebrew with
            usesVisualOrdering. Added == and hash functions to QTextCodec. Added virtual destructor to
            QTextDecoder. Added optional "flush" boolean parameter to QTextDecoder's toUnicode function.
            * kwq/KWQTextCodec.mm:
            (codecForCFStringEncoding): Use both the encoding and the flags as a key for the dictionary
            that holds QTextCodec objects.
            (QTextCodec::codecForName): Pass flags through.
            (QTextCodec::codecForNameEightBitOnly): Added. Maps kCFStringEncodingUnicode to
            kCFStringEncodingUTF8.
            (QTextCodec::codecForLocale): Pass noEncodingFlags.
            (QTextCodec::makeDecoder): Pass flags to KWQTextDecoder constructor.
            (QTextCodec::toUnicode): Pass true for the "flush" boolean parameter to KWQTextDecoder.
            (operator==): Added. Compares both encoding and flags.
            (QTextCodec::hash): Added. Computes a hash of encoding and flags.
            (QTextCodecsEqual): Added. Calls operator==.
            (QTextCodecHash): Added. Calls hash member function.
            (QTextDecoder::~QTextDecoder): Added. Empty.
            (KWQTextDecoder::KWQTextDecoder): Made this no longer inline.
            (KWQTextDecoder::~KWQTextDecoder): Added. Cache the TEC object for use next time.
            (KWQTextDecoder::convertUTF16): Use the flags to decide on big vs. little endian when the
            page does not have a BOM marker that makes it unambiguous.
            (KWQTextDecoder::convertUsingTEC): Added flush parameter. Changed code to reuse the same
            converter for successive convert calls, and only flush when the flush parameter is passed.
            Added code to set the kUnicodeForceASCIIRangeMask. Do it directly since we can't use
            TECSetBasicOptions due to bug 3201405.
            (KWQTextDecoder::toUnicode): Pass flush parameter through.
    
            * kwq/mac-encodings.txt: Added new sections for "Unicode, bigEndian", "Unicode, littleEndian",
            and "ISOLatinHebrew, visualOrdering". Also moved UTF-16 to "Unicode" from "UTF8" since we now
            handle this with the "8-bit-only" mechanism.
    
            * kwq/make-charset-table.pl: Updated script to support flags (after a comma), and made it a bit
            more strict about what to do with ill-formed lines.
    
            * kwq/KWQCharsetData.c: Regenerated.
    
            - other changes
    
            * kwq/KWQKHTMLPart.mm:
            (KWQKHTMLPart::searchForLabelsBeforeElement): Take advantage of "using" and remove
            unneeded namespace prefixes.
            (KWQKHTMLPart::matchLabelsAgainstElement): Ditto.
            (KWQKHTMLPart::pauseActions): Ditto.
            (KWQKHTMLPart::resumeActions): Add check for nil to match pauseActions. Also take
            advantage of "using" and remove unneeded namespace prefixes.
            (KWQKHTMLPart::saveWindowProperties): Use ERROR instead of ASSERT for the nil case.
            (KWQKHTMLPart::saveLocationProperties): Use ERROR instead of ASSERT for the nil case.
            (KWQKHTMLPart::restoreWindowProperties): Use ERROR instead of ASSERT for the nil case.
            (KWQKHTMLPart::restoreLocationProperties): Use ERROR instead of printf for the nil case.
            (KWQKHTMLPart::openURLFromPageCache): Take advantage of "using" and remove
            unneeded namespace prefixes.
            (KWQKHTMLPart::passWidgetMouseDownEventToWidget): Ditto.
            (KWQKHTMLPart::passSubframeEventToSubframe): Ditto.
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@3853 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog-2003-10-25 b/WebCore/ChangeLog-2003-10-25
index 38c25dd..76889ee 100644
--- a/WebCore/ChangeLog-2003-10-25
+++ b/WebCore/ChangeLog-2003-10-25
@@ -1,3 +1,92 @@
+2003-03-18  Darin Adler  <darin at apple.com>
+
+        Reviewed by Maciej.
+
+	- fixed 3164522 -- text encoding conversion is done a chunk at a time with no state; won't work in some cases
+	- fixed 3164557 -- pages served with encoding UTF-16LE but no BOM character won't be decoded correctly
+	- fixed 3164569 -- pages without BOM that have a server-specified encoding of utf-16 will fail to decode
+	- fixed 3165002 -- can't open link with tilde (~) in page with Japanese encoding
+	- fixed 3181297 -- can't open link with backslash (\) in page with Japanese encoding (download at netscape.com)
+	- fixed 3182977 -- "unicode" encoding handled as UTF-16 rather than UTF-8 at www.delcom-eng.com
+
+        * khtml/misc/decoder.h: Add an optional "8-bit-only" parameter to the
+        setEncoding method.
+        * khtml/misc/decoder.cpp:
+        (Decoder::setEncoding): Add an "8-bit-only" parameter. Use the new
+        codeForNameEightBitOnly method when that parameter is true. Use the new
+        usesVisualOrdering constant rather than all the hardcoded logic here to
+        tell logical from visual Hebrew encodings.
+        (Decoder::decode): Pass true for "8-bit-only" when the encoding came out
+        of an HTML header, since we are already parsing the file by this point so
+        it makes no sense to use a non-8-bit encoding.
+        (Decoder::flush): Pass true for the "flush" parameter when calling the decoder.
+        
+        * kwq/KWQCharsets.h: Add a new KWQEncodingFlags enum, and return a parameter of
+        that type (optionally) from KWQCFStringEncodingFromIANACharsetName.
+        * kwq/KWQCharsets.mm:
+        (buildDictionaries): Make the dictionaries lead to table entries so we can get
+        both the flags and the encoding.
+        (KWQCFStringEncodingFromIANACharsetName): Get the flags as well as the encoding.
+        (KWQCFStringEncodingToIANACharsetName): Use the new dictionary format.
+        (encodingNameHash): Removed special case for hash for 0. This was useful in
+        JavaScriptCore where this hash function came from, but it's not relevant for
+        a CF hash function.
+        
+        * kwq/KWQTextCodec.h: Added codecForNameEightBitOnly function to QTextCodec. Added optional
+        KWQEncodingFlags parameter to QTextCodec constructor. Replaced isISOLatin1Hebrew with
+        usesVisualOrdering. Added == and hash functions to QTextCodec. Added virtual destructor to
+        QTextDecoder. Added optional "flush" boolean parameter to QTextDecoder's toUnicode function.
+        * kwq/KWQTextCodec.mm:
+        (codecForCFStringEncoding): Use both the encoding and the flags as a key for the dictionary
+        that holds QTextCodec objects.
+        (QTextCodec::codecForName): Pass flags through.
+        (QTextCodec::codecForNameEightBitOnly): Added. Maps kCFStringEncodingUnicode to
+        kCFStringEncodingUTF8.
+        (QTextCodec::codecForLocale): Pass noEncodingFlags.
+        (QTextCodec::makeDecoder): Pass flags to KWQTextDecoder constructor.
+        (QTextCodec::toUnicode): Pass true for the "flush" boolean parameter to KWQTextDecoder.
+        (operator==): Added. Compares both encoding and flags.
+        (QTextCodec::hash): Added. Computes a hash of encoding and flags.
+        (QTextCodecsEqual): Added. Calls operator==.
+        (QTextCodecHash): Added. Calls hash member function.
+        (QTextDecoder::~QTextDecoder): Added. Empty.
+        (KWQTextDecoder::KWQTextDecoder): Made this no longer inline.
+        (KWQTextDecoder::~KWQTextDecoder): Added. Cache the TEC object for use next time.
+        (KWQTextDecoder::convertUTF16): Use the flags to decide on big vs. little endian when the
+        page does not have a BOM marker that makes it unambiguous.
+        (KWQTextDecoder::convertUsingTEC): Added flush parameter. Changed code to reuse the same
+        converter for successive convert calls, and only flush when the flush parameter is passed.
+        Added code to set the kUnicodeForceASCIIRangeMask. Do it directly since we can't use
+        TECSetBasicOptions due to bug 3201405.
+        (KWQTextDecoder::toUnicode): Pass flush parameter through.
+        
+        * kwq/mac-encodings.txt: Added new sections for "Unicode, bigEndian", "Unicode, littleEndian",
+        and "ISOLatinHebrew, visualOrdering". Also moved UTF-16 to "Unicode" from "UTF8" since we now
+        handle this with the "8-bit-only" mechanism.
+        
+        * kwq/make-charset-table.pl: Updated script to support flags (after a comma), and made it a bit
+        more strict about what to do with ill-formed lines.
+
+        * kwq/KWQCharsetData.c: Regenerated.
+        
+        - other changes
+        
+        * kwq/KWQKHTMLPart.mm:
+        (KWQKHTMLPart::searchForLabelsBeforeElement): Take advantage of "using" and remove
+        unneeded namespace prefixes.
+        (KWQKHTMLPart::matchLabelsAgainstElement): Ditto.
+        (KWQKHTMLPart::pauseActions): Ditto.
+        (KWQKHTMLPart::resumeActions): Add check for nil to match pauseActions. Also take
+        advantage of "using" and remove unneeded namespace prefixes.
+        (KWQKHTMLPart::saveWindowProperties): Use ERROR instead of ASSERT for the nil case.
+        (KWQKHTMLPart::saveLocationProperties): Use ERROR instead of ASSERT for the nil case.
+        (KWQKHTMLPart::restoreWindowProperties): Use ERROR instead of ASSERT for the nil case.
+        (KWQKHTMLPart::restoreLocationProperties): Use ERROR instead of printf for the nil case.
+        (KWQKHTMLPart::openURLFromPageCache): Take advantage of "using" and remove
+        unneeded namespace prefixes.
+        (KWQKHTMLPart::passWidgetMouseDownEventToWidget): Ditto.
+        (KWQKHTMLPart::passSubframeEventToSubframe): Ditto.
+
 2003-03-16  Maciej Stachowiak  <mjs at apple.com>
 
         Reviewed by Trey.
diff --git a/WebCore/ChangeLog-2005-08-23 b/WebCore/ChangeLog-2005-08-23
index 38c25dd..76889ee 100644
--- a/WebCore/ChangeLog-2005-08-23
+++ b/WebCore/ChangeLog-2005-08-23
@@ -1,3 +1,92 @@
+2003-03-18  Darin Adler  <darin at apple.com>
+
+        Reviewed by Maciej.
+
+	- fixed 3164522 -- text encoding conversion is done a chunk at a time with no state; won't work in some cases
+	- fixed 3164557 -- pages served with encoding UTF-16LE but no BOM character won't be decoded correctly
+	- fixed 3164569 -- pages without BOM that have a server-specified encoding of utf-16 will fail to decode
+	- fixed 3165002 -- can't open link with tilde (~) in page with Japanese encoding
+	- fixed 3181297 -- can't open link with backslash (\) in page with Japanese encoding (download at netscape.com)
+	- fixed 3182977 -- "unicode" encoding handled as UTF-16 rather than UTF-8 at www.delcom-eng.com
+
+        * khtml/misc/decoder.h: Add an optional "8-bit-only" parameter to the
+        setEncoding method.
+        * khtml/misc/decoder.cpp:
+        (Decoder::setEncoding): Add an "8-bit-only" parameter. Use the new
+        codeForNameEightBitOnly method when that parameter is true. Use the new
+        usesVisualOrdering constant rather than all the hardcoded logic here to
+        tell logical from visual Hebrew encodings.
+        (Decoder::decode): Pass true for "8-bit-only" when the encoding came out
+        of an HTML header, since we are already parsing the file by this point so
+        it makes no sense to use a non-8-bit encoding.
+        (Decoder::flush): Pass true for the "flush" parameter when calling the decoder.
+        
+        * kwq/KWQCharsets.h: Add a new KWQEncodingFlags enum, and return a parameter of
+        that type (optionally) from KWQCFStringEncodingFromIANACharsetName.
+        * kwq/KWQCharsets.mm:
+        (buildDictionaries): Make the dictionaries lead to table entries so we can get
+        both the flags and the encoding.
+        (KWQCFStringEncodingFromIANACharsetName): Get the flags as well as the encoding.
+        (KWQCFStringEncodingToIANACharsetName): Use the new dictionary format.
+        (encodingNameHash): Removed special case for hash for 0. This was useful in
+        JavaScriptCore where this hash function came from, but it's not relevant for
+        a CF hash function.
+        
+        * kwq/KWQTextCodec.h: Added codecForNameEightBitOnly function to QTextCodec. Added optional
+        KWQEncodingFlags parameter to QTextCodec constructor. Replaced isISOLatin1Hebrew with
+        usesVisualOrdering. Added == and hash functions to QTextCodec. Added virtual destructor to
+        QTextDecoder. Added optional "flush" boolean parameter to QTextDecoder's toUnicode function.
+        * kwq/KWQTextCodec.mm:
+        (codecForCFStringEncoding): Use both the encoding and the flags as a key for the dictionary
+        that holds QTextCodec objects.
+        (QTextCodec::codecForName): Pass flags through.
+        (QTextCodec::codecForNameEightBitOnly): Added. Maps kCFStringEncodingUnicode to
+        kCFStringEncodingUTF8.
+        (QTextCodec::codecForLocale): Pass noEncodingFlags.
+        (QTextCodec::makeDecoder): Pass flags to KWQTextDecoder constructor.
+        (QTextCodec::toUnicode): Pass true for the "flush" boolean parameter to KWQTextDecoder.
+        (operator==): Added. Compares both encoding and flags.
+        (QTextCodec::hash): Added. Computes a hash of encoding and flags.
+        (QTextCodecsEqual): Added. Calls operator==.
+        (QTextCodecHash): Added. Calls hash member function.
+        (QTextDecoder::~QTextDecoder): Added. Empty.
+        (KWQTextDecoder::KWQTextDecoder): Made this no longer inline.
+        (KWQTextDecoder::~KWQTextDecoder): Added. Cache the TEC object for use next time.
+        (KWQTextDecoder::convertUTF16): Use the flags to decide on big vs. little endian when the
+        page does not have a BOM marker that makes it unambiguous.
+        (KWQTextDecoder::convertUsingTEC): Added flush parameter. Changed code to reuse the same
+        converter for successive convert calls, and only flush when the flush parameter is passed.
+        Added code to set the kUnicodeForceASCIIRangeMask. Do it directly since we can't use
+        TECSetBasicOptions due to bug 3201405.
+        (KWQTextDecoder::toUnicode): Pass flush parameter through.
+        
+        * kwq/mac-encodings.txt: Added new sections for "Unicode, bigEndian", "Unicode, littleEndian",
+        and "ISOLatinHebrew, visualOrdering". Also moved UTF-16 to "Unicode" from "UTF8" since we now
+        handle this with the "8-bit-only" mechanism.
+        
+        * kwq/make-charset-table.pl: Updated script to support flags (after a comma), and made it a bit
+        more strict about what to do with ill-formed lines.
+
+        * kwq/KWQCharsetData.c: Regenerated.
+        
+        - other changes
+        
+        * kwq/KWQKHTMLPart.mm:
+        (KWQKHTMLPart::searchForLabelsBeforeElement): Take advantage of "using" and remove
+        unneeded namespace prefixes.
+        (KWQKHTMLPart::matchLabelsAgainstElement): Ditto.
+        (KWQKHTMLPart::pauseActions): Ditto.
+        (KWQKHTMLPart::resumeActions): Add check for nil to match pauseActions. Also take
+        advantage of "using" and remove unneeded namespace prefixes.
+        (KWQKHTMLPart::saveWindowProperties): Use ERROR instead of ASSERT for the nil case.
+        (KWQKHTMLPart::saveLocationProperties): Use ERROR instead of ASSERT for the nil case.
+        (KWQKHTMLPart::restoreWindowProperties): Use ERROR instead of ASSERT for the nil case.
+        (KWQKHTMLPart::restoreLocationProperties): Use ERROR instead of printf for the nil case.
+        (KWQKHTMLPart::openURLFromPageCache): Take advantage of "using" and remove
+        unneeded namespace prefixes.
+        (KWQKHTMLPart::passWidgetMouseDownEventToWidget): Ditto.
+        (KWQKHTMLPart::passSubframeEventToSubframe): Ditto.
+
 2003-03-16  Maciej Stachowiak  <mjs at apple.com>
 
         Reviewed by Trey.
diff --git a/WebCore/khtml/misc/decoder.cpp b/WebCore/khtml/misc/decoder.cpp
index 2bf63ea..471ea98 100644
--- a/WebCore/khtml/misc/decoder.cpp
+++ b/WebCore/khtml/misc/decoder.cpp
@@ -279,7 +279,7 @@ Decoder::~Decoder()
     delete m_decoder;
 }
 
-void Decoder::setEncoding(const char *_encoding, bool force)
+void Decoder::setEncoding(const char *_encoding, bool force, bool eightBitOnly)
 {
 #ifdef DECODE_DEBUG
     kdDebug(6005) << "setEncoding " << _encoding << " " << force << endl;
@@ -296,25 +296,29 @@ void Decoder::setEncoding(const char *_encoding, bool force)
 #endif
     if(enc.isNull() || enc.isEmpty())
         return;
-#if !APPLE_CHANGES
+
+#if APPLE_CHANGES
+    m_codec = eightBitOnly
+        ? QTextCodec::codecForNameEightBitOnly(enc)
+        : QTextCodec::codecForName(enc);
+    if (m_codec) {
+        enc = m_codec->name();
+        visualRTL = m_codec->usesVisualOrdering();
+    }
+    bool b = m_codec;
+#else
     if(enc == "visual") // hebrew visually ordered
         enc = "iso8859-8";
-#endif
     bool b;
     m_codec = KGlobal::charsets()->codecForName(enc, b);
 
-    bool couldBeVisualRTL;
-#if APPLE_CHANGES
-    couldBeVisualRTL = m_codec->isISOLatin1Hebrew();
-#else
-    couldBeVisualRTL = m_codec->mibEnum() == 11;
-#endif
-    if (couldBeVisualRTL)  {
+    if (m_codec->mibEnum() == 11)  {
         // visually ordered unless one of the following
         if( !(enc == "iso-8859-8-i" || enc == "iso_8859-8-i"
                 || enc == "csiso88598i" || enc == "logical") )
             visualRTL = true;
     }
+#endif
 
     if( !b ) // in case the codec didn't exist, we keep the old one (fixes some sites specifying invalid codecs)
 	m_codec = old;
@@ -437,7 +441,7 @@ QString Decoder::decode(const char *data, int len)
 #ifdef DECODE_DEBUG
 			    kdDebug( 6005 ) << "Decoder: found charset: " << enc.data() << endl;
 #endif
-			    setEncoding(enc, true);
+			    setEncoding(enc, true, true);
 			    if( haveEncoding ) goto found;
 
                             if ( endpos >= str.length() || str[endpos] == '/' || str[endpos] == '>' ) break;
@@ -574,7 +578,11 @@ QString Decoder::decode(const char *data, int len)
 
 QString Decoder::flush() const
 {
+#if APPLE_CHANGES
+    return m_decoder->toUnicode(buffer.latin1(), buffer.length(), true);
+#else
     return m_decoder->toUnicode(buffer.latin1(), buffer.length());
+#endif
 }
 
 // -----------------------------------------------------------------------------
diff --git a/WebCore/khtml/misc/decoder.h b/WebCore/khtml/misc/decoder.h
index bd12905..bc6b60d 100644
--- a/WebCore/khtml/misc/decoder.h
+++ b/WebCore/khtml/misc/decoder.h
@@ -36,7 +36,7 @@ public:
     Decoder();
     ~Decoder();
 
-    void setEncoding(const char *encoding, bool force = false);
+    void setEncoding(const char *encoding, bool force = false, bool eightBitOnly = false);
     const char *encoding() const;
 
     QString decode(const char *data, int len);
diff --git a/WebCore/kwq/KWQCharsetData.c b/WebCore/kwq/KWQCharsetData.c
index c1d6cbc..48342f5 100644
--- a/WebCore/kwq/KWQCharsetData.c
+++ b/WebCore/kwq/KWQCharsetData.c
@@ -1,319 +1,319 @@
 static const CharsetEntry table[] = {
-    { "csmacintosh", kCFStringEncodingMacRoman },
-    { "mac", kCFStringEncodingMacRoman },
-    { "macintosh", kCFStringEncodingMacRoman },
-    { "x-mac-roman", kCFStringEncodingMacRoman },
-    { "windows-1252", kCFStringEncodingWindowsLatin1 },
-    { "winlatin1", kCFStringEncodingWindowsLatin1 },
-    { "x-ansi", kCFStringEncodingWindowsLatin1 },
-    { "8859_1", kCFStringEncodingISOLatin1 },
-    { "cp819", kCFStringEncodingISOLatin1 },
-    { "csisolatin1", kCFStringEncodingISOLatin1 },
-    { "ibm819", kCFStringEncodingISOLatin1 },
-    { "iso-8859-1", kCFStringEncodingISOLatin1 },
-    { "iso-ir-100", kCFStringEncodingISOLatin1 },
-    { "iso8859-1", kCFStringEncodingISOLatin1 },
-    { "iso_8859-1", kCFStringEncodingISOLatin1 },
-    { "iso_8859-1:1987", kCFStringEncodingISOLatin1 },
-    { "l1", kCFStringEncodingISOLatin1 },
-    { "latin1", kCFStringEncodingISOLatin1 },
-    { "x-nextstep", kCFStringEncodingNextStepLatin },
-    { "ansi_x3.4-1968", kCFStringEncodingASCII },
-    { "ansi_x3.4-1986", kCFStringEncodingASCII },
-    { "ascii", kCFStringEncodingASCII },
-    { "cp367", kCFStringEncodingASCII },
-    { "csascii", kCFStringEncodingASCII },
-    { "ibm367", kCFStringEncodingASCII },
-    { "iso-ir-6", kCFStringEncodingASCII },
-    { "iso-ir-6us", kCFStringEncodingASCII },
-    { "iso646-us", kCFStringEncodingASCII },
-    { "iso_646.irv:1991", kCFStringEncodingASCII },
-    { "us", kCFStringEncodingASCII },
-    { "us-ascii", kCFStringEncodingASCII },
-    { "csunicode", kCFStringEncodingUnicode },
-    { "iso-10646-ucs-2", kCFStringEncodingUnicode },
-    { "unicode", kCFStringEncodingUnicode },
-    { "unicodefeff", kCFStringEncodingUnicode },
-    { "unicodefffe", kCFStringEncodingUnicode },
-    { "utf-16be", kCFStringEncodingUnicode },
-    { "utf-16le", kCFStringEncodingUnicode },
-    { "unicode-1-1-utf-8", kCFStringEncodingUTF8 },
-    { "unicode-2-0-utf-8", kCFStringEncodingUTF8 },
-    { "utf-16", kCFStringEncodingUTF8 },
-    { "utf-8", kCFStringEncodingUTF8 },
-    { "x-unicode-2-0-utf-8", kCFStringEncodingUTF8 },
-    { "x-mac-japanese", kCFStringEncodingMacJapanese },
-    { "x-mac-chinesetrad", kCFStringEncodingMacChineseTrad },
-    { "x-mac-trad-chinese", kCFStringEncodingMacChineseTrad },
-    { "csksc56011987", kCFStringEncodingMacKorean },
-    { "iso-ir-149", kCFStringEncodingMacKorean },
-    { "korean", kCFStringEncodingMacKorean },
-    { "ks_c_5601", kCFStringEncodingMacKorean },
-    { "ks_c_5601-1987", kCFStringEncodingMacKorean },
-    { "ks_c_5601-1989", kCFStringEncodingMacKorean },
-    { "ks_c_5601_1987", kCFStringEncodingMacKorean },
-    { "ksc5601", kCFStringEncodingMacKorean },
-    { "ksc_5601", kCFStringEncodingMacKorean },
-    { "x-mac-korean", kCFStringEncodingMacKorean },
-    { "x-mac-arabic", kCFStringEncodingMacArabic },
-    { "x-mac-hebrew", kCFStringEncodingMacHebrew },
-    { "x-mac-greek", kCFStringEncodingMacGreek },
-    { "x-mac-cyrillic", kCFStringEncodingMacCyrillic },
-    { "x-mac-devanagari", kCFStringEncodingMacDevanagari },
-    { "x-mac-gurmukhi", kCFStringEncodingMacGurmukhi },
-    { "x-mac-gujarati", kCFStringEncodingMacGujarati },
-    { "x-mac-thai", kCFStringEncodingMacThai },
-    { "x-mac-chinesesimp", kCFStringEncodingMacChineseSimp },
-    { "x-mac-simp-chinese", kCFStringEncodingMacChineseSimp },
-    { "x-mac-tibetan", kCFStringEncodingMacTibetan },
-    { "x-mac-ce", kCFStringEncodingMacCentralEurRoman },
-    { "x-mac-centraleurroman", kCFStringEncodingMacCentralEurRoman },
-    { "x-mac-symbol", kCFStringEncodingMacSymbol },
-    { "x-mac-dingbats", kCFStringEncodingMacDingbats },
-    { "x-mac-turkish", kCFStringEncodingMacTurkish },
-    { "x-mac-croatian", kCFStringEncodingMacCroatian },
-    { "x-mac-icelandic", kCFStringEncodingMacIcelandic },
-    { "x-mac-romanian", kCFStringEncodingMacRomanian },
-    { "x-mac-farsi", kCFStringEncodingMacFarsi },
-    { "x-mac-ukrainian", kCFStringEncodingMacUkrainian },
-    { "x-mac-vt100", kCFStringEncodingMacVT100 },
-    { "csisolatin2", kCFStringEncodingISOLatin2 },
-    { "iso-8859-2", kCFStringEncodingISOLatin2 },
-    { "iso-ir-101", kCFStringEncodingISOLatin2 },
-    { "iso8859-2", kCFStringEncodingISOLatin2 },
-    { "iso_8859-2", kCFStringEncodingISOLatin2 },
-    { "iso_8859-2:1987", kCFStringEncodingISOLatin2 },
-    { "l2", kCFStringEncodingISOLatin2 },
-    { "latin2", kCFStringEncodingISOLatin2 },
-    { "csisolatin3", kCFStringEncodingISOLatin3 },
-    { "iso-8859-3", kCFStringEncodingISOLatin3 },
-    { "iso-ir-109", kCFStringEncodingISOLatin3 },
-    { "iso_8859-3", kCFStringEncodingISOLatin3 },
-    { "iso_8859-3:1988", kCFStringEncodingISOLatin3 },
-    { "l3", kCFStringEncodingISOLatin3 },
-    { "latin3", kCFStringEncodingISOLatin3 },
-    { "csisolatin4", kCFStringEncodingISOLatin4 },
-    { "iso-8859-4", kCFStringEncodingISOLatin4 },
-    { "iso-ir-110", kCFStringEncodingISOLatin4 },
-    { "iso_8859-4", kCFStringEncodingISOLatin4 },
-    { "iso_8859-4:1988", kCFStringEncodingISOLatin4 },
-    { "l4", kCFStringEncodingISOLatin4 },
-    { "latin4", kCFStringEncodingISOLatin4 },
-    { "csisolatincyrillic", kCFStringEncodingISOLatinCyrillic },
-    { "cyrillic", kCFStringEncodingISOLatinCyrillic },
-    { "iso-8859-5", kCFStringEncodingISOLatinCyrillic },
-    { "iso-ir-144", kCFStringEncodingISOLatinCyrillic },
-    { "iso_8859-5", kCFStringEncodingISOLatinCyrillic },
-    { "iso_8859-5:1988", kCFStringEncodingISOLatinCyrillic },
-    { "arabic", kCFStringEncodingISOLatinArabic },
-    { "asmo-708", kCFStringEncodingISOLatinArabic },
-    { "csisolatinarabic", kCFStringEncodingISOLatinArabic },
-    { "ecma-114", kCFStringEncodingISOLatinArabic },
-    { "iso-8859-6", kCFStringEncodingISOLatinArabic },
-    { "iso-ir-127", kCFStringEncodingISOLatinArabic },
-    { "iso_8859-6", kCFStringEncodingISOLatinArabic },
-    { "iso_8859-6:1987", kCFStringEncodingISOLatinArabic },
-    { "csisolatingreek", kCFStringEncodingISOLatinGreek },
-    { "ecma-118", kCFStringEncodingISOLatinGreek },
-    { "elot_928", kCFStringEncodingISOLatinGreek },
-    { "greek", kCFStringEncodingISOLatinGreek },
-    { "greek8", kCFStringEncodingISOLatinGreek },
-    { "iso-8859-7", kCFStringEncodingISOLatinGreek },
-    { "iso-ir-126", kCFStringEncodingISOLatinGreek },
-    { "iso_8859-7", kCFStringEncodingISOLatinGreek },
-    { "iso_8859-7:1987", kCFStringEncodingISOLatinGreek },
-    { "csiso88598e", kCFStringEncodingISOLatinHebrew },
-    { "csiso88598i", kCFStringEncodingISOLatinHebrew },
-    { "csisolatinhebrew", kCFStringEncodingISOLatinHebrew },
-    { "dos-862", kCFStringEncodingISOLatinHebrew },
-    { "hebrew", kCFStringEncodingISOLatinHebrew },
-    { "iso-8859-8", kCFStringEncodingISOLatinHebrew },
-    { "iso-8859-8-e", kCFStringEncodingISOLatinHebrew },
-    { "iso-8859-8-i", kCFStringEncodingISOLatinHebrew },
-    { "iso-ir-138", kCFStringEncodingISOLatinHebrew },
-    { "iso_8859-8", kCFStringEncodingISOLatinHebrew },
-    { "iso_8859-8-e", kCFStringEncodingISOLatinHebrew },
-    { "iso_8859-8-i", kCFStringEncodingISOLatinHebrew },
-    { "iso_8859-8:1988", kCFStringEncodingISOLatinHebrew },
-    { "logical", kCFStringEncodingISOLatinHebrew },
-    { "visual", kCFStringEncodingISOLatinHebrew },
-    { "csisolatin5", kCFStringEncodingISOLatin5 },
-    { "iso-8859-9", kCFStringEncodingISOLatin5 },
-    { "iso-ir-148", kCFStringEncodingISOLatin5 },
-    { "iso_8859-9", kCFStringEncodingISOLatin5 },
-    { "iso_8859-9:1989", kCFStringEncodingISOLatin5 },
-    { "l5", kCFStringEncodingISOLatin5 },
-    { "latin5", kCFStringEncodingISOLatin5 },
-    { "csisolatin6", kCFStringEncodingISOLatin6 },
-    { "iso-8859-10", kCFStringEncodingISOLatin6 },
-    { "iso-ir-157", kCFStringEncodingISOLatin6 },
-    { "iso_8859-10:1992", kCFStringEncodingISOLatin6 },
-    { "l6", kCFStringEncodingISOLatin6 },
-    { "latin6", kCFStringEncodingISOLatin6 },
-    { "iso-8859-11", kCFStringEncodingISOLatinThai },
-    { "iso-8859-13", kCFStringEncodingISOLatin7 },
-    { "iso-8859-14", kCFStringEncodingISOLatin8 },
-    { "iso-celtic", kCFStringEncodingISOLatin8 },
-    { "iso-ir-199", kCFStringEncodingISOLatin8 },
-    { "iso_8859-14", kCFStringEncodingISOLatin8 },
-    { "iso_8859-14:1998", kCFStringEncodingISOLatin8 },
-    { "l8", kCFStringEncodingISOLatin8 },
-    { "latin8", kCFStringEncodingISOLatin8 },
-    { "csisolatin9", kCFStringEncodingISOLatin9 },
-    { "iso-8859-15", kCFStringEncodingISOLatin9 },
-    { "iso_8859-15", kCFStringEncodingISOLatin9 },
-    { "l9", kCFStringEncodingISOLatin9 },
-    { "latin-9", kCFStringEncodingISOLatin9 },
-    { "latin9", kCFStringEncodingISOLatin9 },
-    { "437", kCFStringEncodingDOSLatinUS },
-    { "cp437", kCFStringEncodingDOSLatinUS },
-    { "cspc8codepage437", kCFStringEncodingDOSLatinUS },
-    { "ibm437", kCFStringEncodingDOSLatinUS },
-    { "cp737", kCFStringEncodingDOSGreek },
-    { "ibm737", kCFStringEncodingDOSGreek },
-    { "cp500", kCFStringEncodingDOSBalticRim },
-    { "cp775", kCFStringEncodingDOSBalticRim },
-    { "csibm500", kCFStringEncodingDOSBalticRim },
-    { "cspc775baltic", kCFStringEncodingDOSBalticRim },
-    { "ebcdic-cp-be", kCFStringEncodingDOSBalticRim },
-    { "ebcdic-cp-ch", kCFStringEncodingDOSBalticRim },
-    { "ibm500", kCFStringEncodingDOSBalticRim },
-    { "ibm775", kCFStringEncodingDOSBalticRim },
-    { "850", kCFStringEncodingDOSLatin1 },
-    { "cp850", kCFStringEncodingDOSLatin1 },
-    { "cspc850multilingual", kCFStringEncodingDOSLatin1 },
-    { "ibm850", kCFStringEncodingDOSLatin1 },
-    { "852", kCFStringEncodingDOSLatin2 },
-    { "cp852", kCFStringEncodingDOSLatin2 },
-    { "cspcp852", kCFStringEncodingDOSLatin2 },
-    { "ibm852", kCFStringEncodingDOSLatin2 },
-    { "857", kCFStringEncodingDOSTurkish },
-    { "cp857", kCFStringEncodingDOSTurkish },
-    { "csibm857", kCFStringEncodingDOSTurkish },
-    { "ibm857", kCFStringEncodingDOSTurkish },
-    { "861", kCFStringEncodingDOSIcelandic },
-    { "cp-is", kCFStringEncodingDOSIcelandic },
-    { "cp861", kCFStringEncodingDOSIcelandic },
-    { "csibm861", kCFStringEncodingDOSIcelandic },
-    { "ibm861", kCFStringEncodingDOSIcelandic },
-    { "cp864", kCFStringEncodingDOSArabic },
-    { "csibm864", kCFStringEncodingDOSArabic },
-    { "dos-720", kCFStringEncodingDOSArabic },
-    { "ibm864", kCFStringEncodingDOSArabic },
-    { "866", kCFStringEncodingDOSRussian },
-    { "cp866", kCFStringEncodingDOSRussian },
-    { "csibm866", kCFStringEncodingDOSRussian },
-    { "ibm866", kCFStringEncodingDOSRussian },
-    { "869", kCFStringEncodingDOSGreek2 },
-    { "cp-gr", kCFStringEncodingDOSGreek2 },
-    { "cp869", kCFStringEncodingDOSGreek2 },
-    { "csibm869", kCFStringEncodingDOSGreek2 },
-    { "ibm869", kCFStringEncodingDOSGreek2 },
-    { "cp874", kCFStringEncodingDOSThai },
-    { "dos-874", kCFStringEncodingDOSThai },
-    { "tis-620", kCFStringEncodingDOSThai },
-    { "windows-874", kCFStringEncodingDOSThai },
-    { "cp932", kCFStringEncodingDOSJapanese },
-    { "csshiftjis", kCFStringEncodingDOSJapanese },
-    { "cswindows31j", kCFStringEncodingDOSJapanese },
-    { "ms_kanji", kCFStringEncodingDOSJapanese },
-    { "shift-jis", kCFStringEncodingDOSJapanese },
-    { "shift_jis", kCFStringEncodingDOSJapanese },
-    { "windows-31j", kCFStringEncodingDOSJapanese },
-    { "x-ms-cp932", kCFStringEncodingDOSJapanese },
-    { "x-sjis", kCFStringEncodingDOSJapanese },
-    { "cp949", kCFStringEncodingDOSKorean },
-    { "big5", kCFStringEncodingDOSChineseTrad },
-    { "cn-big5", kCFStringEncodingDOSChineseTrad },
-    { "cp950", kCFStringEncodingDOSChineseTrad },
-    { "csbig5", kCFStringEncodingDOSChineseTrad },
-    { "x-x-big5", kCFStringEncodingDOSChineseTrad },
-    { "windows-1250", kCFStringEncodingWindowsLatin2 },
-    { "winlatin2", kCFStringEncodingWindowsLatin2 },
-    { "x-cp1250", kCFStringEncodingWindowsLatin2 },
-    { "wincyrillic", kCFStringEncodingWindowsCyrillic },
-    { "windows-1251", kCFStringEncodingWindowsCyrillic },
-    { "x-cp1251", kCFStringEncodingWindowsCyrillic },
-    { "windows-1253", kCFStringEncodingWindowsGreek },
-    { "wingreek", kCFStringEncodingWindowsGreek },
-    { "windows-1254", kCFStringEncodingWindowsLatin5 },
-    { "winturkish", kCFStringEncodingWindowsLatin5 },
-    { "windows-1255", kCFStringEncodingWindowsHebrew },
-    { "winhebrew", kCFStringEncodingWindowsHebrew },
-    { "cp1256", kCFStringEncodingWindowsArabic },
-    { "winarabic", kCFStringEncodingWindowsArabic },
-    { "windows-1256", kCFStringEncodingWindowsArabic },
-    { "winbaltic", kCFStringEncodingWindowsBalticRim },
-    { "windows-1257", kCFStringEncodingWindowsBalticRim },
-    { "johab", kCFStringEncodingWindowsKoreanJohab },
-    { "windows-1258", kCFStringEncodingWindowsVietnamese },
-    { "winvietnamese", kCFStringEncodingWindowsVietnamese },
-    { "cshalfwidthkatakana", kCFStringEncodingJIS_X0201_76 },
-    { "jis_x0201", kCFStringEncodingJIS_X0201_76 },
-    { "x0201", kCFStringEncodingJIS_X0201_76 },
-    { "csiso87jisx0208", kCFStringEncodingJIS_X0208_83 },
-    { "iso-ir-87", kCFStringEncodingJIS_X0208_83 },
-    { "jis_c6226-1983", kCFStringEncodingJIS_X0208_83 },
-    { "jis_x0208-1983", kCFStringEncodingJIS_X0208_83 },
-    { "x0208", kCFStringEncodingJIS_X0208_83 },
-    { "jis_x0208-1990", kCFStringEncodingJIS_X0208_90 },
-    { "csiso159jisx02121990", kCFStringEncodingJIS_X0212_90 },
-    { "iso-ir-159", kCFStringEncodingJIS_X0212_90 },
-    { "jis_x0212-1990", kCFStringEncodingJIS_X0212_90 },
-    { "x0212", kCFStringEncodingJIS_X0212_90 },
-    { "csiso42jisc62261978", kCFStringEncodingJIS_C6226_78 },
-    { "iso-ir-42", kCFStringEncodingJIS_C6226_78 },
-    { "jis_c6226-1978", kCFStringEncodingJIS_C6226_78 },
-    { "chinese", kCFStringEncodingGB_2312_80 },
-    { "csgb231280", kCFStringEncodingGB_2312_80 },
-    { "csiso58gb231280", kCFStringEncodingGB_2312_80 },
-    { "gb2312-80", kCFStringEncodingGB_2312_80 },
-    { "gb231280", kCFStringEncodingGB_2312_80 },
-    { "gb_2312-80", kCFStringEncodingGB_2312_80 },
-    { "iso-ir-58", kCFStringEncodingGB_2312_80 },
-    { "x-gbk", kCFStringEncodingGBK_95 },
-    { "gb18030", kCFStringEncodingGB_18030_2000 },
-    { "csiso2022jp", kCFStringEncodingISO_2022_JP },
-    { "iso-2022-jp", kCFStringEncodingISO_2022_JP },
-    { "csiso2022jp2", kCFStringEncodingISO_2022_JP_2 },
-    { "iso-2022-jp-2", kCFStringEncodingISO_2022_JP_2 },
-    { "iso-2022-jp-1", kCFStringEncodingISO_2022_JP_1 },
-    { "iso-2022-jp-3", kCFStringEncodingISO_2022_JP_3 },
-    { "iso-2022-cn", kCFStringEncodingISO_2022_CN },
-    { "iso-2022-cn-ext", kCFStringEncodingISO_2022_CN_EXT },
-    { "csiso2022kr", kCFStringEncodingISO_2022_KR },
-    { "iso-2022-kr", kCFStringEncodingISO_2022_KR },
-    { "cseucpkdfmtjapanese", kCFStringEncodingEUC_JP },
-    { "euc-jp", kCFStringEncodingEUC_JP },
-    { "extended_unix_code_packed_format_for_japanese", kCFStringEncodingEUC_JP },
-    { "x-euc", kCFStringEncodingEUC_JP },
-    { "x-euc-jp", kCFStringEncodingEUC_JP },
-    { "cn-gb", kCFStringEncodingEUC_CN },
-    { "cp936", kCFStringEncodingEUC_CN },
-    { "csgb2312", kCFStringEncodingEUC_CN },
-    { "euc-cn", kCFStringEncodingEUC_CN },
-    { "gb2312", kCFStringEncodingEUC_CN },
-    { "gbk", kCFStringEncodingEUC_CN },
-    { "ms936", kCFStringEncodingEUC_CN },
-    { "windows-936", kCFStringEncodingEUC_CN },
-    { "x-euc-cn", kCFStringEncodingEUC_CN },
-    { "euc-tw", kCFStringEncodingEUC_TW },
-    { "cseuckr", kCFStringEncodingEUC_KR },
-    { "euc-kr", kCFStringEncodingEUC_KR },
-    { "cskoi8r", kCFStringEncodingKOI8_R },
-    { "koi", kCFStringEncodingKOI8_R },
-    { "koi8", kCFStringEncodingKOI8_R },
-    { "koi8-r", kCFStringEncodingKOI8_R },
-    { "koi8r", kCFStringEncodingKOI8_R },
-    { "x-mac-roman-latin1", kCFStringEncodingMacRomanLatin1 },
-    { "hz-gb-2312", kCFStringEncodingHZ_GB_2312 },
-    { "big5-hkscs", kCFStringEncodingBig5_HKSCS_1999 },
-    { "cp037", kCFStringEncodingEBCDIC_CP037 },
-    { "csibm037", kCFStringEncodingEBCDIC_CP037 },
-    { "ebcdic-cp-ca", kCFStringEncodingEBCDIC_CP037 },
-    { "ebcdic-cp-nl", kCFStringEncodingEBCDIC_CP037 },
-    { "ebcdic-cp-us", kCFStringEncodingEBCDIC_CP037 },
-    { "ebcdic-cp-wt", kCFStringEncodingEBCDIC_CP037 },
-    { "ibm037", kCFStringEncodingEBCDIC_CP037 },
-    { 0, kCFStringEncodingInvalidId }
+    { "csmacintosh", kCFStringEncodingMacRoman, NoEncodingFlags },
+    { "mac", kCFStringEncodingMacRoman, NoEncodingFlags },
+    { "macintosh", kCFStringEncodingMacRoman, NoEncodingFlags },
+    { "x-mac-roman", kCFStringEncodingMacRoman, NoEncodingFlags },
+    { "windows-1252", kCFStringEncodingWindowsLatin1, NoEncodingFlags },
+    { "winlatin1", kCFStringEncodingWindowsLatin1, NoEncodingFlags },
+    { "x-ansi", kCFStringEncodingWindowsLatin1, NoEncodingFlags },
+    { "8859_1", kCFStringEncodingISOLatin1, NoEncodingFlags },
+    { "cp819", kCFStringEncodingISOLatin1, NoEncodingFlags },
+    { "csisolatin1", kCFStringEncodingISOLatin1, NoEncodingFlags },
+    { "ibm819", kCFStringEncodingISOLatin1, NoEncodingFlags },
+    { "iso-8859-1", kCFStringEncodingISOLatin1, NoEncodingFlags },
+    { "iso-ir-100", kCFStringEncodingISOLatin1, NoEncodingFlags },
+    { "iso8859-1", kCFStringEncodingISOLatin1, NoEncodingFlags },
+    { "iso_8859-1", kCFStringEncodingISOLatin1, NoEncodingFlags },
+    { "iso_8859-1:1987", kCFStringEncodingISOLatin1, NoEncodingFlags },
+    { "l1", kCFStringEncodingISOLatin1, NoEncodingFlags },
+    { "latin1", kCFStringEncodingISOLatin1, NoEncodingFlags },
+    { "x-nextstep", kCFStringEncodingNextStepLatin, NoEncodingFlags },
+    { "ansi_x3.4-1968", kCFStringEncodingASCII, NoEncodingFlags },
+    { "ansi_x3.4-1986", kCFStringEncodingASCII, NoEncodingFlags },
+    { "ascii", kCFStringEncodingASCII, NoEncodingFlags },
+    { "cp367", kCFStringEncodingASCII, NoEncodingFlags },
+    { "csascii", kCFStringEncodingASCII, NoEncodingFlags },
+    { "ibm367", kCFStringEncodingASCII, NoEncodingFlags },
+    { "iso-ir-6", kCFStringEncodingASCII, NoEncodingFlags },
+    { "iso-ir-6us", kCFStringEncodingASCII, NoEncodingFlags },
+    { "iso646-us", kCFStringEncodingASCII, NoEncodingFlags },
+    { "iso_646.irv:1991", kCFStringEncodingASCII, NoEncodingFlags },
+    { "us", kCFStringEncodingASCII, NoEncodingFlags },
+    { "us-ascii", kCFStringEncodingASCII, NoEncodingFlags },
+    { "csunicode", kCFStringEncodingUnicode, NoEncodingFlags },
+    { "iso-10646-ucs-2", kCFStringEncodingUnicode, NoEncodingFlags },
+    { "unicode", kCFStringEncodingUnicode, NoEncodingFlags },
+    { "utf-16", kCFStringEncodingUnicode, NoEncodingFlags },
+    { "unicodefeff", kCFStringEncodingUnicode, BigEndian },
+    { "utf-16be", kCFStringEncodingUnicode, BigEndian },
+    { "unicodefffe", kCFStringEncodingUnicode, LittleEndian },
+    { "utf-16le", kCFStringEncodingUnicode, LittleEndian },
+    { "unicode-1-1-utf-8", kCFStringEncodingUTF8, NoEncodingFlags },
+    { "unicode-2-0-utf-8", kCFStringEncodingUTF8, NoEncodingFlags },
+    { "utf-8", kCFStringEncodingUTF8, NoEncodingFlags },
+    { "x-unicode-2-0-utf-8", kCFStringEncodingUTF8, NoEncodingFlags },
+    { "x-mac-japanese", kCFStringEncodingMacJapanese, NoEncodingFlags },
+    { "x-mac-chinesetrad", kCFStringEncodingMacChineseTrad, NoEncodingFlags },
+    { "x-mac-trad-chinese", kCFStringEncodingMacChineseTrad, NoEncodingFlags },
+    { "csksc56011987", kCFStringEncodingMacKorean, NoEncodingFlags },
+    { "iso-ir-149", kCFStringEncodingMacKorean, NoEncodingFlags },
+    { "korean", kCFStringEncodingMacKorean, NoEncodingFlags },
+    { "ks_c_5601", kCFStringEncodingMacKorean, NoEncodingFlags },
+    { "ks_c_5601-1987", kCFStringEncodingMacKorean, NoEncodingFlags },
+    { "ks_c_5601-1989", kCFStringEncodingMacKorean, NoEncodingFlags },
+    { "ks_c_5601_1987", kCFStringEncodingMacKorean, NoEncodingFlags },
+    { "ksc5601", kCFStringEncodingMacKorean, NoEncodingFlags },
+    { "ksc_5601", kCFStringEncodingMacKorean, NoEncodingFlags },
+    { "x-mac-korean", kCFStringEncodingMacKorean, NoEncodingFlags },
+    { "x-mac-arabic", kCFStringEncodingMacArabic, NoEncodingFlags },
+    { "x-mac-hebrew", kCFStringEncodingMacHebrew, NoEncodingFlags },
+    { "x-mac-greek", kCFStringEncodingMacGreek, NoEncodingFlags },
+    { "x-mac-cyrillic", kCFStringEncodingMacCyrillic, NoEncodingFlags },
+    { "x-mac-devanagari", kCFStringEncodingMacDevanagari, NoEncodingFlags },
+    { "x-mac-gurmukhi", kCFStringEncodingMacGurmukhi, NoEncodingFlags },
+    { "x-mac-gujarati", kCFStringEncodingMacGujarati, NoEncodingFlags },
+    { "x-mac-thai", kCFStringEncodingMacThai, NoEncodingFlags },
+    { "x-mac-chinesesimp", kCFStringEncodingMacChineseSimp, NoEncodingFlags },
+    { "x-mac-simp-chinese", kCFStringEncodingMacChineseSimp, NoEncodingFlags },
+    { "x-mac-tibetan", kCFStringEncodingMacTibetan, NoEncodingFlags },
+    { "x-mac-ce", kCFStringEncodingMacCentralEurRoman, NoEncodingFlags },
+    { "x-mac-centraleurroman", kCFStringEncodingMacCentralEurRoman, NoEncodingFlags },
+    { "x-mac-symbol", kCFStringEncodingMacSymbol, NoEncodingFlags },
+    { "x-mac-dingbats", kCFStringEncodingMacDingbats, NoEncodingFlags },
+    { "x-mac-turkish", kCFStringEncodingMacTurkish, NoEncodingFlags },
+    { "x-mac-croatian", kCFStringEncodingMacCroatian, NoEncodingFlags },
+    { "x-mac-icelandic", kCFStringEncodingMacIcelandic, NoEncodingFlags },
+    { "x-mac-romanian", kCFStringEncodingMacRomanian, NoEncodingFlags },
+    { "x-mac-farsi", kCFStringEncodingMacFarsi, NoEncodingFlags },
+    { "x-mac-ukrainian", kCFStringEncodingMacUkrainian, NoEncodingFlags },
+    { "x-mac-vt100", kCFStringEncodingMacVT100, NoEncodingFlags },
+    { "csisolatin2", kCFStringEncodingISOLatin2, NoEncodingFlags },
+    { "iso-8859-2", kCFStringEncodingISOLatin2, NoEncodingFlags },
+    { "iso-ir-101", kCFStringEncodingISOLatin2, NoEncodingFlags },
+    { "iso8859-2", kCFStringEncodingISOLatin2, NoEncodingFlags },
+    { "iso_8859-2", kCFStringEncodingISOLatin2, NoEncodingFlags },
+    { "iso_8859-2:1987", kCFStringEncodingISOLatin2, NoEncodingFlags },
+    { "l2", kCFStringEncodingISOLatin2, NoEncodingFlags },
+    { "latin2", kCFStringEncodingISOLatin2, NoEncodingFlags },
+    { "csisolatin3", kCFStringEncodingISOLatin3, NoEncodingFlags },
+    { "iso-8859-3", kCFStringEncodingISOLatin3, NoEncodingFlags },
+    { "iso-ir-109", kCFStringEncodingISOLatin3, NoEncodingFlags },
+    { "iso_8859-3", kCFStringEncodingISOLatin3, NoEncodingFlags },
+    { "iso_8859-3:1988", kCFStringEncodingISOLatin3, NoEncodingFlags },
+    { "l3", kCFStringEncodingISOLatin3, NoEncodingFlags },
+    { "latin3", kCFStringEncodingISOLatin3, NoEncodingFlags },
+    { "csisolatin4", kCFStringEncodingISOLatin4, NoEncodingFlags },
+    { "iso-8859-4", kCFStringEncodingISOLatin4, NoEncodingFlags },
+    { "iso-ir-110", kCFStringEncodingISOLatin4, NoEncodingFlags },
+    { "iso_8859-4", kCFStringEncodingISOLatin4, NoEncodingFlags },
+    { "iso_8859-4:1988", kCFStringEncodingISOLatin4, NoEncodingFlags },
+    { "l4", kCFStringEncodingISOLatin4, NoEncodingFlags },
+    { "latin4", kCFStringEncodingISOLatin4, NoEncodingFlags },
+    { "csisolatincyrillic", kCFStringEncodingISOLatinCyrillic, NoEncodingFlags },
+    { "cyrillic", kCFStringEncodingISOLatinCyrillic, NoEncodingFlags },
+    { "iso-8859-5", kCFStringEncodingISOLatinCyrillic, NoEncodingFlags },
+    { "iso-ir-144", kCFStringEncodingISOLatinCyrillic, NoEncodingFlags },
+    { "iso_8859-5", kCFStringEncodingISOLatinCyrillic, NoEncodingFlags },
+    { "iso_8859-5:1988", kCFStringEncodingISOLatinCyrillic, NoEncodingFlags },
+    { "arabic", kCFStringEncodingISOLatinArabic, NoEncodingFlags },
+    { "asmo-708", kCFStringEncodingISOLatinArabic, NoEncodingFlags },
+    { "csisolatinarabic", kCFStringEncodingISOLatinArabic, NoEncodingFlags },
+    { "ecma-114", kCFStringEncodingISOLatinArabic, NoEncodingFlags },
+    { "iso-8859-6", kCFStringEncodingISOLatinArabic, NoEncodingFlags },
+    { "iso-ir-127", kCFStringEncodingISOLatinArabic, NoEncodingFlags },
+    { "iso_8859-6", kCFStringEncodingISOLatinArabic, NoEncodingFlags },
+    { "iso_8859-6:1987", kCFStringEncodingISOLatinArabic, NoEncodingFlags },
+    { "csisolatingreek", kCFStringEncodingISOLatinGreek, NoEncodingFlags },
+    { "ecma-118", kCFStringEncodingISOLatinGreek, NoEncodingFlags },
+    { "elot_928", kCFStringEncodingISOLatinGreek, NoEncodingFlags },
+    { "greek", kCFStringEncodingISOLatinGreek, NoEncodingFlags },
+    { "greek8", kCFStringEncodingISOLatinGreek, NoEncodingFlags },
+    { "iso-8859-7", kCFStringEncodingISOLatinGreek, NoEncodingFlags },
+    { "iso-ir-126", kCFStringEncodingISOLatinGreek, NoEncodingFlags },
+    { "iso_8859-7", kCFStringEncodingISOLatinGreek, NoEncodingFlags },
+    { "iso_8859-7:1987", kCFStringEncodingISOLatinGreek, NoEncodingFlags },
+    { "csiso88598i", kCFStringEncodingISOLatinHebrew, NoEncodingFlags },
+    { "iso-8859-8-i", kCFStringEncodingISOLatinHebrew, NoEncodingFlags },
+    { "iso_8859-8-i", kCFStringEncodingISOLatinHebrew, NoEncodingFlags },
+    { "logical", kCFStringEncodingISOLatinHebrew, NoEncodingFlags },
+    { "csiso88598e", kCFStringEncodingISOLatinHebrew, VisualOrdering },
+    { "csisolatinhebrew", kCFStringEncodingISOLatinHebrew, VisualOrdering },
+    { "dos-862", kCFStringEncodingISOLatinHebrew, VisualOrdering },
+    { "hebrew", kCFStringEncodingISOLatinHebrew, VisualOrdering },
+    { "iso-8859-8", kCFStringEncodingISOLatinHebrew, VisualOrdering },
+    { "iso-8859-8-e", kCFStringEncodingISOLatinHebrew, VisualOrdering },
+    { "iso-ir-138", kCFStringEncodingISOLatinHebrew, VisualOrdering },
+    { "iso_8859-8", kCFStringEncodingISOLatinHebrew, VisualOrdering },
+    { "iso_8859-8-e", kCFStringEncodingISOLatinHebrew, VisualOrdering },
+    { "iso_8859-8:1988", kCFStringEncodingISOLatinHebrew, VisualOrdering },
+    { "visual", kCFStringEncodingISOLatinHebrew, VisualOrdering },
+    { "csisolatin5", kCFStringEncodingISOLatin5, NoEncodingFlags },
+    { "iso-8859-9", kCFStringEncodingISOLatin5, NoEncodingFlags },
+    { "iso-ir-148", kCFStringEncodingISOLatin5, NoEncodingFlags },
+    { "iso_8859-9", kCFStringEncodingISOLatin5, NoEncodingFlags },
+    { "iso_8859-9:1989", kCFStringEncodingISOLatin5, NoEncodingFlags },
+    { "l5", kCFStringEncodingISOLatin5, NoEncodingFlags },
+    { "latin5", kCFStringEncodingISOLatin5, NoEncodingFlags },
+    { "csisolatin6", kCFStringEncodingISOLatin6, NoEncodingFlags },
+    { "iso-8859-10", kCFStringEncodingISOLatin6, NoEncodingFlags },
+    { "iso-ir-157", kCFStringEncodingISOLatin6, NoEncodingFlags },
+    { "iso_8859-10:1992", kCFStringEncodingISOLatin6, NoEncodingFlags },
+    { "l6", kCFStringEncodingISOLatin6, NoEncodingFlags },
+    { "latin6", kCFStringEncodingISOLatin6, NoEncodingFlags },
+    { "iso-8859-11", kCFStringEncodingISOLatinThai, NoEncodingFlags },
+    { "iso-8859-13", kCFStringEncodingISOLatin7, NoEncodingFlags },
+    { "iso-8859-14", kCFStringEncodingISOLatin8, NoEncodingFlags },
+    { "iso-celtic", kCFStringEncodingISOLatin8, NoEncodingFlags },
+    { "iso-ir-199", kCFStringEncodingISOLatin8, NoEncodingFlags },
+    { "iso_8859-14", kCFStringEncodingISOLatin8, NoEncodingFlags },
+    { "iso_8859-14:1998", kCFStringEncodingISOLatin8, NoEncodingFlags },
+    { "l8", kCFStringEncodingISOLatin8, NoEncodingFlags },
+    { "latin8", kCFStringEncodingISOLatin8, NoEncodingFlags },
+    { "csisolatin9", kCFStringEncodingISOLatin9, NoEncodingFlags },
+    { "iso-8859-15", kCFStringEncodingISOLatin9, NoEncodingFlags },
+    { "iso_8859-15", kCFStringEncodingISOLatin9, NoEncodingFlags },
+    { "l9", kCFStringEncodingISOLatin9, NoEncodingFlags },
+    { "latin-9", kCFStringEncodingISOLatin9, NoEncodingFlags },
+    { "latin9", kCFStringEncodingISOLatin9, NoEncodingFlags },
+    { "437", kCFStringEncodingDOSLatinUS, NoEncodingFlags },
+    { "cp437", kCFStringEncodingDOSLatinUS, NoEncodingFlags },
+    { "cspc8codepage437", kCFStringEncodingDOSLatinUS, NoEncodingFlags },
+    { "ibm437", kCFStringEncodingDOSLatinUS, NoEncodingFlags },
+    { "cp737", kCFStringEncodingDOSGreek, NoEncodingFlags },
+    { "ibm737", kCFStringEncodingDOSGreek, NoEncodingFlags },
+    { "cp500", kCFStringEncodingDOSBalticRim, NoEncodingFlags },
+    { "cp775", kCFStringEncodingDOSBalticRim, NoEncodingFlags },
+    { "csibm500", kCFStringEncodingDOSBalticRim, NoEncodingFlags },
+    { "cspc775baltic", kCFStringEncodingDOSBalticRim, NoEncodingFlags },
+    { "ebcdic-cp-be", kCFStringEncodingDOSBalticRim, NoEncodingFlags },
+    { "ebcdic-cp-ch", kCFStringEncodingDOSBalticRim, NoEncodingFlags },
+    { "ibm500", kCFStringEncodingDOSBalticRim, NoEncodingFlags },
+    { "ibm775", kCFStringEncodingDOSBalticRim, NoEncodingFlags },
+    { "850", kCFStringEncodingDOSLatin1, NoEncodingFlags },
+    { "cp850", kCFStringEncodingDOSLatin1, NoEncodingFlags },
+    { "cspc850multilingual", kCFStringEncodingDOSLatin1, NoEncodingFlags },
+    { "ibm850", kCFStringEncodingDOSLatin1, NoEncodingFlags },
+    { "852", kCFStringEncodingDOSLatin2, NoEncodingFlags },
+    { "cp852", kCFStringEncodingDOSLatin2, NoEncodingFlags },
+    { "cspcp852", kCFStringEncodingDOSLatin2, NoEncodingFlags },
+    { "ibm852", kCFStringEncodingDOSLatin2, NoEncodingFlags },
+    { "857", kCFStringEncodingDOSTurkish, NoEncodingFlags },
+    { "cp857", kCFStringEncodingDOSTurkish, NoEncodingFlags },
+    { "csibm857", kCFStringEncodingDOSTurkish, NoEncodingFlags },
+    { "ibm857", kCFStringEncodingDOSTurkish, NoEncodingFlags },
+    { "861", kCFStringEncodingDOSIcelandic, NoEncodingFlags },
+    { "cp-is", kCFStringEncodingDOSIcelandic, NoEncodingFlags },
+    { "cp861", kCFStringEncodingDOSIcelandic, NoEncodingFlags },
+    { "csibm861", kCFStringEncodingDOSIcelandic, NoEncodingFlags },
+    { "ibm861", kCFStringEncodingDOSIcelandic, NoEncodingFlags },
+    { "cp864", kCFStringEncodingDOSArabic, NoEncodingFlags },
+    { "csibm864", kCFStringEncodingDOSArabic, NoEncodingFlags },
+    { "dos-720", kCFStringEncodingDOSArabic, NoEncodingFlags },
+    { "ibm864", kCFStringEncodingDOSArabic, NoEncodingFlags },
+    { "866", kCFStringEncodingDOSRussian, NoEncodingFlags },
+    { "cp866", kCFStringEncodingDOSRussian, NoEncodingFlags },
+    { "csibm866", kCFStringEncodingDOSRussian, NoEncodingFlags },
+    { "ibm866", kCFStringEncodingDOSRussian, NoEncodingFlags },
+    { "869", kCFStringEncodingDOSGreek2, NoEncodingFlags },
+    { "cp-gr", kCFStringEncodingDOSGreek2, NoEncodingFlags },
+    { "cp869", kCFStringEncodingDOSGreek2, NoEncodingFlags },
+    { "csibm869", kCFStringEncodingDOSGreek2, NoEncodingFlags },
+    { "ibm869", kCFStringEncodingDOSGreek2, NoEncodingFlags },
+    { "cp874", kCFStringEncodingDOSThai, NoEncodingFlags },
+    { "dos-874", kCFStringEncodingDOSThai, NoEncodingFlags },
+    { "tis-620", kCFStringEncodingDOSThai, NoEncodingFlags },
+    { "windows-874", kCFStringEncodingDOSThai, NoEncodingFlags },
+    { "cp932", kCFStringEncodingDOSJapanese, NoEncodingFlags },
+    { "csshiftjis", kCFStringEncodingDOSJapanese, NoEncodingFlags },
+    { "cswindows31j", kCFStringEncodingDOSJapanese, NoEncodingFlags },
+    { "ms_kanji", kCFStringEncodingDOSJapanese, NoEncodingFlags },
+    { "shift-jis", kCFStringEncodingDOSJapanese, NoEncodingFlags },
+    { "shift_jis", kCFStringEncodingDOSJapanese, NoEncodingFlags },
+    { "windows-31j", kCFStringEncodingDOSJapanese, NoEncodingFlags },
+    { "x-ms-cp932", kCFStringEncodingDOSJapanese, NoEncodingFlags },
+    { "x-sjis", kCFStringEncodingDOSJapanese, NoEncodingFlags },
+    { "cp949", kCFStringEncodingDOSKorean, NoEncodingFlags },
+    { "big5", kCFStringEncodingDOSChineseTrad, NoEncodingFlags },
+    { "cn-big5", kCFStringEncodingDOSChineseTrad, NoEncodingFlags },
+    { "cp950", kCFStringEncodingDOSChineseTrad, NoEncodingFlags },
+    { "csbig5", kCFStringEncodingDOSChineseTrad, NoEncodingFlags },
+    { "x-x-big5", kCFStringEncodingDOSChineseTrad, NoEncodingFlags },
+    { "windows-1250", kCFStringEncodingWindowsLatin2, NoEncodingFlags },
+    { "winlatin2", kCFStringEncodingWindowsLatin2, NoEncodingFlags },
+    { "x-cp1250", kCFStringEncodingWindowsLatin2, NoEncodingFlags },
+    { "wincyrillic", kCFStringEncodingWindowsCyrillic, NoEncodingFlags },
+    { "windows-1251", kCFStringEncodingWindowsCyrillic, NoEncodingFlags },
+    { "x-cp1251", kCFStringEncodingWindowsCyrillic, NoEncodingFlags },
+    { "windows-1253", kCFStringEncodingWindowsGreek, NoEncodingFlags },
+    { "wingreek", kCFStringEncodingWindowsGreek, NoEncodingFlags },
+    { "windows-1254", kCFStringEncodingWindowsLatin5, NoEncodingFlags },
+    { "winturkish", kCFStringEncodingWindowsLatin5, NoEncodingFlags },
+    { "windows-1255", kCFStringEncodingWindowsHebrew, NoEncodingFlags },
+    { "winhebrew", kCFStringEncodingWindowsHebrew, NoEncodingFlags },
+    { "cp1256", kCFStringEncodingWindowsArabic, NoEncodingFlags },
+    { "winarabic", kCFStringEncodingWindowsArabic, NoEncodingFlags },
+    { "windows-1256", kCFStringEncodingWindowsArabic, NoEncodingFlags },
+    { "winbaltic", kCFStringEncodingWindowsBalticRim, NoEncodingFlags },
+    { "windows-1257", kCFStringEncodingWindowsBalticRim, NoEncodingFlags },
+    { "johab", kCFStringEncodingWindowsKoreanJohab, NoEncodingFlags },
+    { "windows-1258", kCFStringEncodingWindowsVietnamese, NoEncodingFlags },
+    { "winvietnamese", kCFStringEncodingWindowsVietnamese, NoEncodingFlags },
+    { "cshalfwidthkatakana", kCFStringEncodingJIS_X0201_76, NoEncodingFlags },
+    { "jis_x0201", kCFStringEncodingJIS_X0201_76, NoEncodingFlags },
+    { "x0201", kCFStringEncodingJIS_X0201_76, NoEncodingFlags },
+    { "csiso87jisx0208", kCFStringEncodingJIS_X0208_83, NoEncodingFlags },
+    { "iso-ir-87", kCFStringEncodingJIS_X0208_83, NoEncodingFlags },
+    { "jis_c6226-1983", kCFStringEncodingJIS_X0208_83, NoEncodingFlags },
+    { "jis_x0208-1983", kCFStringEncodingJIS_X0208_83, NoEncodingFlags },
+    { "x0208", kCFStringEncodingJIS_X0208_83, NoEncodingFlags },
+    { "jis_x0208-1990", kCFStringEncodingJIS_X0208_90, NoEncodingFlags },
+    { "csiso159jisx02121990", kCFStringEncodingJIS_X0212_90, NoEncodingFlags },
+    { "iso-ir-159", kCFStringEncodingJIS_X0212_90, NoEncodingFlags },
+    { "jis_x0212-1990", kCFStringEncodingJIS_X0212_90, NoEncodingFlags },
+    { "x0212", kCFStringEncodingJIS_X0212_90, NoEncodingFlags },
+    { "csiso42jisc62261978", kCFStringEncodingJIS_C6226_78, NoEncodingFlags },
+    { "iso-ir-42", kCFStringEncodingJIS_C6226_78, NoEncodingFlags },
+    { "jis_c6226-1978", kCFStringEncodingJIS_C6226_78, NoEncodingFlags },
+    { "chinese", kCFStringEncodingGB_2312_80, NoEncodingFlags },
+    { "csgb231280", kCFStringEncodingGB_2312_80, NoEncodingFlags },
+    { "csiso58gb231280", kCFStringEncodingGB_2312_80, NoEncodingFlags },
+    { "gb2312-80", kCFStringEncodingGB_2312_80, NoEncodingFlags },
+    { "gb231280", kCFStringEncodingGB_2312_80, NoEncodingFlags },
+    { "gb_2312-80", kCFStringEncodingGB_2312_80, NoEncodingFlags },
+    { "iso-ir-58", kCFStringEncodingGB_2312_80, NoEncodingFlags },
+    { "x-gbk", kCFStringEncodingGBK_95, NoEncodingFlags },
+    { "gb18030", kCFStringEncodingGB_18030_2000, NoEncodingFlags },
+    { "csiso2022jp", kCFStringEncodingISO_2022_JP, NoEncodingFlags },
+    { "iso-2022-jp", kCFStringEncodingISO_2022_JP, NoEncodingFlags },
+    { "csiso2022jp2", kCFStringEncodingISO_2022_JP_2, NoEncodingFlags },
+    { "iso-2022-jp-2", kCFStringEncodingISO_2022_JP_2, NoEncodingFlags },
+    { "iso-2022-jp-1", kCFStringEncodingISO_2022_JP_1, NoEncodingFlags },
+    { "iso-2022-jp-3", kCFStringEncodingISO_2022_JP_3, NoEncodingFlags },
+    { "iso-2022-cn", kCFStringEncodingISO_2022_CN, NoEncodingFlags },
+    { "iso-2022-cn-ext", kCFStringEncodingISO_2022_CN_EXT, NoEncodingFlags },
+    { "csiso2022kr", kCFStringEncodingISO_2022_KR, NoEncodingFlags },
+    { "iso-2022-kr", kCFStringEncodingISO_2022_KR, NoEncodingFlags },
+    { "cseucpkdfmtjapanese", kCFStringEncodingEUC_JP, NoEncodingFlags },
+    { "euc-jp", kCFStringEncodingEUC_JP, NoEncodingFlags },
+    { "extended_unix_code_packed_format_for_japanese", kCFStringEncodingEUC_JP, NoEncodingFlags },
+    { "x-euc", kCFStringEncodingEUC_JP, NoEncodingFlags },
+    { "x-euc-jp", kCFStringEncodingEUC_JP, NoEncodingFlags },
+    { "cn-gb", kCFStringEncodingEUC_CN, NoEncodingFlags },
+    { "cp936", kCFStringEncodingEUC_CN, NoEncodingFlags },
+    { "csgb2312", kCFStringEncodingEUC_CN, NoEncodingFlags },
+    { "euc-cn", kCFStringEncodingEUC_CN, NoEncodingFlags },
+    { "gb2312", kCFStringEncodingEUC_CN, NoEncodingFlags },
+    { "gbk", kCFStringEncodingEUC_CN, NoEncodingFlags },
+    { "ms936", kCFStringEncodingEUC_CN, NoEncodingFlags },
+    { "windows-936", kCFStringEncodingEUC_CN, NoEncodingFlags },
+    { "x-euc-cn", kCFStringEncodingEUC_CN, NoEncodingFlags },
+    { "euc-tw", kCFStringEncodingEUC_TW, NoEncodingFlags },
+    { "cseuckr", kCFStringEncodingEUC_KR, NoEncodingFlags },
+    { "euc-kr", kCFStringEncodingEUC_KR, NoEncodingFlags },
+    { "cskoi8r", kCFStringEncodingKOI8_R, NoEncodingFlags },
+    { "koi", kCFStringEncodingKOI8_R, NoEncodingFlags },
+    { "koi8", kCFStringEncodingKOI8_R, NoEncodingFlags },
+    { "koi8-r", kCFStringEncodingKOI8_R, NoEncodingFlags },
+    { "koi8r", kCFStringEncodingKOI8_R, NoEncodingFlags },
+    { "x-mac-roman-latin1", kCFStringEncodingMacRomanLatin1, NoEncodingFlags },
+    { "hz-gb-2312", kCFStringEncodingHZ_GB_2312, NoEncodingFlags },
+    { "big5-hkscs", kCFStringEncodingBig5_HKSCS_1999, NoEncodingFlags },
+    { "cp037", kCFStringEncodingEBCDIC_CP037, NoEncodingFlags },
+    { "csibm037", kCFStringEncodingEBCDIC_CP037, NoEncodingFlags },
+    { "ebcdic-cp-ca", kCFStringEncodingEBCDIC_CP037, NoEncodingFlags },
+    { "ebcdic-cp-nl", kCFStringEncodingEBCDIC_CP037, NoEncodingFlags },
+    { "ebcdic-cp-us", kCFStringEncodingEBCDIC_CP037, NoEncodingFlags },
+    { "ebcdic-cp-wt", kCFStringEncodingEBCDIC_CP037, NoEncodingFlags },
+    { "ibm037", kCFStringEncodingEBCDIC_CP037, NoEncodingFlags },
+    { 0, kCFStringEncodingInvalidId, NoEncodingFlags }
 };
diff --git a/WebCore/kwq/KWQCharsets.h b/WebCore/kwq/KWQCharsets.h
index db54a18..59ef8c1 100644
--- a/WebCore/kwq/KWQCharsets.h
+++ b/WebCore/kwq/KWQCharsets.h
@@ -28,7 +28,14 @@
 
 #include <CoreFoundation/CoreFoundation.h>
 
-CFStringEncoding KWQCFStringEncodingFromIANACharsetName(const char *);
+enum KWQEncodingFlags {
+    NoEncodingFlags = 0,
+    VisualOrdering = 1,
+    BigEndian = 2,
+    LittleEndian = 4
+};
+
+CFStringEncoding KWQCFStringEncodingFromIANACharsetName(const char *, KWQEncodingFlags *flags = 0);
 const char *KWQCFStringEncodingToIANACharsetName(CFStringEncoding);
 
 #endif /* KWQCHARSETS_H_ */
diff --git a/WebCore/kwq/KWQCharsets.mm b/WebCore/kwq/KWQCharsets.mm
index d03d12e..99ac0a0 100644
--- a/WebCore/kwq/KWQCharsets.mm
+++ b/WebCore/kwq/KWQCharsets.mm
@@ -28,60 +28,67 @@
 struct CharsetEntry {
     const char *name;
     CFStringEncoding encoding;
+    KWQEncodingFlags flags;
 };
 
 /* The following autogenerated file includes the charset data. */
-#import "KWQCharsetData.c"
+#include "KWQCharsetData.c"
 
 static Boolean encodingNamesEqual(const void *value1, const void *value2);
 static CFHashCode encodingNameHash(const void *value);
 
-static CFDictionaryKeyCallBacks encodingNameKeyCallbacks = { 0, NULL, NULL, NULL, encodingNamesEqual, encodingNameHash };
+static const CFDictionaryKeyCallBacks encodingNameKeyCallbacks = { 0, NULL, NULL, NULL, encodingNamesEqual, encodingNameHash };
 
-static CFMutableDictionaryRef nameToEncoding = NULL;
-static CFMutableDictionaryRef encodingToName = NULL;
+static CFMutableDictionaryRef nameToTable = NULL;
+static CFMutableDictionaryRef encodingToTable = NULL;
 
 static void buildDictionaries()
 {
-    nameToEncoding = CFDictionaryCreateMutable(NULL, 0, &encodingNameKeyCallbacks, NULL);
-    encodingToName = CFDictionaryCreateMutable(NULL, 0, NULL, NULL);
+    nameToTable = CFDictionaryCreateMutable(NULL, 0, &encodingNameKeyCallbacks, NULL);
+    encodingToTable = CFDictionaryCreateMutable(NULL, 0, NULL, NULL);
 
     for (int i = 0; table[i].name != NULL; i++) {
-        CFDictionarySetValue(nameToEncoding, table[i].name, (void *)table[i].encoding);
-        CFDictionarySetValue(encodingToName, (void *)table[i].encoding, table[i].name);
+        CFDictionarySetValue(nameToTable, table[i].name, &table[i]);
+        CFDictionarySetValue(encodingToTable, reinterpret_cast<void *>(table[i].encoding), &table[i]);
     }
 }
 
-CFStringEncoding KWQCFStringEncodingFromIANACharsetName(const char *name)
+CFStringEncoding KWQCFStringEncodingFromIANACharsetName(const char *name, KWQEncodingFlags *flags)
 {
-    if (nameToEncoding == NULL) {
+    if (nameToTable == NULL) {
         buildDictionaries();
     }
 
     const void *value;
-    if (!CFDictionaryGetValueIfPresent(nameToEncoding, name, &value)) {
+    if (!CFDictionaryGetValueIfPresent(nameToTable, name, &value)) {
+        if (flags) {
+            *flags = NoEncodingFlags;
+        }
         return kCFStringEncodingInvalidId;
     }
-    return (CFStringEncoding)value;
+    if (flags) {
+        *flags = static_cast<const CharsetEntry *>(value)->flags;
+    }
+    return static_cast<const CharsetEntry *>(value)->encoding;
 }
 
 const char *KWQCFStringEncodingToIANACharsetName(CFStringEncoding encoding)
 {
-    if (encodingToName == NULL) {
+    if (encodingToTable == NULL) {
         buildDictionaries();
     }
     
     const void *value;
-    if (!CFDictionaryGetValueIfPresent(encodingToName, (void *)encoding, &value)) {
+    if (!CFDictionaryGetValueIfPresent(encodingToTable, reinterpret_cast<void *>(encoding), &value)) {
         return NULL;
     }
-    return (const char *)value;
+    return static_cast<const CharsetEntry *>(value)->name;
 }
 
 static Boolean encodingNamesEqual(const void *value1, const void *value2)
 {
-    const char *s1 = (const char *)value1;
-    const char *s2 = (const char *)value2;
+    const char *s1 = static_cast<const char *>(value1);
+    const char *s2 = static_cast<const char *>(value2);
     
     while (1) {
         char c1;
@@ -112,7 +119,7 @@ const unsigned PHI = 0x9e3779b9U;
 // http://burtleburtle.net/bob/hash/doobs.html
 static CFHashCode encodingNameHash(const void *value)
 {
-    const char *s = (const char *)value;
+    const char *s = static_cast<const char *>(value);
     
     CFHashCode h = PHI;
 
@@ -133,9 +140,5 @@ static CFHashCode encodingNameHash(const void *value)
     h ^= (h >> 11);
     h += (h << 15);
  
-    if (h == 0) {
-        h = 0x80000000;
-    }
-
     return h;
 }
diff --git a/WebCore/kwq/KWQKHTMLPart.mm b/WebCore/kwq/KWQKHTMLPart.mm
index 593d51e..60e3468 100644
--- a/WebCore/kwq/KWQKHTMLPart.mm
+++ b/WebCore/kwq/KWQKHTMLPart.mm
@@ -53,6 +53,7 @@
 
 using DOM::DocumentImpl;
 using DOM::DOMString;
+using DOM::ElementImpl;
 using DOM::EventImpl;
 using DOM::Node;
 
@@ -65,13 +66,16 @@ using khtml::MousePressEvent;
 using khtml::MouseReleaseEvent;
 using khtml::RenderObject;
 using khtml::RenderPart;
+using khtml::RenderRoot;
 using khtml::RenderStyle;
 using khtml::RenderText;
 using khtml::RenderWidget;
+using khtml::VISIBLE;
 
 using KIO::Job;
 
 using KJS::SavedProperties;
+using KJS::ScheduledAction;
 using KJS::Window;
 
 using KParts::ReadOnlyPart;
@@ -298,7 +302,7 @@ QRegExp *regExpForLabels(NSArray *labels)
 }
     
 
-NSString *KWQKHTMLPart::searchForLabelsBeforeElement(NSArray *labels, DOM::ElementImpl *element)
+NSString *KWQKHTMLPart::searchForLabelsBeforeElement(NSArray *labels, ElementImpl *element)
 {
     QRegExp *regExp = regExpForLabels(labels);
     // We stop searching after we've seen this many chars
@@ -322,7 +326,7 @@ NSString *KWQKHTMLPart::searchForLabelsBeforeElement(NSArray *labels, DOM::Eleme
             // We hit another form element or the start of the form - bail out
             break;
         } else if (nodeID == ID_TEXT
-                   && n->renderer() && n->renderer()->style()->visibility() == khtml::VISIBLE)
+                   && n->renderer() && n->renderer()->style()->visibility() == VISIBLE)
         {
             // For each text chunk, run the regexp
             QString nodeString = n->nodeValue().string();
@@ -341,7 +345,7 @@ NSString *KWQKHTMLPart::searchForLabelsBeforeElement(NSArray *labels, DOM::Eleme
     return nil;
 }
 
-NSString *KWQKHTMLPart::matchLabelsAgainstElement(NSArray *labels, DOM::ElementImpl *element)
+NSString *KWQKHTMLPart::matchLabelsAgainstElement(NSArray *labels, ElementImpl *element)
 {
     QString name = element->getAttribute(ATTR_NAME).string();
     // Make numbers in field names behave like word boundaries, e.g., "address2"
@@ -719,10 +723,10 @@ NSView *KWQKHTMLPart::nextKeyViewForWidget(QWidget *startingWidget, KWQSelection
     return partForNode(node)->nextKeyView(node, direction);
 }
 
-QMap<int, KJS::ScheduledAction*> *KWQKHTMLPart::pauseActions(const void *key)
+QMap<int, ScheduledAction*> *KWQKHTMLPart::pauseActions(const void *key)
 {
     if (d->m_doc && d->m_jscript) {
-        KJS::Window *w = KJS::Window::retrieveWindow(this);
+        Window *w = Window::retrieveWindow(this);
         if (w && w->hasTimeouts()) {
             return w->pauseTimeouts(key);
         }
@@ -730,12 +734,13 @@ QMap<int, KJS::ScheduledAction*> *KWQKHTMLPart::pauseActions(const void *key)
     return 0;
 }
 
-
-void KWQKHTMLPart::resumeActions(QMap<int, KJS::ScheduledAction*> *actions, const void *key)
+void KWQKHTMLPart::resumeActions(QMap<int, ScheduledAction*> *actions, const void *key)
 {
     if (d->m_doc && d->m_jscript && d->m_bJScriptEnabled) {
-        KJS::Window *w = KJS::Window::retrieveWindow(this);
-        w->resumeTimeouts(actions, key);
+        Window *w = Window::retrieveWindow(this);
+        if (w) {
+            w->resumeTimeouts(actions, key);
+        }
     }
 }
 
@@ -757,40 +762,38 @@ bool KWQKHTMLPart::canCachePage()
 
 void KWQKHTMLPart::saveWindowProperties(SavedProperties *windowProperties)
 {
-    KJS::Window *window;
-    window = Window::retrieveWindow(this);
-    
-    ASSERT(window);
+    Window *window = Window::retrieveWindow(this);
     if (window)
         window->saveProperties(*windowProperties);
+    else
+        ERROR("NULL window");
 }
 
 void KWQKHTMLPart::saveLocationProperties(SavedProperties *locationProperties)
 {
-    KJS::Window *window;
-    window = Window::retrieveWindow(this);
-    ASSERT(window);
+    Window *window = Window::retrieveWindow(this);
     if (window)
         window->saveProperties(*locationProperties);
+    else
+        ERROR("NULL window");
 }
 
 void KWQKHTMLPart::restoreWindowProperties(SavedProperties *windowProperties)
 {
-    KJS::Window *window;
-    window = Window::retrieveWindow(this);
-    ASSERT(window);
+    Window *window = Window::retrieveWindow(this);
     if (window)
         window->restoreProperties(*windowProperties);
+    else
+        ERROR("NULL window");
 }
 
 void KWQKHTMLPart::restoreLocationProperties(SavedProperties *locationProperties)
 {
-    KJS::Window *window;
-    window = Window::retrieveWindow(this);
+    Window *window = Window::retrieveWindow(this);
     if (window)
         window->location()->restoreProperties(*locationProperties);
     else
-        printf ("KWQKHTMLPart::restoreLocationProperties  unable to find window\n");
+        ERROR("NULL window");
 }
 
 void KWQKHTMLPart::openURLFromPageCache(KWQPageState *state)
@@ -800,7 +803,7 @@ void KWQKHTMLPart::openURLFromPageCache(KWQPageState *state)
     KURL *url = [state URL];
     SavedProperties *windowProperties = [state windowProperties];
     SavedProperties *locationProperties = [state locationProperties];
-    QMap<int, KJS::ScheduledAction*> *actions = [state pausedActions];
+    QMap<int, ScheduledAction*> *actions = [state pausedActions];
     
     d->m_redirectionTimer.stop();
 
@@ -1100,7 +1103,7 @@ bool KWQKHTMLPart::passWidgetMouseDownEventToWidget(khtml::MouseEvent *event)
     // just pass _currentEvent down to the widget,  we don't want to call it for events that
     // don't correspond to Cocoa events.  The mousedown/ups will have already been passed on as
     // part of the pressed/released handling.
-    if (!khtml::MouseDoubleClickEvent::test(event))
+    if (!MouseDoubleClickEvent::test(event))
         return passWidgetMouseDownEventToWidget(static_cast<RenderWidget *>(target));
     else
         return true;
@@ -1278,7 +1281,7 @@ void KWQKHTMLPart::clearTimers()
     clearTimers(d->m_view);
 }
 
-bool KWQKHTMLPart::passSubframeEventToSubframe(DOM::NodeImpl::MouseEvent &event)
+bool KWQKHTMLPart::passSubframeEventToSubframe(NodeImpl::MouseEvent &event)
 {
     switch ([_currentEvent type]) {
     	case NSLeftMouseDown: {
@@ -1658,7 +1661,7 @@ QRect KWQKHTMLPart::selectionRect() const
         return QRect();
     }
 
-    khtml::RenderRoot *root = static_cast<khtml::RenderRoot *>(xmlDocImpl()->renderer());
+    RenderRoot *root = static_cast<RenderRoot *>(xmlDocImpl()->renderer());
     if (!root) {
         return QRect();
 
@@ -1666,4 +1669,3 @@ QRect KWQKHTMLPart::selectionRect() const
 
     return root->selectionRect();
 }
-
diff --git a/WebCore/kwq/KWQTextCodec.h b/WebCore/kwq/KWQTextCodec.h
index 128d8ab..f85160e 100644
--- a/WebCore/kwq/KWQTextCodec.h
+++ b/WebCore/kwq/KWQTextCodec.h
@@ -26,6 +26,7 @@
 #ifndef QTEXTCODEC_H_
 #define QTEXTCODEC_H_
 
+#include "KWQCharsets.h"
 #include "KWQString.h"
 #include "KWQCString.h"
 
@@ -34,12 +35,13 @@ class QTextDecoder;
 class QTextCodec {
 public:
     static QTextCodec *codecForName(const char *);
+    static QTextCodec *codecForNameEightBitOnly(const char *);
     static QTextCodec *codecForLocale();
 
-    QTextCodec(CFStringEncoding e) : _encoding(e) { }
+    QTextCodec(CFStringEncoding e, KWQEncodingFlags f = NoEncodingFlags) : _encoding(e), _flags(f) { }
 
     const char *name() const;
-    bool isISOLatin1Hebrew() const;
+    bool usesVisualOrdering() const { return _flags & VisualOrdering; }
 
     QTextDecoder *makeDecoder() const;
 
@@ -48,13 +50,18 @@ public:
     QString toUnicode(const char *, int) const;
     QString toUnicode(const QByteArray &, int) const;
     
+    friend bool operator==(const QTextCodec &, const QTextCodec &);
+    unsigned hash() const;
+    
 private:
     CFStringEncoding _encoding;
+    KWQEncodingFlags _flags;
 };
 
 class QTextDecoder {
 public:
-    virtual QString toUnicode(const char *, int) = 0;
+    virtual ~QTextDecoder();
+    virtual QString toUnicode(const char *, int, bool flush = false) = 0;
 };
 
 #endif
diff --git a/WebCore/kwq/KWQTextCodec.mm b/WebCore/kwq/KWQTextCodec.mm
index 2bf2a72..f8057ec 100644
--- a/WebCore/kwq/KWQTextCodec.mm
+++ b/WebCore/kwq/KWQTextCodec.mm
@@ -28,16 +28,29 @@
 #import "KWQAssertions.h"
 #import "KWQCharsets.h"
 
+struct TECObjectPeek {
+    UInt32 skip1;
+    UInt32 skip2;
+    UInt32 skip3;
+    OptionBits optionsControlFlags;
+};
+
 class KWQTextDecoder : public QTextDecoder {
 public:
-    KWQTextDecoder(CFStringEncoding e) : _encoding(e), _state(atStart), _haveBufferedByte(false) { }
-    QString toUnicode(const char *chs, int len);
+    KWQTextDecoder(CFStringEncoding, KWQEncodingFlags);
+    ~KWQTextDecoder();
+    
+    QString toUnicode(const char *chs, int len, bool flush);
 
 private:
     QString convertUTF16(const unsigned char *chs, int len);
-    QString convertUsingTEC(const UInt8 *chs, int len);
+    QString convertUsingTEC(const UInt8 *chs, int len, bool flush);
+    
+    KWQTextDecoder(const KWQTextDecoder &);
+    KWQTextDecoder &operator=(const KWQTextDecoder &);
 
     CFStringEncoding _encoding;
+    KWQEncodingFlags _flags;
     
     // State for Unicode decoding.
     enum UnicodeEndianState {
@@ -48,33 +61,60 @@ private:
     UnicodeEndianState _state;
     bool _haveBufferedByte;
     char _bufferedByte;
+    
+    // State for TEC decoding.
+    TECObjectRef _converter;
+    static TECObjectRef _cachedConverter;
+    static CFStringEncoding _cachedConverterEncoding;
 };
 
-static QTextCodec *codecForCFStringEncoding(CFStringEncoding encoding)
+TECObjectRef KWQTextDecoder::_cachedConverter;
+CFStringEncoding KWQTextDecoder::_cachedConverterEncoding = kCFStringEncodingInvalidId;
+
+static Boolean QTextCodecsEqual(const void *value1, const void *value2);
+static CFHashCode QTextCodecHash(const void *value);
+
+static QTextCodec *codecForCFStringEncoding(CFStringEncoding encoding, KWQEncodingFlags flags)
 {
     if (encoding == kCFStringEncodingInvalidId) {
         return 0;
     }
     
-    static CFMutableDictionaryRef encodingToCodec = CFDictionaryCreateMutable(NULL, 0, NULL, NULL);
+    static const CFDictionaryKeyCallBacks QTextCodecKeyCallbacks = { 0, NULL, NULL, NULL, QTextCodecsEqual, QTextCodecHash };
+    static CFMutableDictionaryRef encodingToCodec = CFDictionaryCreateMutable(NULL, 0, &QTextCodecKeyCallbacks, NULL);
     
+    QTextCodec key(encoding, flags);
     const void *value;
-    if (CFDictionaryGetValueIfPresent(encodingToCodec, (void *)encoding, &value)) {
-        return (QTextCodec *)value;
+    if (CFDictionaryGetValueIfPresent(encodingToCodec, &key, &value)) {
+        return const_cast<QTextCodec *>(static_cast<const QTextCodec *>(value));
     }
-    QTextCodec *codec = new QTextCodec(encoding);
-    CFDictionarySetValue(encodingToCodec, (void *)encoding, codec);
+    QTextCodec *codec = new QTextCodec(encoding, flags);
+    CFDictionarySetValue(encodingToCodec, codec, codec);
     return codec;
 }
 
 QTextCodec *QTextCodec::codecForName(const char *name)
 {
-    return codecForCFStringEncoding(KWQCFStringEncodingFromIANACharsetName(name));
+    KWQEncodingFlags flags;
+    CFStringEncoding encoding = KWQCFStringEncodingFromIANACharsetName(name, &flags);
+    return codecForCFStringEncoding(encoding, flags);
+}
+
+QTextCodec *QTextCodec::codecForNameEightBitOnly(const char *name)
+{
+    KWQEncodingFlags flags;
+    CFStringEncoding encoding = KWQCFStringEncodingFromIANACharsetName(name, &flags);
+    switch (encoding) {
+        case kCFStringEncodingUnicode:
+            encoding = kCFStringEncodingUTF8;
+            break;
+    }
+    return codecForCFStringEncoding(encoding, flags);
 }
 
 QTextCodec *QTextCodec::codecForLocale()
 {
-    return codecForCFStringEncoding(CFStringGetSystemEncoding());
+    return codecForCFStringEncoding(CFStringGetSystemEncoding(), NoEncodingFlags);
 }
 
 const char *QTextCodec::name() const
@@ -84,7 +124,7 @@ const char *QTextCodec::name() const
 
 QTextDecoder *QTextCodec::makeDecoder() const
 {
-    return new KWQTextDecoder(_encoding);
+    return new KWQTextDecoder(_encoding, _flags);
 }
 
 QCString QTextCodec::fromUnicode(const QString &qcs) const
@@ -101,17 +141,67 @@ QCString QTextCodec::fromUnicode(const QString &qcs) const
 
 QString QTextCodec::toUnicode(const char *chs, int len) const
 {
-    return KWQTextDecoder(_encoding).toUnicode(chs, len);
+    return KWQTextDecoder(_encoding, _flags).toUnicode(chs, len, true);
 }
 
 QString QTextCodec::toUnicode(const QByteArray &qba, int len) const
 {
-    return KWQTextDecoder(_encoding).toUnicode(qba, len);
+    return KWQTextDecoder(_encoding, _flags).toUnicode(qba, len, true);
+}
+
+bool operator==(const QTextCodec &a, const QTextCodec &b)
+{
+    return a._encoding == b._encoding && a._flags == b._flags;
+}
+
+unsigned QTextCodec::hash() const
+{
+    unsigned h = _encoding;
+
+    h += (h << 10);
+    h ^= (h << 6);
+    
+    h ^= _flags;
+
+    h += (h << 3);
+    h ^= (h >> 11);
+    h += (h << 15);
+    
+    return h;
+}
+
+static Boolean QTextCodecsEqual(const void *a, const void *b)
+{
+    return *static_cast<const QTextCodec *>(a) == *static_cast<const QTextCodec *>(b);
+}
+
+static CFHashCode QTextCodecHash(const void *value)
+{
+    return static_cast<const QTextCodec *>(value)->hash();
+}
+
+// ================
+
+QTextDecoder::~QTextDecoder()
+{
+}
+
+// ================
+
+KWQTextDecoder::KWQTextDecoder(CFStringEncoding e, KWQEncodingFlags f)
+    : _encoding(e), _flags(f), _state(atStart), _haveBufferedByte(false), _converter(0)
+{
 }
 
-bool QTextCodec::isISOLatin1Hebrew() const
+KWQTextDecoder::~KWQTextDecoder()
 {
-    return _encoding == kCFStringEncodingISOLatinHebrew;
+    if (_converter) {
+        if (_cachedConverter != 0) {
+            TECDisposeConverter(_cachedConverter);
+        }
+        _cachedConverter = _converter;
+        _cachedConverterEncoding = _encoding;
+    }
 }
 
 QString KWQTextDecoder::convertUTF16(const unsigned char *s, int length)
@@ -158,7 +248,7 @@ QString KWQTextDecoder::convertUTF16(const unsigned char *s, int length)
                 len -= 2;
             }
         } else {
-            _state = bigEndian;
+            _state = (_flags & ::LittleEndian) ? littleEndian : bigEndian;
         }
     }
     
@@ -203,28 +293,28 @@ QString KWQTextDecoder::convertUTF16(const unsigned char *s, int length)
     return result;
 }
 
-QString KWQTextDecoder::convertUsingTEC(const UInt8 *chs, int len)
+QString KWQTextDecoder::convertUsingTEC(const UInt8 *chs, int len, bool flush)
 {
-    // FIXME: This discards state between calls, which won't work for multibyte encodings.
+    OSStatus status;
 
     // Get a converter for the passed-in encoding.
-    static TECObjectRef converter;
-    static CFStringEncoding converterEncoding = kCFStringEncodingInvalidId;
-    OSStatus status;
-    if (_encoding != converterEncoding) {
-        TECObjectRef newConverter;
-        status = TECCreateConverter(&newConverter, _encoding,
-            CreateTextEncoding(kTextEncodingUnicodeDefault, kTextEncodingDefaultVariant, kUnicode16BitFormat));
-        if (status) {
-            ERROR("the Text Encoding Converter won't convert from text encoding 0x%X, error %d", _encoding, status);
-            return QString::null;
-        }
-        if (converter) {
-            TECDisposeConverter(converter);
+    if (!_converter) {
+        if (_cachedConverterEncoding == _encoding) {
+            _converter = _cachedConverter;
+            _cachedConverter = 0;
+            _cachedConverterEncoding = kCFStringEncodingInvalidId;
+            TECClearConverterContextInfo(_converter);
+        } else {
+            status = TECCreateConverter(&_converter, _encoding,
+                CreateTextEncoding(kTextEncodingUnicodeDefault, kTextEncodingDefaultVariant, kUnicode16BitFormat));
+            if (status) {
+                ERROR("the Text Encoding Converter won't convert from text encoding 0x%X, error %d", _encoding, status);
+                return QString::null;
+            }
+
+            // Workaround for missing TECSetBasicOptions call.
+            reinterpret_cast<TECObjectPeek **>(_converter)[0]->optionsControlFlags |= kUnicodeForceASCIIRangeMask;
         }
-        converter = newConverter;
-    } else {
-        TECClearConverterContextInfo(converter);
     }
     
     QString result;
@@ -235,13 +325,22 @@ QString KWQTextDecoder::convertUsingTEC(const UInt8 *chs, int len)
     for (;;) {
         UniChar buffer[4096];
         unsigned long bytesWritten = 0;
-        bool doingFlush = sourceLength == 0;
+        bool doingFlush = false;
+        
+        if (sourceLength == 0) {
+            if (!flush) {
+                // Done.
+                break;
+            }
+            doingFlush = true;
+        }
+         
         if (doingFlush) {
-            status = TECFlushText(converter,
+            status = TECFlushText(_converter,
                 reinterpret_cast<UInt8 *>(buffer), sizeof(buffer), &bytesWritten);
         } else {
             unsigned long bytesRead = 0;
-            status = TECConvertText(converter, sourcePointer, sourceLength, &bytesRead,
+            status = TECConvertText(_converter, sourcePointer, sourceLength, &bytesRead,
                 reinterpret_cast<UInt8 *>(buffer), sizeof(buffer), &bytesWritten);
             sourcePointer += bytesRead;
             sourceLength -= bytesRead;
@@ -252,7 +351,7 @@ QString KWQTextDecoder::convertUsingTEC(const UInt8 *chs, int len)
         }
         if (status == kTextMalformedInputErr || status == kTextUndefinedElementErr) {
             // FIXME: Put in FFFD character here?
-            TECClearConverterContextInfo(converter);
+            TECClearConverterContextInfo(_converter);
             if (sourceLength) {
                 sourcePointer += 1;
                 sourceLength -= 1;
@@ -266,6 +365,7 @@ QString KWQTextDecoder::convertUsingTEC(const UInt8 *chs, int len)
             ERROR("text decoding failed with error %d", status);
             break;
         }
+        
         if (doingFlush) {
             // Done.
             break;
@@ -275,7 +375,7 @@ QString KWQTextDecoder::convertUsingTEC(const UInt8 *chs, int len)
     return result;
 }
 
-QString KWQTextDecoder::toUnicode(const char *chs, int len)
+QString KWQTextDecoder::toUnicode(const char *chs, int len, bool flush)
 {
     ASSERT_ARG(len, len >= 0);
     
@@ -287,5 +387,5 @@ QString KWQTextDecoder::toUnicode(const char *chs, int len)
         return convertUTF16(reinterpret_cast<const unsigned char *>(chs), len);
     }
     
-    return convertUsingTEC(reinterpret_cast<const UInt8 *>(chs), len);
+    return convertUsingTEC(reinterpret_cast<const UInt8 *>(chs), len, flush);
 }
diff --git a/WebCore/kwq/mac-encodings.txt b/WebCore/kwq/mac-encodings.txt
index e5e7892..e485844 100644
--- a/WebCore/kwq/mac-encodings.txt
+++ b/WebCore/kwq/mac-encodings.txt
@@ -8,13 +8,10 @@ WindowsLatin1: windows-1252, winlatin1, x-ansi
 ISOLatin1: 8859_1, iso-8859-1, iso8859-1
 NextStepLatin: x-nextstep
 ASCII: iso-ir-6us, us-ascii
-Unicode: iso-10646-ucs-2, unicode, unicodefeff, unicodefffe, utf-16be, utf-16le
-# Note the bogus entry below that makes UTF-16 mean UTF-8.
-# We do this because Internet Explorer does, and because web pages say UTF-16 and mean UTF-8.
-# See bug 2969378 and http://zingermans.com/ for a concrete example.
-# We may have to add code that understands that characters sets in <head> can't change to a 16-bit
-# encoding, but character set headers from the server can.
-UTF8: unicode-1-1-utf-8, unicode-2-0-utf-8, utf-16, utf-8, x-unicode-2-0-utf-8
+Unicode: iso-10646-ucs-2, unicode, utf-16
+Unicode, BigEndian: unicodefeff, utf-16be
+Unicode, LittleEndian: unicodefffe, utf-16le
+UTF8: unicode-1-1-utf-8, unicode-2-0-utf-8, utf-8, x-unicode-2-0-utf-8
 NonLossyASCII
 
 MacJapanese: x-mac-japanese
@@ -70,7 +67,8 @@ ISOLatin4: iso-8859-4
 ISOLatinCyrillic: iso-8859-5
 ISOLatinArabic: iso-8859-6
 ISOLatinGreek: iso-8859-7
-ISOLatinHebrew: dos-862, iso-8859-8, iso-8859-8-e, iso-8859-8-i, logical, visual
+ISOLatinHebrew: iso-8859-8-i, logical
+ISOLatinHebrew, VisualOrdering: dos-862, iso-8859-8, iso-8859-8-e, visual
 ISOLatin5: iso-8859-9
 ISOLatin6: iso-8859-10
 ISOLatinThai: iso-8859-11
diff --git a/WebCore/kwq/make-charset-table.pl b/WebCore/kwq/make-charset-table.pl
index 1c3d9ae..b1ec181 100755
--- a/WebCore/kwq/make-charset-table.pl
+++ b/WebCore/kwq/make-charset-table.pl
@@ -8,8 +8,6 @@ my $MAC_SUPPORTED_ONLY = 1;
 my %aliasesFromCharsetsFile;
 my %namesWritten;
 
-my $invalid_encoding = "kCFStringEncodingInvalidId";
-
 my $output = "";
 
 my $error = 0;
@@ -22,13 +20,12 @@ sub error ($)
 
 sub emit_line
 {
-    my ($name, $encodingNum) = @_;
+    my ($name, $encoding, $flags) = @_;
  
     error "$name shows up twice in output" if $namesWritten{$name};
     $namesWritten{$name} = 1;
-        
-    $encodingNum = "kCFStringEncoding" . $encodingNum if $encodingNum !~ /^[0-9]/;
-    $output .= "    { \"$name\", $encodingNum },\n";
+    
+    $output .= "    { \"$name\", kCFStringEncoding$encoding, $flags },\n";
 }
 
 sub process_mac_encodings
@@ -44,11 +41,17 @@ sub process_mac_encodings
         chomp;
         s/\#.*$//;
         s/\s+$//;
-	if (my ($MacName, $IANANames) = /(.*): (.*)/) {
+	if (my ($MacName, undef, $flags, $IANANames) = /^(.+?)(, (.+))?: (.+)$/) {
             my %aliases;
             
-            error "CFString encoding name $MacName is mentioned twice in mac-encodings.txt" if $seenMacNames{$MacName};
-            $seenMacNames{$MacName} = 1;
+            my $MacNameWithFlags = $MacName;
+            if ($flags) {
+                $MacNameWithFlags .= ", " . $flags;
+            } else {
+                $flags = "NoEncodingFlags";
+            }
+            error "CFString encoding name $MacName is mentioned twice in mac-encodings.txt" if $seenMacNames{$MacNameWithFlags};
+            $seenMacNames{$MacNameWithFlags} = 1;
 
             # Build the aliases list.
             # Also check that no two names are part of the same entry in the charsets file.
@@ -90,13 +93,15 @@ sub process_mac_encodings
             
             # write out
             for my $alias (sort keys %aliases) {
-                emit_line($alias, $MacName);
+                emit_line($alias, $MacName, $flags);
             }
-	} elsif (/./) {
+	} elsif (/^[a-zA-Z0-9_]+$/) {
             my $MacName = $_;
             
             error "CFString encoding name $MacName is mentioned twice in mac-encodings.txt" if $seenMacNames{$MacName};
             $seenMacNames{$MacName} = 1;
+        } elsif (/./) {
+            error "syntax error in mac-encodings.txt, line $.";
         }
     }
     
@@ -165,4 +170,4 @@ exit 1 if $error;
 
 print "static const CharsetEntry table[] = {\n";
 print $output;
-print "    { 0, $invalid_encoding }\n};\n";
+print "    { 0, kCFStringEncodingInvalidId, NoEncodingFlags }\n};\n";

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list