2005-11-01 Atsushi Enomoto <atsushi@ximian.com>
authorAtsushi Eno <atsushieno@gmail.com>
Tue, 1 Nov 2005 19:06:20 +0000 (19:06 -0000)
committerAtsushi Eno <atsushieno@gmail.com>
Tue, 1 Nov 2005 19:06:20 +0000 (19:06 -0000)
* CP949.cs : Now it contains both CP949 (UHC) and CP51949 (EUC) for
  Korean encoding. This should fix bug #76588.

* Handler.cs : added 51949 (true euc-kr).

svn path=/trunk/mcs/; revision=52455

mcs/class/I18N/CJK/CP949.cs
mcs/class/I18N/CJK/ChangeLog
mcs/class/I18N/Common/ChangeLog
mcs/class/I18N/Common/Handlers.cs

index bff64a41557a9817fba3b9b15bb4cb411aa7623c..9d6dd04be6d02ce1a4043da73961b53e266c40ad 100644 (file)
@@ -11,16 +11,103 @@ using I18N.Common;
 
 namespace I18N.CJK
 {
-    internal class CP949 : DbcsEncoding
+    internal class CP949 : KoreanEncoding
     {
         // Magic number used by Windows for the UHC code page.
         private const int UHC_CODE_PAGE = 949;
 
         // Constructor.
-        public CP949() : base(UHC_CODE_PAGE) {
+        public CP949 () : base (UHC_CODE_PAGE, true)
+        {
+        }
+
+        // Get the mail body name for this encoding.
+        public override String BodyName
+        {
+            get { return "ks_c_5601-1987"; }
+        }
+
+        // Get the human-readable name for this encoding.
+        public override String EncodingName
+        {
+            get { return "Korean (UHC)"; }
+        }
+
+        // Get the mail agent header name for this encoding.
+        public override String HeaderName
+        {
+            get { return "ks_c_5601-1987"; }
+        }
+
+        // Get the IANA-preferred Web name for this encoding.
+        public override String WebName
+        {
+            get { return "ks_c_5601-1987"; }
+        }
+
+        /*
+        // Get the Windows code page represented by this object.
+        public override int WindowsCodePage
+        {
+            get { return UHC_PAGE; }
+        }
+        */
+    }
+
+    internal class CP51949 : KoreanEncoding
+    {
+        // Magic number used by Windows for the euc-kr code page.
+        private const int EUCKR_CODE_PAGE = 51949;
+
+        // Constructor.
+        public CP51949 () : base (EUCKR_CODE_PAGE, false)
+        {
+        }
+
+        // Get the mail body name for this encoding.
+        public override String BodyName
+        {
+            get { return "euc-kr"; }
+        }
+
+        // Get the human-readable name for this encoding.
+        public override String EncodingName
+        {
+            get { return "Korean (EUC)"; }
+        }
+
+        // Get the mail agent header name for this encoding.
+        public override String HeaderName
+        {
+            get { return "euc-kr"; }
+        }
+
+        // Get the IANA-preferred Web name for this encoding.
+        public override String WebName
+        {
+            get { return "euc-kr"; }
+        }
+
+        /*
+        // Get the Windows code page represented by this object.
+        public override int WindowsCodePage
+        {
+            get { return UHC_PAGE; }
+        }
+        */
+
+    }
+
+    internal class KoreanEncoding : DbcsEncoding
+    {
+        // Constructor.
+        public KoreanEncoding (int codepage, bool useUHC) : base (codepage) {
             convert = KSConvert.Convert;
+            this.useUHC = useUHC;
         }
 
+        bool useUHC;
+
         // Get the bytes that result from encoding a character buffer.
         public override int GetBytes(char[] chars, int charIndex, int charCount,
                          byte[] bytes, int byteIndex)
@@ -67,7 +154,7 @@ namespace I18N.CJK
                 }
 
                 char c1;
-                if (lastByte < 0xa1) { // UHC Level 1
+                if (useUHC && lastByte < 0xa1) { // UHC Level 1
                     int ord = 8836 + (lastByte - 0x81) * 178;
 
                     if (b >= 0x41 && b <= 0x5A)
@@ -84,7 +171,7 @@ namespace I18N.CJK
                                     convert.n2u[ord*2 + 1] * 256);
                     else
                         c1 = (char)0;
-                } else if (lastByte <= 0xC6 && b < 0xa1) { // UHC Level 2
+                } else if (useUHC && lastByte <= 0xC6 && b < 0xa1) { // UHC Level 2
                     int ord = 14532 + (lastByte - 0x81) * 84;
 
                     if (b >= 0x41 && b <= 0x5A)
@@ -121,46 +208,19 @@ namespace I18N.CJK
         // Get a decoder that handles a rolling UHC state.
         public override Decoder GetDecoder()
         {
-            return new CP949Decoder(convert);
-        }
-
-        // Get the mail body name for this encoding.
-        public override String BodyName
-        {
-            get { return "ks_c_5601-1987"; }
+            return new KoreanDecoder (convert, useUHC);
         }
 
-        // Get the human-readable name for this encoding.
-        public override String EncodingName
-        {
-            get { return "Korean (UHC)"; }
-        }
-
-        // Get the mail agent header name for this encoding.
-        public override String HeaderName
-        {
-            get { return "ks_c_5601-1987"; }
-        }
-
-        // Get the IANA-preferred Web name for this encoding.
-        public override String WebName
-        {
-            get { return "euc-kr"; }
-        }
-
-        /*
-        // Get the Windows code page represented by this object.
-        public override int WindowsCodePage
-        {
-            get { return UHC_PAGE; }
-        }
-        */
-
         // Decoder that handles a rolling UHC state.
-        private sealed class CP949Decoder : DbcsDecoder
+        private sealed class KoreanDecoder : DbcsDecoder
         {
             // Constructor.
-            public CP949Decoder(DbcsConvert convert) : base(convert) {}
+            public KoreanDecoder (DbcsConvert convert, bool useUHC)
+                : base(convert)
+            {
+                this.useUHC = useUHC;
+            }
+            bool useUHC;
 
             public override int GetChars(byte[] bytes, int byteIndex,
                                 int byteCount, char[] chars, int charIndex)
@@ -180,7 +240,7 @@ namespace I18N.CJK
                     }
 
                     char c1;
-                    if (lastByte < 0xa1) { // UHC Level 1
+                    if (useUHC && lastByte < 0xa1) { // UHC Level 1
                         int ord = 8836 + (lastByte - 0x81) * 178;
 
                         if (b >= 0x41 && b <= 0x5A)
@@ -197,7 +257,7 @@ namespace I18N.CJK
                                         convert.n2u[ord*2 + 1] * 256);
                         else
                             c1 = (char)0;
-                    } else if (lastByte <= 0xC6 && b < 0xA1) { // UHC Level 2
+                    } else if (useUHC && lastByte <= 0xC6 && b < 0xA1) { // UHC Level 2
                         int ord = 14532 + (lastByte - 0xA1) * 84;
 
                         if (b >= 0x41 && b <= 0x5A)
@@ -237,6 +297,11 @@ namespace I18N.CJK
     {
         public ENCuhc() {}
     }
+
+    internal class ENCeuc_kr: CP51949
+    {
+        public ENCeuc_kr() {}
+    }
 }
 
 // ex: ts=8 sts=4 et
index 961d0a63f2909ad324dca76077699029d47cc20e..683934360f659109fa48a45832bd4ffc86508350 100644 (file)
@@ -1,3 +1,8 @@
+2005-11-01  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * CP949.cs : Now it contains both CP949 (UHC) and CP51949 (EUC) for
+         Korean encoding. This should fix bug #76588.
+
 2005-09-25  Atsushi Enomoto  <atsushi@ximian.com>
 
        * I18N.CJK.dll.sources : needs fix as well.
index 991c2ea8e39f8e4df7734ad9200a420231f02a52..9b646576c0c04a87f973fc924dbb021bb3fbc47f 100644 (file)
@@ -1,3 +1,7 @@
+2005-11-01  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * Handler.cs : added 51949 (true euc-kr).
+
 2005-09-25  Atsushi Enomoto  <atsushi@ximian.com>
 
        * Handler.cs : added 50220 and 50222.
index d4dd2506598cba4250502a31d7fa620b51525d53..0c74d6307288041fd0ef19c705404bb2e1b7bce2 100644 (file)
@@ -43,12 +43,14 @@ public sealed class Handlers
         "I18N.CJK.CP50221",
         "I18N.CJK.CP50222",
         "I18N.CJK.CP51932",
+        "I18N.CJK.CP51949",
         "I18N.CJK.CP54936",
         "I18N.CJK.ENCbig5",
         "I18N.CJK.ENCgb2312",
         "I18N.CJK.ENCshift_jis",
         "I18N.CJK.ENCiso_2022_jp",
         "I18N.CJK.ENCeuc_jp",
+        "I18N.CJK.ENCeuc_kr",
         "I18N.CJK.ENCuhc",
         "I18N.CJK.ENCgb18030",
         "I18N.MidEast.CP1254",