--- icu/source/common/ucnv2022.c.orig	2009-05-22 15:45:08.437653452 +0800
+++ icu/source/common/ucnv2022.c	2009-05-22 15:46:31.620400264 +0800
@@ -166,7 +166,12 @@
  * - ICU does not distinguish between different versions of JIS X 0208.
  */
 static const uint16_t jpCharsetMasks[5]={
+    /*
+     * Sun modification:
+     * We support JISX212 at ISO-2022-JP too.
     CSM(ASCII)|CSM(JISX201)|CSM(JISX208)|CSM(HWKANA_7BIT),
+     */
+    CSM(ASCII)|CSM(JISX201)|CSM(JISX208)|CSM(HWKANA_7BIT)|CSM(JISX212),
     CSM(ASCII)|CSM(JISX201)|CSM(JISX208)|CSM(HWKANA_7BIT)|CSM(JISX212),
     CSM(ASCII)|CSM(JISX201)|CSM(JISX208)|CSM(HWKANA_7BIT)|CSM(JISX212)|CSM(GB2312)|CSM(KSC5601)|CSM(ISO8859_1)|CSM(ISO8859_7),
     CSM(ASCII)|CSM(JISX201)|CSM(JISX208)|CSM(HWKANA_7BIT)|CSM(JISX212)|CSM(GB2312)|CSM(KSC5601)|CSM(ISO8859_1)|CSM(ISO8859_7),
@@ -1371,7 +1376,12 @@
     "\x1B\x24\x42",         /* <ESC>$B  JISX-208    */
     "\x1B\x24\x28\x44",     /* <ESC>$(D JISX-212    */
     "\x1B\x24\x41",         /* <ESC>$A  GB2312      */
-    "\x1B\x24\x28\x43",     /* <ESC>$(C KSC5601     */
+    /*
+     * Sun modification: 4936244
+     * RFC1557 defines the designator as ESC "$" ")" "C".
+    "\x1B\x24\x28\x43",        <ESC>$(C KSC5601     *
+     */
+    "\x1B\x24\x29\x43",     /* <ESC>$)C KSC5601     */
     "\x1B\x28\x49"          /* <ESC>(I  HWKANA_7BIT */
 
 };
@@ -1675,7 +1685,10 @@
                     choices[choiceCount++] = (int8_t)HWKANA_7BIT;
                 }
                 /* Do not try single-byte half-width Katakana for other versions. */
+                /* Sun modification: we need support it */
+                /*
                 csm &= ~CSM(HWKANA_7BIT);
+                */
 
                 /* try the current G0 charset */
                 choices[choiceCount++] = cs = pFromU2022State->cs[0];
@@ -1757,6 +1770,11 @@
                             g = 0;
                         }
                         /* else do not use HWKANA_7BIT with other versions */
+                        else { /* Sun modification: we need to support it */
+                            targetValue = (uint32_t)(sourceChar - (HWKANA_START - 0x21));
+                            len = 1;
+                            cs = cs0;
+                        }
                     }
                     break;
                 case JISX201:
@@ -2060,18 +2078,22 @@
                 mySource--;
 escape:
                 {
+                    /* SUN modification
                     const char * mySourceBefore = mySource;
                     int8_t toULengthBefore = args->converter->toULength;
+                    */
 
                     changeState_2022(args->converter,&(mySource),
                         mySourceLimit, ISO_2022_JP,err);
 
                     /* If in ISO-2022-JP only and we successully completed an escape sequence, but previous segment was empty, create an error */
+                    /*SUN modificatio
                     if(myData->version==0 && myData->key==0 && U_SUCCESS(*err) && myData->isEmptySegment) {
                         *err = U_ILLEGAL_ESCAPE_SEQUENCE;
                         args->converter->toUCallbackReason = UCNV_IRREGULAR;
                         args->converter->toULength = toULengthBefore + (mySource - mySourceBefore);
                     }
+                    */
                 }
 
                 /* invalid or illegal escape sequence */
@@ -3713,7 +3735,10 @@
     UCNV_IBM,
     UCNV_ISO_2022,
     1,
-    3, /* max 3 bytes per UChar from UTF-8 (4 bytes from surrogate _pair_) */
+    /*
+     * Sun modification: 4936232
+    3, */ /* max 3 bytes per UChar from UTF-8 (4 bytes from surrogate _pair_) */
+    9,
     { 0x1a, 0, 0, 0 },
     1,
     FALSE,
@@ -3763,7 +3788,10 @@
     UCNV_IBM,
     UCNV_ISO_2022,
     1,
-    6, /* max 6 bytes per UChar: 4-byte escape sequence + DBCS */
+    /*
+     * Sun modification: 4936232
+    6, */ /* max 6 bytes per UChar: 4-byte escape sequence + DBCS */
+    9,
     { 0x1a, 0, 0, 0 },
     1,
     FALSE,
@@ -3813,7 +3841,10 @@
     UCNV_IBM,
     UCNV_ISO_2022,
     1,
-    3, /* max 3 bytes per UChar: SO+DBCS */
+    /*
+     * Sun modification: 4936232
+    3, */ /* max 3 bytes per UChar: SO+DBCS */
+    8,
     { 0x1a, 0, 0, 0 },
     1,
     FALSE,
