The Labs \ Source Viewer \ SSCLI \ System.Text \ ISCIIEncoder

  1. // ==++==
  2. //
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. //
  14. // ==--==
  15. // ISCIIEncoding
  16. //
  17. // Ported from windows c_iscii. If you find bugs here, there're likely similar
  18. // bugs in the windows version
  19. namespace System.Text
  20. {
  21.     using System;
  22.     using System.Globalization;
  23.     using System.Runtime.Serialization;
  24.     using System.Security.Permissions;
  25.    
  26.     // Encodes text into and out of the ISCII encodings.
  27.     // ISCII contains characters to encode indic scripts by mapping indic scripts
  28.     // to the same code page. This works because they are all related scripts.
  29.     // ISCII provides a "font" selection method to switch between the appropriate
  30.     // fonts to display the other scripts. All ISCII characters are above the
  31.     // ASCII range to provide ASCII compatibility.
  32.     //
  33.     // IsAlwaysNormalized() isn't overridden
  34.     // We don't override IsAlwaysNormalized() because it is false for all forms (like base implimentation)
  35.     // Forms C & KC have things like 0933 + 093C == composed 0934, so they aren't normalized
  36.     // Forms D & KD have things like 0934, which decomposes to 0933 + 093C, so not normal.
  37.     // Form IDNA has the above problems plus case mapping, so false (like most encodings)
  38.     //
  39.    
  40.     [Serializable()]
  41.     internal class ISCIIEncoding : EncodingNLS, ISerializable
  42.     {
  43.         // Constants
  44.         private const int CodeDefault = 0;
  45.         // 0x40 Default
  46.         private const int CodeRoman = 1;
  47.         // 0x41 Roman Transliteration (not supported)
  48.         private const int CodeDevanagari = 2;
  49.         // 0x42 57002
  50.         private const int CodeBengali = 3;
  51.         // 0x43 57003
  52.         private const int CodeTamil = 4;
  53.         // 0x44 57004
  54.         private const int CodeTelugu = 5;
  55.         // 0x45 57005
  56.         private const int CodeAssamese = 6;
  57.         // 0x46 57006 Assamese (Bengali)
  58.         private const int CodeOriya = 7;
  59.         // 0x47 57007
  60.         private const int CodeKannada = 8;
  61.         // 0x48 57008
  62.         private const int CodeMalayalam = 9;
  63.         // 0x49 57009
  64.         private const int CodeGujarati = 10;
  65.         // 0x4a 57010
  66.         private const int CodePunjabi = 11;
  67.         // 0x4b 57011 Punjabi (Gurmukhi)
  68.         // Ranges
  69.         private const int MultiByteBegin = 160;
  70.         // Beginning of MultiByte space in ISCII
  71.         private const int IndicBegin = 2305;
  72.         // Beginining of Unicode Indic script code points
  73.         private const int IndicEnd = 3439;
  74.         // End of Unicode Indic Script code points
  75.         // ISCII Control Values
  76.         private const byte ControlATR = 239;
  77.         // Attribute (ATR) code
  78.         private const byte ControlCodePageStart = 64;
  79.         // Start of code page range
  80.         // Interesting ISCII characters
  81.         private const byte Virama = 232;
  82.         private const byte Nukta = 233;
  83.         private const byte DevenagariExt = 240;
  84.        
  85.         // Interesting Unicode characters
  86.         private const char ZWNJ = (char)8204;
  87.         private const char ZWJ = (char)8205;
  88.        
  89.         // Code Page
  90.         private int defaultCodePage;
  91.        
  92.         public ISCIIEncoding(int codePage) : base(codePage)
  93.         {
  94.             // Set our code page (subtracting windows code page # offset)
  95.             defaultCodePage = codePage - 57000;
  96.            
  97.             // Legal windows code pages are between Devanagari and Punjabi
  98.             BCLDebug.Assert(defaultCodePage >= CodeDevanagari && defaultCodePage <= CodePunjabi, "[ISCIIEncoding] Code page (" + codePage + " isn't supported by ISCIIEncoding!");
  99.            
  100.             // This shouldn't really be possible
  101.             if (defaultCodePage < CodeDevanagari || defaultCodePage > CodePunjabi)
  102.                 throw new ArgumentException(Environment.GetResourceString("Argument_CodepageNotSupported", codePage), "codePage");
  103.         }
  104.        
  105.         // Constructor called by serialization.
  106.         internal ISCIIEncoding(SerializationInfo info, StreamingContext context) : base(0)
  107.         {
  108.             BCLDebug.Assert(false, "Didn't expect to make it to ISCIIEncoding serialization constructor");
  109.             throw new ArgumentException(Environment.GetResourceString("Arg_ExecutionEngineException"));
  110.         }
  111.        
  112.         // ISerializable implementation
  113.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)]
  114.         void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
  115.         {
  116.             // Make sure to get teh base stuff too This throws if info is null
  117.             SerializeEncoding(info, context);
  118.             BCLDebug.Assert(info != null, "[ISCIIEncoding.GetObjectData] Expected null info to throw");
  119.            
  120.             info.AddValue("m_maxByteSize", 2);
  121.            
  122.             // Always have this as our helper
  123.             info.SetType(typeof(MLangCodePageEncoding));
  124.         }
  125.        
  126.         public override int GetMaxByteCount(int charCount)
  127.         {
  128.             if (charCount < 0)
  129.                 throw new ArgumentOutOfRangeException("charCount", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
  130.            
  131.             // Characters would be # of characters + 1 in case high surrogate is ? * max fallback
  132.             long byteCount = (long)charCount + 1;
  133.            
  134.             if (EncoderFallback.MaxCharCount > 1)
  135.                 byteCount *= EncoderFallback.MaxCharCount;
  136.            
  137.             // 4 Time input because 1st input could require code page change and also that char could require 2 code points
  138.             byteCount *= 4;
  139.            
  140.             if (byteCount > 2147483647)
  141.                 throw new ArgumentOutOfRangeException("charCount", Environment.GetResourceString("ArgumentOutOfRange_GetByteCountOverflow"));
  142.            
  143.             return (int)byteCount;
  144.         }
  145.        
  146.         // Our MaxCharCount is the same as the byteCount. There are a few sequences
  147.         // where 2 (or more) bytes could become 2 chars, but thats still 1 to 1.
  148.         public override int GetMaxCharCount(int byteCount)
  149.         {
  150.             if (byteCount < 0)
  151.                 throw new ArgumentOutOfRangeException("byteCount", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
  152.            
  153.             // Our MaxCharCount is the same as the byteCount. There are a few sequences
  154.             // where 2 (or more) bytes could become 2 chars, but thats still 1 to 1.
  155.             // Also could have 1 in decoder if we're waiting to see if next char's a nukta.
  156.             long charCount = ((long)byteCount + 1);
  157.            
  158.             // Some code points are undefined so we could fall back.
  159.             if (DecoderFallback.MaxCharCount > 1)
  160.                 charCount *= DecoderFallback.MaxCharCount;
  161.            
  162.             if (charCount > 2147483647)
  163.                 throw new ArgumentOutOfRangeException("byteCount", Environment.GetResourceString("ArgumentOutOfRange_GetCharCountOverflow"));
  164.            
  165.             return (int)charCount;
  166.         }
  167.        
  168.         // Our workhorse version
  169.         unsafe internal override int GetByteCount(char* chars, int count, EncoderNLS baseEncoder)
  170.         {
  171.             // Use null pointer to ask GetBytes for count
  172.             return GetBytes(chars, count, null, 0, baseEncoder);
  173.         }
  174.        
  175.         // Workhorse
  176.         unsafe internal override int GetBytes(char* chars, int charCount, byte* bytes, int byteCount, EncoderNLS baseEncoder)
  177.         {
  178.             // Allow null bytes for counting
  179.             BCLDebug.Assert(chars != null, "[ISCIIEncoding.GetBytes]chars!=null");
  180.             // BCLDebug.Assert(bytes != null, "[ISCIIEncoding.GetBytes]bytes!=null");
  181.             BCLDebug.Assert(charCount >= 0, "[ISCIIEncoding.GetBytes]charCount >=0");
  182.             BCLDebug.Assert(byteCount >= 0, "[ISCIIEncoding.GetBytes]byteCount >=0");
  183.            
  184.             // Need the ISCII Encoder
  185.             ISCIIEncoder encoder = (ISCIIEncoder)baseEncoder;
  186.            
  187.             // prepare our helpers
  188.             Encoding.EncodingByteBuffer buffer = new Encoding.EncodingByteBuffer(this, encoder, bytes, byteCount, chars, charCount);
  189.            
  190.             int currentCodePage = this.defaultCodePage;
  191.             bool bLastVirama = false;
  192.            
  193.             // Use encoder info if available
  194.             if (encoder != null) {
  195.                 // Remember our old state
  196.                 currentCodePage = encoder.currentCodePage;
  197.                 bLastVirama = encoder.bLastVirama;
  198.                
  199.                 // If we have a high surrogate left over, then fall it back
  200.                 if (encoder.charLeftOver > 0) {
  201.                     buffer.Fallback(encoder.charLeftOver);
  202.                     bLastVirama = false;
  203.                     // Redundant
  204.                 }
  205.             }
  206.            
  207.             while (buffer.MoreData) {
  208.                 // Get our data
  209.                 char ch = buffer.GetNextChar();
  210.                
  211.                 // See if its a Multi Byte Character
  212.                 if (ch < MultiByteBegin) {
  213.                     // Its a boring low character, add it.
  214.                     if (!buffer.AddByte((byte)ch))
  215.                         break;
  216.                     bLastVirama = false;
  217.                     continue;
  218.                 }
  219.                
  220.                 // See if its outside of the Indic script Range range
  221.                 if ((ch < IndicBegin) || (ch > IndicEnd)) {
  222.                     // See if its a ZWJ or ZWNJ and if we has bLastVirama;
  223.                     if (bLastVirama && (ch == ZWNJ || ch == ZWJ)) {
  224.                         // It was a bLastVirama and ZWNJ || ZWJ
  225.                         if (ch == ZWNJ) {
  226.                             if (!buffer.AddByte(Virama))
  227.                                 break;
  228.                         }
  229.                         // ZWJ
  230.                         else {
  231.                             if (!buffer.AddByte(Nukta))
  232.                                 break;
  233.                         }
  234.                        
  235.                         // bLastVirama now counts as false
  236.                         bLastVirama = false;
  237.                         continue;
  238.                     }
  239.                    
  240.                     // Have to do our fallback
  241.                     //
  242.                     // Note that this will fallback 2 chars if this is a high surrogate.
  243.                     // Throws if recursive (knows because we called InternalGetNextChar)
  244.                     buffer.Fallback(ch);
  245.                     bLastVirama = false;
  246.                     continue;
  247.                 }
  248.                
  249.                 // Its in the Unicode Indic script range
  250.                 int indicInfo = UnicodeToIndicChar[ch - IndicBegin];
  251.                 byte byteIndic = (byte)indicInfo;
  252.                 int indicScript = (15 & (indicInfo >> 8));
  253.                 int indicTwoBytes = (61440 & indicInfo);
  254.                
  255.                 // If IndicInfo is 0 then have to do fallback
  256.                 if (indicInfo == 0) {
  257.                     // Its some Unicode character we don't have indic for.
  258.                     // Have to do our fallback
  259.                     // Add Fallback Count
  260.                     // Note that chars was preincremented, and GetEncoderFallbackString might add an extra
  261.                     // if chars != charEnd and there's a surrogate.
  262.                     // Throws if recursive (knows because we called InternalGetNextChar)
  263.                     buffer.Fallback(ch);
  264.                    
  265.                     bLastVirama = false;
  266.                     continue;
  267.                 }
  268.                
  269.                 // See if our code page ("font" in ISCII spec) has to change
  270.                 // (This if doesn't add character, just changes character set)
  271.                 BCLDebug.Assert(indicScript != 0, "[ISCIIEncoding.GetBytes]expected an indic script value");
  272.                 if (indicScript != currentCodePage) {
  273.                     // It changed, spit out the ATR
  274.                     if (!buffer.AddByte(ControlATR, (byte)(indicScript | ControlCodePageStart)))
  275.                         break;
  276.                    
  277.                     // Now spit out the new code page (& remember it) (do this afterwards in case AddByte failed)
  278.                     currentCodePage = indicScript;
  279.                    
  280.                     // We only know how to map from Unicode to pages from Devanagari to Punjabi (2 to 11)
  281.                     BCLDebug.Assert(currentCodePage >= CodeDevanagari && currentCodePage <= CodePunjabi, "[ISCIIEncoding.GetBytes]Code page (" + currentCodePage + " shouldn't appear in ISCII from Unicode table!");
  282.                 }
  283.                
  284.                 // Safe to add our byte now
  285.                 if (!buffer.AddByte(byteIndic, indicTwoBytes != 0 ? 1 : 0))
  286.                     break;
  287.                
  288.                 // Remember if this one was a Virama
  289.                 bLastVirama = (byteIndic == Virama);
  290.                
  291.                 // Some characters need extra bytes
  292.                 if (indicTwoBytes != 0) {
  293.                     // This one needs another byte
  294.                     BCLDebug.Assert((indicTwoBytes >> 12) > 0 && (indicTwoBytes >> 12) <= 3, "[ISCIIEncoding.GetBytes]Expected indicTwoBytes from 1-3, not " + (indicTwoBytes >> 12));
  295.                    
  296.                     // Already did buffer checking, but...
  297.                     if (!buffer.AddByte(SecondIndicByte[indicTwoBytes >> 12]))
  298.                         break;
  299.                 }
  300.             }
  301.            
  302.             // May need to switch back to our default code page
  303.             if (currentCodePage != defaultCodePage && (encoder == null || encoder.MustFlush)) {
  304.                 // It changed, spit out the ATR
  305.                 if (buffer.AddByte(ControlATR, (byte)(defaultCodePage | ControlCodePageStart)))
  306.                     currentCodePage = defaultCodePage;
  307.                 else
  308.                     // If not successful, convert will maintain state for next time, also
  309.                     // AddByte will have decremented our char count, however we need it to remain the same
  310.                     buffer.GetNextChar();
  311.                 bLastVirama = false;
  312.             }
  313.            
  314.             // Make sure we remember our state if necessary
  315.             // Note that we don't care about flush because Virama and code page
  316.             // changes are legal at the end.
  317.             // Don't set encoder if we're just counting
  318.             if (encoder != null && bytes != null) {
  319.                 // Clear Encoder if necessary.
  320.                 if (!buffer.fallbackBuffer.bUsedEncoder) {
  321.                     encoder.charLeftOver = (char)0;
  322.                 }
  323.                
  324.                 // Remember our code page/virama state
  325.                 encoder.currentCodePage = currentCodePage;
  326.                 encoder.bLastVirama = bLastVirama;
  327.                
  328.                 // How many chars were used?
  329.                 encoder.m_charsUsed = buffer.CharsUsed;
  330.             }
  331.            
  332.             // Return our length
  333.             return buffer.Count;
  334.         }
  335.        
  336.         // Workhorse
  337.         unsafe internal override int GetCharCount(byte* bytes, int count, DecoderNLS baseDecoder)
  338.         {
  339.             // Just call GetChars with null chars saying we want count
  340.             return GetChars(bytes, count, null, 0, baseDecoder);
  341.         }
  342.        
  343.         // For decoding, the following interesting rules apply:
  344.         // Virama followed by another Virama or Nukta becomes Virama + ZWNJ or Virama + ZWJ
  345.         // ATR is followed by a byte to switch code pages ("fonts")
  346.         // Devenagari F0, B8 -> \u0952
  347.         // Devenagari F0, BF -> \u0970
  348.         // Some characters followed by E9 become a different character instead.
  349.         unsafe internal override int GetChars(byte* bytes, int byteCount, char* chars, int charCount, DecoderNLS baseDecoder)
  350.         {
  351.             // Just need to ASSERT, this is called by something else internal that checked parameters already
  352.             // Allow null chars for counting
  353.             BCLDebug.Assert(bytes != null, "[ISCIIEncoding.GetChars]bytes is null");
  354.             BCLDebug.Assert(byteCount >= 0, "[ISCIIEncoding.GetChars]byteCount is negative");
  355.             // BCLDebug.Assert(chars != null, "[ISCIIEncoding.GetChars]chars is null");
  356.             BCLDebug.Assert(charCount >= 0, "[ISCIIEncoding.GetChars]charCount is negative");
  357.            
  358.             // Need the ISCII Decoder
  359.             ISCIIDecoder decoder = (ISCIIDecoder)baseDecoder;
  360.            
  361.             // Get our info.
  362.             Encoding.EncodingCharBuffer buffer = new Encoding.EncodingCharBuffer(this, decoder, chars, charCount, bytes, byteCount);
  363.            
  364.             int currentCodePage = this.defaultCodePage;
  365.             bool bLastATR = false;
  366.             bool bLastVirama = false;
  367.             bool bLastDevenagariStressAbbr = false;
  368.             char cLastCharForNextNukta = '\0';
  369.             char cLastCharForNoNextNukta = '\0';
  370.            
  371.             // See if there's anything in our decoder
  372.             if (decoder != null) {
  373.                 currentCodePage = decoder.currentCodePage;
  374.                 bLastATR = decoder.bLastATR;
  375.                 bLastVirama = decoder.bLastVirama;
  376.                 bLastDevenagariStressAbbr = decoder.bLastDevenagariStressAbbr;
  377.                 cLastCharForNextNukta = decoder.cLastCharForNextNukta;
  378.                 cLastCharForNoNextNukta = decoder.cLastCharForNoNextNukta;
  379.             }
  380.            
  381.             bool bLastSpecial = bLastVirama | bLastATR | bLastDevenagariStressAbbr | (cLastCharForNextNukta != '\0');
  382.            
  383.             // Get our current code page index (some code pages are dups)
  384.             int currentCodePageIndex = -1;
  385.             BCLDebug.Assert(currentCodePage >= CodeDevanagari && currentCodePage <= CodePunjabi, "[ISCIIEncoding.GetChars]Decoder code page must be >= Devanagari and <= Punjabi, not " + currentCodePage);
  386.            
  387.             if (currentCodePage >= CodeDevanagari && currentCodePage <= CodePunjabi) {
  388.                 currentCodePageIndex = IndicMappingIndex[currentCodePage];
  389.             }
  390.            
  391.             // Loop through our input
  392.             while (buffer.MoreData) {
  393.                 byte b = buffer.GetNextByte();
  394.                
  395.                 // See if last one was special
  396.                 if (bLastSpecial) {
  397.                     // Now it won't be
  398.                     bLastSpecial = false;
  399.                    
  400.                     // One and only one of our flags should be set
  401.                     BCLDebug.Assert(((bLastVirama ? 1 : 0) + (bLastATR ? 1 : 0) + (bLastDevenagariStressAbbr ? 1 : 0) + ((cLastCharForNextNukta > 0) ? 1 : 0)) == 1, String.Format(CultureInfo.InvariantCulture, "[ISCIIEncoding.GetChars]Special cases require 1 and only 1 special case flag: LastATR {0} Dev. {1} Nukta {2}", bLastATR, bLastDevenagariStressAbbr, cLastCharForNextNukta));
  402.                     // If the last one was an ATR, then we'll have to do ATR stuff
  403.                     if (bLastATR) {
  404.                         // No longer last ATR, we know it wasn't bLastVirama
  405.                         bLastATR = false;
  406.                        
  407.                         // We only support Devanagari - Punjabi
  408.                         if (b >= (64 | CodeDevanagari) && b <= (64 | CodePunjabi)) {
  409.                             // Remember the code page
  410.                             currentCodePage = b & 15;
  411.                             currentCodePageIndex = IndicMappingIndex[currentCodePage];
  412.                             continue;
  413.                         }
  414.                        
  415.                         // Change back to default?
  416.                         if (b == 64) {
  417.                             currentCodePage = this.defaultCodePage;
  418.                             currentCodePageIndex = -1;
  419.                            
  420.                             if (currentCodePage >= CodeDevanagari && currentCodePage <= CodePunjabi) {
  421.                                 currentCodePageIndex = IndicMappingIndex[currentCodePage];
  422.                             }
  423.                             continue;
  424.                         }
  425.                        
  426.                         // We don't support Roman
  427.                         if (b == 65) {
  428.                             currentCodePage = this.defaultCodePage;
  429.                             currentCodePageIndex = -1;
  430.                            
  431.                             if (currentCodePage >= CodeDevanagari && currentCodePage <= CodePunjabi) {
  432.                                 currentCodePageIndex = IndicMappingIndex[currentCodePage];
  433.                             }
  434.                            
  435.                             // Even though we don't know how to support Roman, windows didn't add a ? so we don't either.
  436.                             continue;
  437.                         }
  438.                        
  439.                         // Other code pages & ATR codes not supported, fallback the ATR
  440.                         buffer.Fallback(ControlATR);
  441.                        
  442.                         // turn off things
  443.                         bLastVirama = false;
  444.                         bLastATR = false;
  445.                         bLastDevenagariStressAbbr = false;
  446.                         cLastCharForNextNukta = (char)0;
  447.                         cLastCharForNoNextNukta = (char)0;
  448.                        
  449.                         // Keep processing this byte
  450.                     }
  451.                     else if (bLastVirama) {
  452.                         // If last was Virama, then we might need ZWNJ or ZWJ instead
  453.                         if (b == Virama) {
  454.                             // If no room, then stop
  455.                             if (!buffer.AddChar(ZWNJ))
  456.                                 break;
  457.                             bLastVirama = false;
  458.                             continue;
  459.                         }
  460.                         if (b == Nukta) {
  461.                             // If no room, then stop
  462.                             if (!buffer.AddChar(ZWJ))
  463.                                 break;
  464.                             bLastVirama = false;
  465.                             continue;
  466.                         }
  467.                         bLastVirama = false;
  468.                     }
  469.                     else if (bLastDevenagariStressAbbr) {
  470.                         // Last byte was an f0 (ext).
  471.                         // If current is b8 or bf, then we have 952 or 970. Otherwise fallback
  472.                         if (b == 184) {
  473.                             // It was a b8
  474.                             if (!buffer.AddChar('॒'))
  475.                                 // Devanagari stress sign anudatta
  476.                                 break;
  477.                             bLastDevenagariStressAbbr = false;
  478.                             continue;
  479.                         }
  480.                        
  481.                         if (b == 191) {
  482.                             // It was a bf
  483.                             if (!buffer.AddChar('॰'))
  484.                                 // Devanagari abbr. sign
  485.                                 break;
  486.                             bLastDevenagariStressAbbr = false;
  487.                             continue;
  488.                         }
  489.                        
  490.                         // Wasn't an expected pattern, do fallback for f0 (ext) and
  491.                         bLastDevenagariStressAbbr = false;
  492.                         buffer.Fallback(DevenagariExt);
  493.                         // Keep processing this byte
  494.                     }
  495.                     else {
  496.                         // We were checking for next char being a nukta
  497.                         BCLDebug.Assert(cLastCharForNextNukta > 0 && cLastCharForNoNextNukta > 0, "[ISCIIEncoding.GetChars]No other special case found, but cLastCharFor(No)NextNukta variable(s) aren't set.");
  498.                        
  499.                         // We'll either add combined char or last char
  500.                         if (b == Nukta) {
  501.                             // We combine nukta with previous char
  502.                             if (!buffer.AddChar(cLastCharForNextNukta))
  503.                                 break;
  504.                            
  505.                             // Done already
  506.                             cLastCharForNextNukta = cLastCharForNoNextNukta = '\0';
  507.                             continue;
  508.                         }
  509.                        
  510.                         // No Nukta, just add last character and keep processing current byte
  511.                         if (!buffer.AddChar(cLastCharForNoNextNukta))
  512.                             break;
  513.                         cLastCharForNextNukta = cLastCharForNoNextNukta = '\0';
  514.                         // Keep processing this byte
  515.                     }
  516.                 }
  517.                
  518.                 // Now bLastSpecial should be false and all flags false.
  519.                 BCLDebug.Assert(!bLastSpecial && !bLastDevenagariStressAbbr && !bLastVirama && !bLastATR && cLastCharForNextNukta == '\0', "[ISCIIEncoding.GetChars]No special state for last code point should exist at this point.");
  520.                
  521.                 // If its a simple byte, just add it
  522.                 if (b < MultiByteBegin) {
  523.                     if (!buffer.AddChar((char)b))
  524.                         break;
  525.                     continue;
  526.                 }
  527.                
  528.                 // See if its an ATR marker
  529.                 if (b == ControlATR) {
  530.                     bLastATR = bLastSpecial = true;
  531.                     continue;
  532.                 }
  533.                
  534.                 BCLDebug.Assert(currentCodePageIndex != -1, "[ISCIIEncoding.GetChars]Expected valid currentCodePageIndex != -1");
  535.                 char ch = IndicMapping[currentCodePageIndex, 0, b - MultiByteBegin];
  536.                 char cAlt = IndicMapping[currentCodePageIndex, 1, b - MultiByteBegin];
  537.                
  538.                 // If no 2nd char, just add it, also lonely Nuktas get added as well.
  539.                 if (cAlt == 0 || b == Nukta) {
  540.                     // If it was an unknown character do fallback
  541.                    
  542.                     // ? if not known.
  543.                     if (ch == 0) {
  544.                         if (!buffer.Fallback(b))
  545.                             break;
  546.                     }
  547.                     else {
  548.                         if (!buffer.AddChar(ch))
  549.                             break;
  550.                     }
  551.                     continue;
  552.                 }
  553.                
  554.                 // if b == Virama set last Virama so we can do ZWJ or ZWNJ next time if needed.
  555.                 if (b == Virama) {
  556.                     if (!buffer.AddChar(ch))
  557.                         break;
  558.                     bLastVirama = bLastSpecial = true;
  559.                     continue;
  560.                 }
  561.                
  562.                 // See if its one that changes with a Nukta
  563.                 if ((cAlt & 61440) == 0) {
  564.                     // It could change if next char is a nukta
  565.                     bLastSpecial = true;
  566.                     cLastCharForNextNukta = cAlt;
  567.                     cLastCharForNoNextNukta = ch;
  568.                     continue;
  569.                 }
  570.                
  571.                 // We must be the Devenagari special case for F0, B8 & F0, BF
  572.                 BCLDebug.Assert(currentCodePage == CodeDevanagari && b == DevenagariExt, String.Format(CultureInfo.InvariantCulture, "[ISCIIEncoding.GetChars] Devenagari special case must {0} not {1} or in Devanagari code page {2} not {3}.", DevenagariExt, b, CodeDevanagari, currentCodePage));
  573.                 bLastDevenagariStressAbbr = bLastSpecial = true;
  574.                
  575.             }
  576.            
  577.             // If we don't have a decoder, or if we had to flush, then we need to get rid
  578.             // of last ATR, LastNoNextNukta and LastDevenagariExt.
  579.             if (decoder == null || decoder.MustFlush) {
  580.                 // If these fail (because of Convert with insufficient buffer), then they'll turn off MustFlush as well.
  581.                 if (bLastATR) {
  582.                     // Have to add ATR fallback
  583.                     if (buffer.Fallback(ControlATR))
  584.                         bLastATR = false;
  585.                     else
  586.                         // If not successful, convert will maintain state for next time, also
  587.                         // AddChar will have decremented our byte count, however we need it to remain the same
  588.                         buffer.GetNextByte();
  589.                 }
  590.                 else if (bLastDevenagariStressAbbr) {
  591.                     // Have to do fallback for DevenagariExt
  592.                     if (buffer.Fallback(DevenagariExt))
  593.                         bLastDevenagariStressAbbr = false;
  594.                     else
  595.                         // If not successful, convert will maintain state for next time, also
  596.                         // AddChar will have decremented our byte count, however we need it to remain the same
  597.                         buffer.GetNextByte();
  598.                 }
  599.                 else if (cLastCharForNoNextNukta != '\0') {
  600.                     // Have to add our last char because there was no next nukta
  601.                     if (buffer.AddChar(cLastCharForNoNextNukta))
  602.                         cLastCharForNoNextNukta = cLastCharForNextNukta = '\0';
  603.                     else
  604.                         // If not successful, convert will maintain state for next time, also
  605.                         // AddChar will have decremented our byte count, however we need it to remain the same
  606.                         buffer.GetNextByte();
  607.                 }
  608.                 // LastVirama is unimportant for flushing decoder.
  609.             }
  610.            
  611.             // Remember any left over stuff
  612.             // (only remember if we aren't counting)
  613.             if (decoder != null && chars != null) {
  614.                 // If not flushing or have state (from convert) then need to remember state
  615.                 if (!decoder.MustFlush || cLastCharForNoNextNukta != '\0' || bLastATR || bLastDevenagariStressAbbr) {
  616.                     // Either not flushing or had state (from convert)
  617.                     BCLDebug.Assert(!decoder.MustFlush || !decoder.m_throwOnOverflow, "[ISCIIEncoding.GetChars]Expected no state or not converting or not flushing");
  618.                     decoder.currentCodePage = currentCodePage;
  619.                     decoder.bLastVirama = bLastVirama;
  620.                     decoder.bLastATR = bLastATR;
  621.                     decoder.bLastDevenagariStressAbbr = bLastDevenagariStressAbbr;
  622.                     decoder.cLastCharForNextNukta = cLastCharForNextNukta;
  623.                     decoder.cLastCharForNoNextNukta = cLastCharForNoNextNukta;
  624.                 }
  625.                 else {
  626.                     decoder.currentCodePage = this.defaultCodePage;
  627.                     decoder.bLastVirama = false;
  628.                     decoder.bLastATR = false;
  629.                     decoder.bLastDevenagariStressAbbr = false;
  630.                     decoder.cLastCharForNextNukta = '\0';
  631.                     decoder.cLastCharForNoNextNukta = '\0';
  632.                 }
  633.                 decoder.m_bytesUsed = buffer.BytesUsed;
  634.             }
  635.             // Otherwise we already did fallback and added extra things
  636.            
  637.             // Return the # of characters we found
  638.             return buffer.Count;
  639.         }
  640.        
  641.         public override Decoder GetDecoder()
  642.         {
  643.             return new ISCIIDecoder(this);
  644.         }
  645.        
  646.         public override Encoder GetEncoder()
  647.         {
  648.             return new ISCIIEncoder(this);
  649.         }
  650.        
  651.         public override int GetHashCode()
  652.         {
  653.             //Not great distribution, but this is relatively unlikely to be used as the key in a hashtable.
  654.             return defaultCodePage + this.EncoderFallback.GetHashCode() + this.DecoderFallback.GetHashCode();
  655.         }
  656.        
  657.         [Serializable()]
  658.         internal class ISCIIEncoder : EncoderNLS
  659.         {
  660.             // Need to remember the default code page (for HasState)
  661.             internal int defaultCodePage = 0;
  662.            
  663.             // Need a place for the current code page
  664.             internal int currentCodePage = 0;
  665.            
  666.             // Was the last character a virama? (Because ZWJ and ZWNJ are different then)
  667.             internal bool bLastVirama = false;
  668.            
  669.             public ISCIIEncoder(Encoding encoding) : base(encoding)
  670.             {
  671.                 this.currentCodePage = this.defaultCodePage = encoding.CodePage - 57000;
  672.                
  673.                 // base calls reset
  674.             }
  675.            
  676.             // Warning: If you're decoding mixed encoding files or something, this could be confusing
  677.             // We don't always force back to base encoding mapping, so if you reset where do you restart?
  678.             public override void Reset()
  679.             {
  680.                 bLastVirama = false;
  681.                 charLeftOver = (char)0;
  682.                 if (m_fallbackBuffer != null)
  683.                     m_fallbackBuffer.Reset();
  684.             }
  685.            
  686.             // Anything left in our encoder?
  687.             // Encoder not only has to get rid of left over characters, but it has to switch back to the current code page.
  688.             internal override bool HasState {
  689.                 get { return (this.charLeftOver != (char)0 || this.currentCodePage != this.defaultCodePage); }
  690.             }
  691.         }
  692.        
  693.         [Serializable()]
  694.         internal class ISCIIDecoder : DecoderNLS
  695.         {
  696.             // Need a place to store any our current code page and last ATR flag
  697.             internal int currentCodePage = 0;
  698.             internal bool bLastATR = false;
  699.             internal bool bLastVirama = false;
  700.             internal bool bLastDevenagariStressAbbr = false;
  701.             internal char cLastCharForNextNukta = '\0';
  702.             internal char cLastCharForNoNextNukta = '\0';
  703.            
  704.             public ISCIIDecoder(Encoding encoding) : base(encoding)
  705.             {
  706.                 this.currentCodePage = encoding.CodePage - 57000;
  707.                
  708.                 // base calls reset
  709.             }
  710.            
  711.             // Warning: If you're decoding mixed encoding files or something, this could be confusing
  712.             // We don't always force back to base encoding mapping, so if you reset where do you restart?
  713.             public override void Reset()
  714.             {
  715.                 bLastATR = false;
  716.                 bLastVirama = false;
  717.                 bLastDevenagariStressAbbr = false;
  718.                 cLastCharForNextNukta = '\0';
  719.                 cLastCharForNoNextNukta = '\0';
  720.                 if (m_fallbackBuffer != null)
  721.                     m_fallbackBuffer.Reset();
  722.             }
  723.            
  724.             // Anything left in our decoder?
  725.             internal override bool HasState {
  726.                 get { return (this.cLastCharForNextNukta != '\0' || this.cLastCharForNoNextNukta != '\0' || this.bLastATR || this.bLastDevenagariStressAbbr); }
  727.             }
  728.         }
  729.        
  730.         //
  731.         // ISCII Tables
  732.         //
  733.         // From Windows ISCII\tables.c
  734.         //
  735.        
  736.         ////////////////////////////////////////////////////////////////////////////
  737.         //
  738.         // Char to Byte
  739.         //
  740.         // 0xXYZZ Where Y is the code page "font" part and ZZ is the byte character
  741.         // The high X bits also reference the SecondIndicByte table if an
  742.         // extra byte is needed.
  743.         // 0x0000 For undefined characters
  744.         //
  745.         // This is valid for values IndicBegin to IndicEnd
  746.         //
  747.         // WARNING: When this was copied from windows, the ? characters (0x003F) were
  748.         // searched/replaced with 0x0000.
  749.         //
  750.         ////////////////////////////////////////////////////////////////////////////
  751.        
  752.         static int[] UnicodeToIndicChar = {673, 674, 675, 0, 676, 677, 678, 679, 680, 681,
  753.         682, 4774, 686, 683, 684, 685, 690, 687, 688, 689,
  754.         691, 692, 693, 694, 695, 696, 697, 698, 699, 700,
  755.         701, 702, 703, 704, 705, 706, 707, 708, 709, 710,
  756.         711, 712, 713, 714, 715, 716, 717, 719, 720, 721,
  757.         722, 723, 724, 725, 726, 727, 728, 0, 0, 745,
  758.         4842, 730, 731, 732, 733, 734, 735, 4831, 739, 736,
  759.         737, 738, 743, 740, 741, 742, 744, 0, 0, 4769,
  760.         0, 8944, 0, 0, 0, 0, 0, 4787, 4788, 4789,
  761.         4794, 4799, 4800, 4809, 718, 4778, 4775, 4827, 4828, 746,
  762.         0, 753, 754, 755, 756, 757, 758, 759, 760, 761,
  763.         762, 13040, 0, 0, 0, 0, 0, 0, 0, 0,
  764.         0, 0, 0, 0, 0, 0, 0, 0, 929, 930,
  765.         931, 0, 932, 933, 934, 935, 936, 937, 938, 5030,
  766.         0, 0, 939, 941, 0, 0, 943, 945, 947, 948,
  767.         949, 950, 951, 952, 953, 954, 955, 956, 957, 958,
  768.         959, 960, 961, 962, 963, 964, 965, 966, 0, 968,
  769.         969, 970, 971, 972, 973, 975, 0, 977, 0, 0,
  770.         0, 981, 982, 983, 984, 0, 0, 1001, 0, 986,
  771.         987, 988, 989, 990, 991, 5087, 0, 0, 992, 994,
  772.         0, 0, 996, 998, 1000, 0, 0, 0, 0, 0,
  773.         0, 0, 0, 0, 0, 0, 0, 0, 0, 5055,
  774.         5056, 0, 974, 5034, 5031, 5083, 5084, 0, 0, 1009,
  775.         1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 0,
  776.         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  777.         0, 0, 0, 0, 0, 0, 0, 2978, 0, 0,
  778.         2980, 2981, 2982, 2983, 2984, 2985, 0, 0, 0, 0,
  779.         2987, 2989, 0, 0, 2992, 2993, 2995, 2996, 2997, 2998,
  780.         2999, 3000, 3001, 3002, 3003, 3004, 3005, 3006, 3007, 3008,
  781.         3009, 3010, 3011, 3012, 3013, 3014, 0, 3016, 3017, 3018,
  782.         3019, 3020, 3021, 3023, 0, 3025, 3026, 0, 3028, 3029,
  783.         0, 3031, 3032, 0, 0, 3049, 0, 3034, 3035, 3036,
  784.         3037, 3038, 0, 0, 0, 0, 3040, 3042, 0, 0,
  785.         3044, 3046, 3048, 0, 0, 0, 0, 0, 0, 0,
  786.         0, 0, 0, 0, 7092, 7093, 7098, 7104, 0, 7113,
  787.         0, 0, 0, 0, 0, 0, 0, 3057, 3058, 3059,
  788.         3060, 3061, 3062, 3063, 3064, 3065, 3066, 0, 0, 0,
  789.         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  790.         0, 0, 0, 0, 2721, 2722, 2723, 0, 2724, 2725,
  791.         2726, 2727, 2728, 2729, 2730, 0, 2734, 0, 2731, 2733,
  792.         2738, 0, 2736, 2737, 2739, 2740, 2741, 2742, 2743, 2744,
  793.         2745, 2746, 2747, 2748, 2749, 2750, 2751, 2752, 2753, 2754,
  794.         2755, 2756, 2757, 2758, 0, 2760, 2761, 2762, 2763, 2764,
  795.         2765, 2767, 0, 2769, 2770, 0, 2772, 2773, 2774, 2775,
  796.         2776, 0, 0, 2793, 6890, 2778, 2779, 2780, 2781, 2782,
  797.         2783, 6879, 2787, 0, 2784, 2786, 2791, 0, 2788, 2790,
  798.         2792, 0, 0, 6817, 0, 0, 0, 0, 0, 0,
  799.         0, 0, 0, 0, 0, 0, 0, 0, 0, 6826,
  800.         0, 0, 0, 0, 0, 2801, 2802, 2803, 2804, 2805,
  801.         2806, 2807, 2808, 2809, 2810, 0, 0, 0, 0, 0,
  802.         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  803.         0, 0, 1953, 1954, 1955, 0, 1956, 1957, 1958, 1959,
  804.         1960, 1961, 1962, 6054, 0, 0, 1963, 1965, 0, 0,
  805.         1968, 1969, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978,
  806.         1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988,
  807.         1989, 1990, 0, 1992, 1993, 1994, 1995, 1996, 1997, 1999,
  808.         0, 2001, 2002, 0, 0, 2005, 2006, 2007, 2008, 0,
  809.         0, 2025, 6122, 2010, 2011, 2012, 2013, 2014, 2015, 0,
  810.         0, 0, 2016, 2018, 0, 0, 2020, 2022, 2024, 0,
  811.         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  812.         0, 0, 0, 6079, 6080, 0, 1998, 6058, 6055, 0,
  813.         0, 0, 0, 2033, 2034, 2035, 2036, 2037, 2038, 2039,
  814.         2040, 2041, 2042, 0, 0, 0, 0, 0, 0, 0,
  815.         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  816.         0, 1186, 1187, 0, 1188, 1189, 1190, 1191, 1192, 1193,
  817.         0, 0, 0, 0, 1195, 1197, 0, 1199, 1200, 1201,
  818.         1203, 0, 0, 0, 1207, 1208, 0, 1210, 0, 1212,
  819.         1213, 0, 0, 0, 1217, 1218, 0, 0, 0, 1222,
  820.         1223, 1224, 0, 0, 0, 1228, 1229, 1231, 1232, 1233,
  821.         1234, 1235, 1236, 0, 1237, 1239, 1240, 0, 0, 0,
  822.         0, 1242, 1243, 1244, 1245, 1246, 0, 0, 0, 1248,
  823.         1249, 1250, 0, 1252, 1253, 1254, 1256, 0, 0, 0,
  824.         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  825.         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  826.         0, 0, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273,
  827.         1274, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  828.         0, 0, 0, 0, 0, 0, 0, 0, 1441, 1442,
  829.         1443, 0, 1444, 1445, 1446, 1447, 1448, 1449, 1450, 5542,
  830.         0, 1451, 1452, 1453, 0, 1455, 1456, 1457, 1459, 1460,
  831.         1461, 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470,
  832.         1471, 1472, 1473, 1474, 1475, 1476, 1477, 1478, 0, 1480,
  833.         1481, 1482, 1483, 1484, 1485, 1487, 1488, 1489, 1490, 0,
  834.         1492, 1493, 1494, 1495, 1496, 0, 0, 0, 0, 1498,
  835.         1499, 1500, 1501, 1502, 1503, 5599, 0, 1504, 1505, 1506,
  836.         0, 1508, 1509, 1510, 1512, 0, 0, 0, 0, 0,
  837.         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  838.         0, 0, 0, 5546, 5543, 0, 0, 0, 0, 1521,
  839.         1522, 1523, 1524, 1525, 1526, 1527, 1528, 1529, 1530, 0,
  840.         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  841.         0, 0, 0, 0, 0, 0, 0, 2210, 2211, 0,
  842.         2212, 2213, 2214, 2215, 2216, 2217, 2218, 6310, 0, 2219,
  843.         2220, 2221, 0, 2223, 2224, 2225, 2227, 2228, 2229, 2230,
  844.         2231, 2232, 2233, 2234, 2235, 2236, 2237, 2238, 2239, 2240,
  845.         2241, 2242, 2243, 2244, 2245, 2246, 0, 2248, 2249, 2250,
  846.         2251, 2252, 2253, 2255, 2256, 2257, 2258, 0, 2260, 2261,
  847.         2262, 2263, 2264, 0, 0, 0, 0, 2266, 2267, 2268,
  848.         2269, 2270, 2271, 6367, 0, 2272, 2273, 2274, 0, 2276,
  849.         2277, 2278, 2280, 0, 0, 0, 0, 0, 0, 0,
  850.         0, 0, 0, 0, 0, 0, 0, 0, 0, 6345,
  851.         0, 6314, 6311, 0, 0, 0, 0, 2289, 2290, 2291,
  852.         2292, 2293, 2294, 2295, 2296, 2297, 2298, 0, 0, 0,
  853.         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  854.         0, 0, 0, 0, 0, 2466, 2467, 0, 2468, 2469,
  855.         2470, 2471, 2472, 2473, 2474, 6566, 0, 2475, 2476, 2477,
  856.         0, 2479, 2480, 2481, 2483, 2484, 2485, 2486, 2487, 2488,
  857.         2489, 2490, 2491, 2492, 2493, 2494, 2495, 2496, 2497, 2498,
  858.         2499, 2500, 2501, 2502, 0, 2504, 2505, 2506, 2507, 2508,
  859.         2509, 2511, 2512, 2513, 2514, 2515, 2516, 2517, 2518, 2519,
  860.         2520, 0, 0, 0, 0, 2522, 2523, 2524, 2525, 2526,
  861.         2527, 0, 0, 2528, 2529, 2530, 0, 2532, 2533, 2534,
  862.         2536, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  863.         0, 0, 0, 0, 0, 0, 0, 0, 0, 6570,
  864.         6567, 0, 0, 0, 0, 2545, 2546, 2547, 2548, 2549,
  865.             // U+0901 : Devanagari Sign Candrabindu
  866.             // U+0902 : Devanagari Sign Anusvara
  867.             // U+0903 : Devanagari Sign Visarga
  868.             // U+0904 : Undefined
  869.             // U+0905 : Devanagari Letter A
  870.             // U+0906 : Devanagari Letter Aa
  871.             // U+0907 : Devanagari Letter I
  872.             // U+0908 : Devanagari Letter Ii
  873.             // U+0909 : Devanagari Letter U
  874.             // U+090a : Devanagari Letter Uu
  875.             // U+090b : Devanagari Letter Vocalic R
  876.             // U+090c : Devanagari Letter Vocalic L
  877.             // U+090d : Devanagari Letter Candra E
  878.             // U+090e : Devanagari Letter Short E
  879.             // U+090f : Devanagari Letter E
  880.             // U+0910 : Devanagari Letter Ai
  881.             // U+0911 : Devanagari Letter Candra O
  882.             // U+0912 : Devanagari Letter Short O
  883.             // U+0913 : Devanagari Letter O
  884.             // U+0914 : Devanagari Letter Au
  885.             // U+0915 : Devanagari Letter Ka
  886.             // U+0916 : Devanagari Letter Kha
  887.             // U+0917 : Devanagari Letter Ga
  888.             // U+0918 : Devanagari Letter Gha
  889.             // U+0919 : Devanagari Letter Nga
  890.             // U+091a : Devanagari Letter Ca
  891.             // U+091b : Devanagari Letter Cha
  892.             // U+091c : Devanagari Letter Ja
  893.             // U+091d : Devanagari Letter Jha
  894.             // U+091e : Devanagari Letter Nya
  895.             // U+091f : Devanagari Letter Tta
  896.             // U+0920 : Devanagari Letter Ttha
  897.             // U+0921 : Devanagari Letter Dda
  898.             // U+0922 : Devanagari Letter Ddha
  899.             // U+0923 : Devanagari Letter Nna
  900.             // U+0924 : Devanagari Letter Ta
  901.             // U+0925 : Devanagari Letter Tha
  902.             // U+0926 : Devanagari Letter Da
  903.             // U+0927 : Devanagari Letter Dha
  904.             // U+0928 : Devanagari Letter Na
  905.             // U+0929 : Devanagari Letter Nnna
  906.             // U+092a : Devanagari Letter Pa
  907.             // U+092b : Devanagari Letter Pha
  908.             // U+092c : Devanagari Letter Ba
  909.             // U+092d : Devanagari Letter Bha
  910.             // U+092e : Devanagari Letter Ma
  911.             // U+092f : Devanagari Letter Ya
  912.             // U+0930 : Devanagari Letter Ra
  913.             // U+0931 : Devanagari Letter Rra
  914.             // U+0932 : Devanagari Letter La
  915.             // U+0933 : Devanagari Letter Lla
  916.             // U+0934 : Devanagari Letter Llla
  917.             // U+0935 : Devanagari Letter Va
  918.             // U+0936 : Devanagari Letter Sha
  919.             // U+0937 : Devanagari Letter Ssa
  920.             // U+0938 : Devanagari Letter Sa
  921.             // U+0939 : Devanagari Letter Ha
  922.             // U+093a : Undefined
  923.             // U+093b : Undefined
  924.             // U+093c : Devanagari Sign Nukta
  925.             // U+093d : Devanagari Sign Avagraha
  926.             // U+093e : Devanagari Vowel Sign Aa
  927.             // U+093f : Devanagari Vowel Sign I
  928.             // U+0940 : Devanagari Vowel Sign Ii
  929.             // U+0941 : Devanagari Vowel Sign U
  930.             // U+0942 : Devanagari Vowel Sign Uu
  931.             // U+0943 : Devanagari Vowel Sign Vocalic R
  932.             // U+0944 : Devanagari Vowel Sign Vocalic Rr
  933.             // U+0945 : Devanagari Vowel Sign Candra E
  934.             // U+0946 : Devanagari Vowel Sign Short E
  935.             // U+0947 : Devanagari Vowel Sign E
  936.             // U+0948 : Devanagari Vowel Sign Ai
  937.             // U+0949 : Devanagari Vowel Sign Candra O
  938.             // U+094a : Devanagari Vowel Sign Short O
  939.             // U+094b : Devanagari Vowel Sign O
  940.             // U+094c : Devanagari Vowel Sign Au
  941.             // U+094d : Devanagari Sign Virama
  942.             // U+094e : Undefined
  943.             // U+094f : Undefined
  944.             // U+0950 : Devanagari Om
  945.             // U+0951 : Devanagari Stress Sign Udatta
  946.             // U+0952 : Devanagari Stress Sign Anudatta
  947.             // U+0953 : Devanagari Grave Accent
  948.             // U+0954 : Devanagari Acute Accent
  949.             // U+0955 : Undefined
  950.             // U+0956 : Undefined
  951.             // U+0957 : Undefined
  952.             // U+0958 : Devanagari Letter Qa
  953.             // U+0959 : Devanagari Letter Khha
  954.             // U+095a : Devanagari Letter Ghha
  955.             // U+095b : Devanagari Letter Za
  956.             // U+095c : Devanagari Letter Dddha
  957.             // U+095d : Devanagari Letter Rha
  958.             // U+095e : Devanagari Letter Fa
  959.             // U+095f : Devanagari Letter Yya
  960.             // U+0960 : Devanagari Letter Vocalic Rr
  961.             // U+0961 : Devanagari Letter Vocalic Ll
  962.             // U+0962 : Devanagari Vowel Sign Vocalic L
  963.             // U+0963 : Devanagari Vowel Sign Vocalic Ll
  964.             // U+0964 : Devanagari Danda
  965.             // U+0965 : Devanagari Double Danda
  966.             // U+0966 : Devanagari Digit Zero
  967.             // U+0967 : Devanagari Digit One
  968.             // U+0968 : Devanagari Digit Two
  969.             // U+0969 : Devanagari Digit Three
  970.             // U+096a : Devanagari Digit Four
  971.             // U+096b : Devanagari Digit Five
  972.             // U+096c : Devanagari Digit Six
  973.             // U+096d : Devanagari Digit Seven
  974.             // U+096e : Devanagari Digit Eight
  975.             // U+096f : Devanagari Digit Nine
  976.             // U+0970 : Devanagari Abbreviation Sign
  977.             // U+0971 : Undefined
  978.             // U+0972 : Undefined
  979.             // U+0973 : Undefined
  980.             // U+0974 : Undefined
  981.             // U+0975 : Undefined
  982.             // U+0976 : Undefined
  983.             // U+0977 : Undefined
  984.             // U+0978 : Undefined
  985.             // U+0979 : Undefined
  986.             // U+097a : Undefined
  987.             // U+097b : Undefined
  988.             // U+097c : Undefined
  989.             // U+097d : Undefined
  990.             // U+097e : Undefined
  991.             // U+097f : Undefined
  992.             // U+0980 : Undefined
  993.             // U+0981 : Bengali Sign Candrabindu
  994.             // U+0982 : Bengali Sign Anusvara
  995.             // U+0983 : Bengali Sign Visarga
  996.             // U+0984 : Undefined
  997.             // U+0985 : Bengali Letter A
  998.             // U+0986 : Bengali Letter Aa
  999.             // U+0987 : Bengali Letter I
  1000.             // U+0988 : Bengali Letter Ii
  1001.             // U+0989 : Bengali Letter U
  1002.             // U+098a : Bengali Letter Uu
  1003.             // U+098b : Bengali Letter Vocalic R
  1004.             // U+098c : Bengali Letter Vocalic L
  1005.             // U+098d : Undefined
  1006.             // U+098e : Undefined
  1007.             // U+098f : Bengali Letter E
  1008.             // U+0990 : Bengali Letter Ai
  1009.             // U+0991 : Undefined
  1010.             // U+0992 : Undefined
  1011.             // U+0993 : Bengali Letter O
  1012.             // U+0994 : Bengali Letter Au
  1013.             // U+0995 : Bengali Letter Ka
  1014.             // U+0996 : Bengali Letter Kha
  1015.             // U+0997 : Bengali Letter Ga
  1016.             // U+0998 : Bengali Letter Gha
  1017.             // U+0999 : Bengali Letter Nga
  1018.             // U+099a : Bengali Letter Ca
  1019.             // U+099b : Bengali Letter Cha
  1020.             // U+099c : Bengali Letter Ja
  1021.             // U+099d : Bengali Letter Jha
  1022.             // U+099e : Bengali Letter Nya
  1023.             // U+099f : Bengali Letter Tta
  1024.             // U+09a0 : Bengali Letter Ttha
  1025.             // U+09a1 : Bengali Letter Dda
  1026.             // U+09a2 : Bengali Letter Ddha
  1027.             // U+09a3 : Bengali Letter Nna
  1028.             // U+09a4 : Bengali Letter Ta
  1029.             // U+09a5 : Bengali Letter Tha
  1030.             // U+09a6 : Bengali Letter Da
  1031.             // U+09a7 : Bengali Letter Dha
  1032.             // U+09a8 : Bengali Letter Na
  1033.             // U+09a9 : Undefined
  1034.             // U+09aa : Bengali Letter Pa
  1035.             // U+09ab : Bengali Letter Pha
  1036.             // U+09ac : Bengali Letter Ba
  1037.             // U+09ad : Bengali Letter Bha
  1038.             // U+09ae : Bengali Letter Ma
  1039.             // U+09af : Bengali Letter Ya
  1040.             // U+09b0 : Bengali Letter Ra
  1041.             // U+09b1 : Undefined
  1042.             // U+09b2 : Bengali Letter La
  1043.             // U+09b3 : Undefined
  1044.             // U+09b4 : Undefined
  1045.             // U+09b5 : Undefined
  1046.             // U+09b6 : Bengali Letter Sha
  1047.             // U+09b7 : Bengali Letter Ssa
  1048.             // U+09b8 : Bengali Letter Sa
  1049.             // U+09b9 : Bengali Letter Ha
  1050.             // U+09ba : Undefined
  1051.             // U+09bb : Undefined
  1052.             // U+09bc : Bengali Sign Nukta
  1053.             // U+09bd : Undefined
  1054.             // U+09be : Bengali Vowel Sign Aa
  1055.             // U+09bf : Bengali Vowel Sign I
  1056.             // U+09c0 : Bengali Vowel Sign Ii
  1057.             // U+09c1 : Bengali Vowel Sign U
  1058.             // U+09c2 : Bengali Vowel Sign Uu
  1059.             // U+09c3 : Bengali Vowel Sign Vocalic R
  1060.             // U+09c4 : Bengali Vowel Sign Vocalic Rr
  1061.             // U+09c5 : Undefined
  1062.             // U+09c6 : Undefined
  1063.             // U+09c7 : Bengali Vowel Sign E
  1064.             // U+09c8 : Bengali Vowel Sign Ai
  1065.             // U+09c9 : Undefined
  1066.             // U+09ca : Undefined
  1067.             // U+09cb : Bengali Vowel Sign O
  1068.             // U+09cc : Bengali Vowel Sign Au
  1069.             // U+09cd : Bengali Sign Virama
  1070.             // U+09ce : Undefined
  1071.             // U+09cf : Undefined
  1072.             // U+09d0 : Undefined
  1073.             // U+09d1 : Undefined
  1074.             // U+09d2 : Undefined
  1075.             // U+09d3 : Undefined
  1076.             // U+09d4 : Undefined
  1077.             // U+09d5 : Undefined
  1078.             // U+09d6 : Undefined
  1079.             // U+09d7 : Bengali Au Length Mark
  1080.             // U+09d8 : Undefined
  1081.             // U+09d9 : Undefined
  1082.             // U+09da : Undefined
  1083.             // U+09db : Undefined
  1084.             // U+09dc : Bengali Letter Rra
  1085.             // U+09dd : Bengali Letter Rha
  1086.             // U+09de : Undefined
  1087.             // U+09df : Bengali Letter Yya
  1088.             // U+09e0 : Bengali Letter Vocalic Rr
  1089.             // U+09e1 : Bengali Letter Vocalic Ll
  1090.             // U+09e2 : Bengali Vowel Sign Vocalic L
  1091.             // U+09e3 : Bengali Vowel Sign Vocalic Ll
  1092.             // U+09e4 : Undefined
  1093.             // U+09e5 : Undefined
  1094.             // U+09e6 : Bengali Digit Zero
  1095.             // U+09e7 : Bengali Digit One
  1096.             // U+09e8 : Bengali Digit Two
  1097.             // U+09e9 : Bengali Digit Three
  1098.             // U+09ea : Bengali Digit Four
  1099.             // U+09eb : Bengali Digit Five
  1100.             // U+09ec : Bengali Digit Six
  1101.             // U+09ed : Bengali Digit Seven
  1102.             // U+09ee : Bengali Digit Eight
  1103.             // U+09ef : Bengali Digit Nine
  1104.             // U+09f0 : Bengali Letter Ra With Middle Diagonal
  1105.             // U+09f1 : Bengali Letter Ra With Lower Diagonal
  1106.             // U+09f2 : Bengali Rupee Mark
  1107.             // U+09f3 : Bengali Rupee Sign
  1108.             // U+09f4 : Bengali Currency Numerator One
  1109.             // U+09f5 : Bengali Currency Numerator Two
  1110.             // U+09f6 : Bengali Currency Numerator Three
  1111.             // U+09f7 : Bengali Currency Numerator Four
  1112.             // U+09f8 : Bengali Currency Numerator One Less Than The Denominator
  1113.             // U+09f9 : Bengali Currency Denominator Sixteen
  1114.             // U+09fa : Bengali Isshar
  1115.             // U+09fb : Undefined
  1116.             // U+09fc : Undefined
  1117.             // U+09fd : Undefined
  1118.             // U+09fe : Undefined
  1119.             // U+09ff : Undefined
  1120.             // U+0a00 : Undefined
  1121.             // U+0a01 : Undefined
  1122.             // U+0a02 : Gurmukhi Sign Bindi
  1123.             // U+0a03 : Undefined
  1124.             // U+0a04 : Undefined
  1125.             // U+0a05 : Gurmukhi Letter A
  1126.             // U+0a06 : Gurmukhi Letter Aa
  1127.             // U+0a07 : Gurmukhi Letter I
  1128.             // U+0a08 : Gurmukhi Letter Ii
  1129.             // U+0a09 : Gurmukhi Letter U
  1130.             // U+0a0a : Gurmukhi Letter Uu
  1131.             // U+0a0b : Undefined
  1132.             // U+0a0c : Undefined
  1133.             // U+0a0d : Undefined
  1134.             // U+0a0e : Undefined
  1135.             // U+0a0f : Gurmukhi Letter Ee
  1136.             // U+0a10 : Gurmukhi Letter Ai
  1137.             // U+0a11 : Undefined
  1138.             // U+0a12 : Undefined
  1139.             // U+0a13 : Gurmukhi Letter Oo
  1140.             // U+0a14 : Gurmukhi Letter Au
  1141.             // U+0a15 : Gurmukhi Letter Ka
  1142.             // U+0a16 : Gurmukhi Letter Kha
  1143.             // U+0a17 : Gurmukhi Letter Ga
  1144.             // U+0a18 : Gurmukhi Letter Gha
  1145.             // U+0a19 : Gurmukhi Letter Nga
  1146.             // U+0a1a : Gurmukhi Letter Ca
  1147.             // U+0a1b : Gurmukhi Letter Cha
  1148.             // U+0a1c : Gurmukhi Letter Ja
  1149.             // U+0a1d : Gurmukhi Letter Jha
  1150.             // U+0a1e : Gurmukhi Letter Nya
  1151.             // U+0a1f : Gurmukhi Letter Tta
  1152.             // U+0a20 : Gurmukhi Letter Ttha
  1153.             // U+0a21 : Gurmukhi Letter Dda
  1154.             // U+0a22 : Gurmukhi Letter Ddha
  1155.             // U+0a23 : Gurmukhi Letter Nna
  1156.             // U+0a24 : Gurmukhi Letter Ta
  1157.             // U+0a25 : Gurmukhi Letter Tha
  1158.             // U+0a26 : Gurmukhi Letter Da
  1159.             // U+0a27 : Gurmukhi Letter Dha
  1160.             // U+0a28 : Gurmukhi Letter Na
  1161.             // U+0a29 : Undefined
  1162.             // U+0a2a : Gurmukhi Letter Pa
  1163.             // U+0a2b : Gurmukhi Letter Pha
  1164.             // U+0a2c : Gurmukhi Letter Ba
  1165.             // U+0a2d : Gurmukhi Letter Bha
  1166.             // U+0a2e : Gurmukhi Letter Ma
  1167.             // U+0a2f : Gurmukhi Letter Ya
  1168.             // U+0a30 : Gurmukhi Letter Ra
  1169.             // U+0a31 : Undefined
  1170.             // U+0a32 : Gurmukhi Letter La
  1171.             // U+0a33 : Gurmukhi Letter Lla
  1172.             // U+0a34 : Undefined
  1173.             // U+0a35 : Gurmukhi Letter Va
  1174.             // U+0a36 : Gurmukhi Letter Sha
  1175.             // U+0a37 : Undefined
  1176.             // U+0a38 : Gurmukhi Letter Sa
  1177.             // U+0a39 : Gurmukhi Letter Ha
  1178.             // U+0a3a : Undefined
  1179.             // U+0a3b : Undefined
  1180.             // U+0a3c : Gurmukhi Sign Nukta
  1181.             // U+0a3d : Undefined
  1182.             // U+0a3e : Gurmukhi Vowel Sign Aa
  1183.             // U+0a3f : Gurmukhi Vowel Sign I
  1184.             // U+0a40 : Gurmukhi Vowel Sign Ii
  1185.             // U+0a41 : Gurmukhi Vowel Sign U
  1186.             // U+0a42 : Gurmukhi Vowel Sign Uu
  1187.             // U+0a43 : Undefined
  1188.             // U+0a44 : Undefined
  1189.             // U+0a45 : Undefined
  1190.             // U+0a46 : Undefined
  1191.             // U+0a47 : Gurmukhi Vowel Sign Ee
  1192.             // U+0a48 : Gurmukhi Vowel Sign Ai
  1193.             // U+0a49 : Undefined
  1194.             // U+0a4a : Undefined
  1195.             // U+0a4b : Gurmukhi Vowel Sign Oo
  1196.             // U+0a4c : Gurmukhi Vowel Sign Au
  1197.             // U+0a4d : Gurmukhi Sign Virama
  1198.             // U+0a4e : Undefined
  1199.             // U+0a4f : Undefined
  1200.             // U+0a50 : Undefined
  1201.             // U+0a51 : Undefined
  1202.             // U+0a52 : Undefined
  1203.             // U+0a53 : Undefined
  1204.             // U+0a54 : Undefined
  1205.             // U+0a55 : Undefined
  1206.             // U+0a56 : Undefined
  1207.             // U+0a57 : Undefined
  1208.             // U+0a58 : Undefined
  1209.             // U+0a59 : Gurmukhi Letter Khha
  1210.             // U+0a5a : Gurmukhi Letter Ghha
  1211.             // U+0a5b : Gurmukhi Letter Za
  1212.             // U+0a5c : Gurmukhi Letter Rra
  1213.             // U+0a5d : Undefined
  1214.             // U+0a5e : Gurmukhi Letter Fa
  1215.             // U+0a5f : Undefined
  1216.             // U+0a60 : Undefined
  1217.             // U+0a61 : Undefined
  1218.             // U+0a62 : Undefined
  1219.             // U+0a63 : Undefined
  1220.             // U+0a64 : Undefined
  1221.             // U+0a65 : Undefined
  1222.             // U+0a66 : Gurmukhi Digit Zero
  1223.             // U+0a67 : Gurmukhi Digit One
  1224.             // U+0a68 : Gurmukhi Digit Two
  1225.             // U+0a69 : Gurmukhi Digit Three
  1226.             // U+0a6a : Gurmukhi Digit Four
  1227.             // U+0a6b : Gurmukhi Digit Five
  1228.             // U+0a6c : Gurmukhi Digit Six
  1229.             // U+0a6d : Gurmukhi Digit Seven
  1230.             // U+0a6e : Gurmukhi Digit Eight
  1231.             // U+0a6f : Gurmukhi Digit Nine
  1232.             // U+0a70 : Gurmukhi Tippi
  1233.             // U+0a71 : Gurmukhi Addak
  1234.             // U+0a72 : Gurmukhi Iri
  1235.             // U+0a73 : Gurmukhi Ura
  1236.             // U+0a74 : Gurmukhi Ek Onkar
  1237.             // U+0a75 : Undefined
  1238.             // U+0a76 : Undefined
  1239.             // U+0a77 : Undefined
  1240.             // U+0a78 : Undefined
  1241.             // U+0a79 : Undefined
  1242.             // U+0a7a : Undefined
  1243.             // U+0a7b : Undefined
  1244.             // U+0a7c : Undefined
  1245.             // U+0a7d : Undefined
  1246.             // U+0a7e : Undefined
  1247.             // U+0a7f : Undefined
  1248.             // U+0a80 : Undefined
  1249.             // U+0a81 : Gujarati Sign Candrabindu
  1250.             // U+0a82 : Gujarati Sign Anusvara
  1251.             // U+0a83 : Gujarati Sign Visarga
  1252.             // U+0a84 : Undefined
  1253.             // U+0a85 : Gujarati Letter A
  1254.             // U+0a86 : Gujarati Letter Aa
  1255.             // U+0a87 : Gujarati Letter I
  1256.             // U+0a88 : Gujarati Letter Ii
  1257.             // U+0a89 : Gujarati Letter U
  1258.             // U+0a8a : Gujarati Letter Uu
  1259.             // U+0a8b : Gujarati Letter Vocalic R
  1260.             // U+0a8c : Undefined
  1261.             // U+0a8d : Gujarati Vowel Candra E
  1262.             // U+0a8e : Undefined
  1263.             // U+0a8f : Gujarati Letter E
  1264.             // U+0a90 : Gujarati Letter Ai
  1265.             // U+0a91 : Gujarati Vowel Candra O
  1266.             // U+0a92 : Undefined
  1267.             // U+0a93 : Gujarati Letter O
  1268.             // U+0a94 : Gujarati Letter Au
  1269.             // U+0a95 : Gujarati Letter Ka
  1270.             // U+0a96 : Gujarati Letter Kha
  1271.             // U+0a97 : Gujarati Letter Ga
  1272.             // U+0a98 : Gujarati Letter Gha
  1273.             // U+0a99 : Gujarati Letter Nga
  1274.             // U+0a9a : Gujarati Letter Ca
  1275.             // U+0a9b : Gujarati Letter Cha
  1276.             // U+0a9c : Gujarati Letter Ja
  1277.             // U+0a9d : Gujarati Letter Jha
  1278.             // U+0a9e : Gujarati Letter Nya
  1279.             // U+0a9f : Gujarati Letter Tta
  1280.             // U+0aa0 : Gujarati Letter Ttha
  1281.             // U+0aa1 : Gujarati Letter Dda
  1282.             // U+0aa2 : Gujarati Letter Ddha
  1283.             // U+0aa3 : Gujarati Letter Nna
  1284.             // U+0aa4 : Gujarati Letter Ta
  1285.             // U+0aa5 : Gujarati Letter Tha
  1286.             // U+0aa6 : Gujarati Letter Da
  1287.             // U+0aa7 : Gujarati Letter Dha
  1288.             // U+0aa8 : Gujarati Letter Na
  1289.             // U+0aa9 : Undefined
  1290.             // U+0aaa : Gujarati Letter Pa
  1291.             // U+0aab : Gujarati Letter Pha
  1292.             // U+0aac : Gujarati Letter Ba
  1293.             // U+0aad : Gujarati Letter Bha
  1294.             // U+0aae : Gujarati Letter Ma
  1295.             // U+0aaf : Gujarati Letter Ya
  1296.             // U+0ab0 : Gujarati Letter Ra
  1297.             // U+0ab1 : Undefined
  1298.             // U+0ab2 : Gujarati Letter La
  1299.             // U+0ab3 : Gujarati Letter Lla
  1300.             // U+0ab4 : Undefined
  1301.             // U+0ab5 : Gujarati Letter Va
  1302.             // U+0ab6 : Gujarati Letter Sha
  1303.             // U+0ab7 : Gujarati Letter Ssa
  1304.             // U+0ab8 : Gujarati Letter Sa
  1305.             // U+0ab9 : Gujarati Letter Ha
  1306.             // U+0aba : Undefined
  1307.             // U+0abb : Undefined
  1308.             // U+0abc : Gujarati Sign Nukta
  1309.             // U+0abd : Gujarati Sign Avagraha
  1310.             // U+0abe : Gujarati Vowel Sign Aa
  1311.             // U+0abf : Gujarati Vowel Sign I
  1312.             // U+0ac0 : Gujarati Vowel Sign Ii
  1313.             // U+0ac1 : Gujarati Vowel Sign U
  1314.             // U+0ac2 : Gujarati Vowel Sign Uu
  1315.             // U+0ac3 : Gujarati Vowel Sign Vocalic R
  1316.             // U+0ac4 : Gujarati Vowel Sign Vocalic Rr
  1317.             // U+0ac5 : Gujarati Vowel Sign Candra E
  1318.             // U+0ac6 : Undefined
  1319.             // U+0ac7 : Gujarati Vowel Sign E
  1320.             // U+0ac8 : Gujarati Vowel Sign Ai
  1321.             // U+0ac9 : Gujarati Vowel Sign Candra O
  1322.             // U+0aca : Undefined
  1323.             // U+0acb : Gujarati Vowel Sign O
  1324.             // U+0acc : Gujarati Vowel Sign Au
  1325.             // U+0acd : Gujarati Sign Virama
  1326.             // U+0ace : Undefined
  1327.             // U+0acf : Undefined
  1328.             // U+0ad0 : Gujarati Om
  1329.             // U+0ad1 : Undefined
  1330.             // U+0ad2 : Undefined
  1331.             // U+0ad3 : Undefined
  1332.             // U+0ad4 : Undefined
  1333.             // U+0ad5 : Undefined
  1334.             // U+0ad6 : Undefined
  1335.             // U+0ad7 : Undefined
  1336.             // U+0ad8 : Undefined
  1337.             // U+0ad9 : Undefined
  1338.             // U+0ada : Undefined
  1339.             // U+0adb : Undefined
  1340.             // U+0adc : Undefined
  1341.             // U+0add : Undefined
  1342.             // U+0ade : Undefined
  1343.             // U+0adf : Undefined
  1344.             // U+0ae0 : Gujarati Letter Vocalic Rr
  1345.             // U+0ae1 : Undefined
  1346.             // U+0ae2 : Undefined
  1347.             // U+0ae3 : Undefined
  1348.             // U+0ae4 : Undefined
  1349.             // U+0ae5 : Undefined
  1350.             // U+0ae6 : Gujarati Digit Zero
  1351.             // U+0ae7 : Gujarati Digit One
  1352.             // U+0ae8 : Gujarati Digit Two
  1353.             // U+0ae9 : Gujarati Digit Three
  1354.             // U+0aea : Gujarati Digit Four
  1355.             // U+0aeb : Gujarati Digit Five
  1356.             // U+0aec : Gujarati Digit Six
  1357.             // U+0aed : Gujarati Digit Seven
  1358.             // U+0aee : Gujarati Digit Eight
  1359.             // U+0aef : Gujarati Digit Nine
  1360.             // U+0af0 : Undefined
  1361.             // U+0af1 : Undefined
  1362.             // U+0af2 : Undefined
  1363.             // U+0af3 : Undefined
  1364.             // U+0af4 : Undefined
  1365.             // U+0af5 : Undefined
  1366.             // U+0af6 : Undefined
  1367.             // U+0af7 : Undefined
  1368.             // U+0af8 : Undefined
  1369.             // U+0af9 : Undefined
  1370.             // U+0afa : Undefined
  1371.             // U+0afb : Undefined
  1372.             // U+0afc : Undefined
  1373.             // U+0afd : Undefined
  1374.             // U+0afe : Undefined
  1375.             // U+0aff : Undefined
  1376.             // U+0b00 : Undefined
  1377.             // U+0b01 : Oriya Sign Candrabindu
  1378.             // U+0b02 : Oriya Sign Anusvara
  1379.             // U+0b03 : Oriya Sign Visarga
  1380.             // U+0b04 : Undefined
  1381.             // U+0b05 : Oriya Letter A
  1382.             // U+0b06 : Oriya Letter Aa
  1383.             // U+0b07 : Oriya Letter I
  1384.             // U+0b08 : Oriya Letter Ii
  1385.             // U+0b09 : Oriya Letter U
  1386.             // U+0b0a : Oriya Letter Uu
  1387.             // U+0b0b : Oriya Letter Vocalic R
  1388.             // U+0b0c : Oriya Letter Vocalic L
  1389.             // U+0b0d : Undefined
  1390.             // U+0b0e : Undefined
  1391.             // U+0b0f : Oriya Letter E
  1392.             // U+0b10 : Oriya Letter Ai
  1393.             // U+0b11 : Undefined
  1394.             // U+0b12 : Undefined
  1395.             // U+0b13 : Oriya Letter O
  1396.             // U+0b14 : Oriya Letter Au
  1397.             // U+0b15 : Oriya Letter Ka
  1398.             // U+0b16 : Oriya Letter Kha
  1399.             // U+0b17 : Oriya Letter Ga
  1400.             // U+0b18 : Oriya Letter Gha
  1401.             // U+0b19 : Oriya Letter Nga
  1402.             // U+0b1a : Oriya Letter Ca
  1403.             // U+0b1b : Oriya Letter Cha
  1404.             // U+0b1c : Oriya Letter Ja
  1405.             // U+0b1d : Oriya Letter Jha
  1406.             // U+0b1e : Oriya Letter Nya
  1407.             // U+0b1f : Oriya Letter Tta
  1408.             // U+0b20 : Oriya Letter Ttha
  1409.             // U+0b21 : Oriya Letter Dda
  1410.             // U+0b22 : Oriya Letter Ddha
  1411.             // U+0b23 : Oriya Letter Nna
  1412.             // U+0b24 : Oriya Letter Ta
  1413.             // U+0b25 : Oriya Letter Tha
  1414.             // U+0b26 : Oriya Letter Da
  1415.             // U+0b27 : Oriya Letter Dha
  1416.             // U+0b28 : Oriya Letter Na
  1417.             // U+0b29 : Undefined
  1418.             // U+0b2a : Oriya Letter Pa
  1419.             // U+0b2b : Oriya Letter Pha
  1420.             // U+0b2c : Oriya Letter Ba
  1421.             // U+0b2d : Oriya Letter Bha
  1422.             // U+0b2e : Oriya Letter Ma
  1423.             // U+0b2f : Oriya Letter Ya
  1424.             // U+0b30 : Oriya Letter Ra
  1425.             // U+0b31 : Undefined
  1426.             // U+0b32 : Oriya Letter La
  1427.             // U+0b33 : Oriya Letter Lla
  1428.             // U+0b34 : Undefined
  1429.             // U+0b35 : Undefined
  1430.             // U+0b36 : Oriya Letter Sha
  1431.             // U+0b37 : Oriya Letter Ssa
  1432.             // U+0b38 : Oriya Letter Sa
  1433.             // U+0b39 : Oriya Letter Ha
  1434.             // U+0b3a : Undefined
  1435.             // U+0b3b : Undefined
  1436.             // U+0b3c : Oriya Sign Nukta
  1437.             // U+0b3d : Oriya Sign Avagraha
  1438.             // U+0b3e : Oriya Vowel Sign Aa
  1439.             // U+0b3f : Oriya Vowel Sign I
  1440.             // U+0b40 : Oriya Vowel Sign Ii
  1441.             // U+0b41 : Oriya Vowel Sign U
  1442.             // U+0b42 : Oriya Vowel Sign Uu
  1443.             // U+0b43 : Oriya Vowel Sign Vocalic R
  1444.             // U+0b44 : Undefined
  1445.             // U+0b45 : Undefined
  1446.             // U+0b46 : Undefined
  1447.             // U+0b47 : Oriya Vowel Sign E
  1448.             // U+0b48 : Oriya Vowel Sign Ai
  1449.             // U+0b49 : Undefined
  1450.             // U+0b4a : Undefined
  1451.             // U+0b4b : Oriya Vowel Sign O
  1452.             // U+0b4c : Oriya Vowel Sign Au
  1453.             // U+0b4d : Oriya Sign Virama
  1454.             // U+0b4e : Undefined
  1455.             // U+0b4f : Undefined
  1456.             // U+0b50 : Undefined
  1457.             // U+0b51 : Undefined
  1458.             // U+0b52 : Undefined
  1459.             // U+0b53 : Undefined
  1460.             // U+0b54 : Undefined
  1461.             // U+0b55 : Undefined
  1462.             // U+0b56 : Oriya Ai Length Mark
  1463.             // U+0b57 : Oriya Au Length Mark
  1464.             // U+0b58 : Undefined
  1465.             // U+0b59 : Undefined
  1466.             // U+0b5a : Undefined
  1467.             // U+0b5b : Undefined
  1468.             // U+0b5c : Oriya Letter Rra
  1469.             // U+0b5d : Oriya Letter Rha
  1470.             // U+0b5e : Undefined
  1471.             // U+0b5f : Oriya Letter Yya
  1472.             // U+0b60 : Oriya Letter Vocalic Rr
  1473.             // U+0b61 : Oriya Letter Vocalic Ll
  1474.             // U+0b62 : Undefined
  1475.             // U+0b63 : Undefined
  1476.             // U+0b64 : Undefined
  1477.             // U+0b65 : Undefined
  1478.             // U+0b66 : Oriya Digit Zero
  1479.             // U+0b67 : Oriya Digit One
  1480.             // U+0b68 : Oriya Digit Two
  1481.             // U+0b69 : Oriya Digit Three
  1482.             // U+0b6a : Oriya Digit Four
  1483.             // U+0b6b : Oriya Digit Five
  1484.             // U+0b6c : Oriya Digit Six
  1485.             // U+0b6d : Oriya Digit Seven
  1486.             // U+0b6e : Oriya Digit Eight
  1487.             // U+0b6f : Oriya Digit Nine
  1488.             // U+0b70 : Oriya Isshar
  1489.             // U+0b71 : Undefined
  1490.             // U+0b72 : Undefined
  1491.             // U+0b73 : Undefined
  1492.             // U+0b74 : Undefined
  1493.             // U+0b75 : Undefined
  1494.             // U+0b76 : Undefined
  1495.             // U+0b77 : Undefined
  1496.             // U+0b78 : Undefined
  1497.             // U+0b79 : Undefined
  1498.             // U+0b7a : Undefined
  1499.             // U+0b7b : Undefined
  1500.             // U+0b7c : Undefined
  1501.             // U+0b7d : Undefined
  1502.             // U+0b7e : Undefined
  1503.             // U+0b7f : Undefined
  1504.             // U+0b80 : Undefined
  1505.             // U+0b81 : Undefined
  1506.             // U+0b82 : Tamil Sign Anusvara
  1507.             // U+0b83 : Tamil Sign Visarga
  1508.             // U+0b84 : Undefined
  1509.             // U+0b85 : Tamil Letter A
  1510.             // U+0b86 : Tamil Letter Aa
  1511.             // U+0b87 : Tamil Letter I
  1512.             // U+0b88 : Tamil Letter Ii
  1513.             // U+0b89 : Tamil Letter U
  1514.             // U+0b8a : Tamil Letter Uu
  1515.             // U+0b8b : Undefined
  1516.             // U+0b8c : Undefined
  1517.             // U+0b8d : Undefined
  1518.             // U+0b8e : Tamil Letter E
  1519.             // U+0b8f : Tamil Letter Ee
  1520.             // U+0b90 : Tamil Letter Ai
  1521.             // U+0b91 : Undefined
  1522.             // U+0b92 : Tamil Letter O
  1523.             // U+0b93 : Tamil Letter Oo
  1524.             // U+0b94 : Tamil Letter Au
  1525.             // U+0b95 : Tamil Letter Ka
  1526.             // U+0b96 : Undefined
  1527.             // U+0b97 : Undefined
  1528.             // U+0b98 : Undefined
  1529.             // U+0b99 : Tamil Letter Nga
  1530.             // U+0b9a : Tamil Letter Ca
  1531.             // U+0b9b : Undefined
  1532.             // U+0b9c : Tamil Letter Ja
  1533.             // U+0b9d : Undefined
  1534.             // U+0b9e : Tamil Letter Nya
  1535.             // U+0b9f : Tamil Letter Tta
  1536.             // U+0ba0 : Undefined
  1537.             // U+0ba1 : Undefined
  1538.             // U+0ba2 : Undefined
  1539.             // U+0ba3 : Tamil Letter Nna
  1540.             // U+0ba4 : Tamil Letter Ta
  1541.             // U+0ba5 : Undefined
  1542.             // U+0ba6 : Undefined
  1543.             // U+0ba7 : Undefined
  1544.             // U+0ba8 : Tamil Letter Na
  1545.             // U+0ba9 : Tamil Letter Nnna
  1546.             // U+0baa : Tamil Letter Pa
  1547.             // U+0bab : Undefined
  1548.             // U+0bac : Undefined
  1549.             // U+0bad : Undefined
  1550.             // U+0bae : Tamil Letter Ma
  1551.             // U+0baf : Tamil Letter Ya
  1552.             // U+0bb0 : Tamil Letter Ra
  1553.             // U+0bb1 : Tamil Letter Rra
  1554.             // U+0bb2 : Tamil Letter La
  1555.             // U+0bb3 : Tamil Letter Lla
  1556.             // U+0bb4 : Tamil Letter Llla
  1557.             // U+0bb5 : Tamil Letter Va
  1558.             // U+0bb6 : Undefined
  1559.             // U+0bb7 : Tamil Letter Ssa
  1560.             // U+0bb8 : Tamil Letter Sa
  1561.             // U+0bb9 : Tamil Letter Ha
  1562.             // U+0bba : Undefined
  1563.             // U+0bbb : Undefined
  1564.             // U+0bbc : Undefined
  1565.             // U+0bbd : Undefined
  1566.             // U+0bbe : Tamil Vowel Sign Aa
  1567.             // U+0bbf : Tamil Vowel Sign I
  1568.             // U+0bc0 : Tamil Vowel Sign Ii
  1569.             // U+0bc1 : Tamil Vowel Sign U
  1570.             // U+0bc2 : Tamil Vowel Sign Uu
  1571.             // U+0bc3 : Undefined
  1572.             // U+0bc4 : Undefined
  1573.             // U+0bc5 : Undefined
  1574.             // U+0bc6 : Tamil Vowel Sign E
  1575.             // U+0bc7 : Tamil Vowel Sign Ee
  1576.             // U+0bc8 : Tamil Vowel Sign Ai
  1577.             // U+0bc9 : Undefined
  1578.             // U+0bca : Tamil Vowel Sign O
  1579.             // U+0bcb : Tamil Vowel Sign Oo
  1580.             // U+0bcc : Tamil Vowel Sign Au
  1581.             // U+0bcd : Tamil Sign Virama
  1582.             // U+0bce : Undefined
  1583.             // U+0bcf : Undefined
  1584.             // U+0bd0 : Undefined
  1585.             // U+0bd1 : Undefined
  1586.             // U+0bd2 : Undefined
  1587.             // U+0bd3 : Undefined
  1588.             // U+0bd4 : Undefined
  1589.             // U+0bd5 : Undefined
  1590.             // U+0bd6 : Undefined
  1591.             // U+0bd7 : Tamil Au Length Mark
  1592.             // U+0bd8 : Undefined
  1593.             // U+0bd9 : Undefined
  1594.             // U+0bda : Undefined
  1595.             // U+0bdb : Undefined
  1596.             // U+0bdc : Undefined
  1597.             // U+0bdd : Undefined
  1598.             // U+0bde : Undefined
  1599.             // U+0bdf : Undefined
  1600.             // U+0be0 : Undefined
  1601.             // U+0be1 : Undefined
  1602.             // U+0be2 : Undefined
  1603.             // U+0be3 : Undefined
  1604.             // U+0be4 : Undefined
  1605.             // U+0be5 : Undefined
  1606.             // U+0be6 : Undefined
  1607.             // U+0be7 : Tamil Digit One
  1608.             // U+0be8 : Tamil Digit Two
  1609.             // U+0be9 : Tamil Digit Three
  1610.             // U+0bea : Tamil Digit Four
  1611.             // U+0beb : Tamil Digit Five
  1612.             // U+0bec : Tamil Digit Six
  1613.             // U+0bed : Tamil Digit Seven
  1614.             // U+0bee : Tamil Digit Eight
  1615.             // U+0bef : Tamil Digit Nine
  1616.             // U+0bf0 : Tamil Number Ten
  1617.             // U+0bf1 : Tamil Number One Hundred
  1618.             // U+0bf2 : Tamil Number One Thousand
  1619.             // U+0bf3 : Undefined
  1620.             // U+0bf4 : Undefined
  1621.             // U+0bf5 : Undefined
  1622.             // U+0bf6 : Undefined
  1623.             // U+0bf7 : Undefined
  1624.             // U+0bf8 : Undefined
  1625.             // U+0bf9 : Undefined
  1626.             // U+0bfa : Undefined
  1627.             // U+0bfb : Undefined
  1628.             // U+0bfc : Undefined
  1629.             // U+0bfd : Undefined
  1630.             // U+0bfe : Undefined
  1631.             // U+0bff : Undefined
  1632.             // U+0c00 : Undefined
  1633.             // U+0c01 : Telugu Sign Candrabindu
  1634.             // U+0c02 : Telugu Sign Anusvara
  1635.             // U+0c03 : Telugu Sign Visarga
  1636.             // U+0c04 : Undefined
  1637.             // U+0c05 : Telugu Letter A
  1638.             // U+0c06 : Telugu Letter Aa
  1639.             // U+0c07 : Telugu Letter I
  1640.             // U+0c08 : Telugu Letter Ii
  1641.             // U+0c09 : Telugu Letter U
  1642.             // U+0c0a : Telugu Letter Uu
  1643.             // U+0c0b : Telugu Letter Vocalic R
  1644.             // U+0c0c : Telugu Letter Vocalic L
  1645.             // U+0c0d : Undefined
  1646.             // U+0c0e : Telugu Letter E
  1647.             // U+0c0f : Telugu Letter Ee
  1648.             // U+0c10 : Telugu Letter Ai
  1649.             // U+0c11 : Undefined
  1650.             // U+0c12 : Telugu Letter O
  1651.             // U+0c13 : Telugu Letter Oo
  1652.             // U+0c14 : Telugu Letter Au
  1653.             // U+0c15 : Telugu Letter Ka
  1654.             // U+0c16 : Telugu Letter Kha
  1655.             // U+0c17 : Telugu Letter Ga
  1656.             // U+0c18 : Telugu Letter Gha
  1657.             // U+0c19 : Telugu Letter Nga
  1658.             // U+0c1a : Telugu Letter Ca
  1659.             // U+0c1b : Telugu Letter Cha
  1660.             // U+0c1c : Telugu Letter Ja
  1661.             // U+0c1d : Telugu Letter Jha
  1662.             // U+0c1e : Telugu Letter Nya
  1663.             // U+0c1f : Telugu Letter Tta
  1664.             // U+0c20 : Telugu Letter Ttha
  1665.             // U+0c21 : Telugu Letter Dda
  1666.             // U+0c22 : Telugu Letter Ddha
  1667.             // U+0c23 : Telugu Letter Nna
  1668.             // U+0c24 : Telugu Letter Ta
  1669.             // U+0c25 : Telugu Letter Tha
  1670.             // U+0c26 : Telugu Letter Da
  1671.             // U+0c27 : Telugu Letter Dha
  1672.             // U+0c28 : Telugu Letter Na
  1673.             // U+0c29 : Undefined
  1674.             // U+0c2a : Telugu Letter Pa
  1675.             // U+0c2b : Telugu Letter Pha
  1676.             // U+0c2c : Telugu Letter Ba
  1677.             // U+0c2d : Telugu Letter Bha
  1678.             // U+0c2e : Telugu Letter Ma
  1679.             // U+0c2f : Telugu Letter Ya
  1680.             // U+0c30 : Telugu Letter Ra
  1681.             // U+0c31 : Telugu Letter Rra
  1682.             // U+0c32 : Telugu Letter La
  1683.             // U+0c33 : Telugu Letter Lla
  1684.             // U+0c34 : Undefined
  1685.             // U+0c35 : Telugu Letter Va
  1686.             // U+0c36 : Telugu Letter Sha
  1687.             // U+0c37 : Telugu Letter Ssa
  1688.             // U+0c38 : Telugu Letter Sa
  1689.             // U+0c39 : Telugu Letter Ha
  1690.             // U+0c3a : Undefined
  1691.             // U+0c3b : Undefined
  1692.             // U+0c3c : Undefined
  1693.             // U+0c3d : Undefined
  1694.             // U+0c3e : Telugu Vowel Sign Aa
  1695.             // U+0c3f : Telugu Vowel Sign I
  1696.             // U+0c40 : Telugu Vowel Sign Ii
  1697.             // U+0c41 : Telugu Vowel Sign U
  1698.             // U+0c42 : Telugu Vowel Sign Uu
  1699.             // U+0c43 : Telugu Vowel Sign Vocalic R
  1700.             // U+0c44 : Telugu Vowel Sign Vocalic Rr
  1701.             // U+0c45 : Undefined
  1702.             // U+0c46 : Telugu Vowel Sign E
  1703.             // U+0c47 : Telugu Vowel Sign Ee
  1704.             // U+0c48 : Telugu Vowel Sign Ai
  1705.             // U+0c49 : Undefined
  1706.             // U+0c4a : Telugu Vowel Sign O
  1707.             // U+0c4b : Telugu Vowel Sign Oo
  1708.             // U+0c4c : Telugu Vowel Sign Au
  1709.             // U+0c4d : Telugu Sign Virama
  1710.             // U+0c4e : Undefined
  1711.             // U+0c4f : Undefined
  1712.             // U+0c50 : Undefined
  1713.             // U+0c51 : Undefined
  1714.             // U+0c52 : Undefined
  1715.             // U+0c53 : Undefined
  1716.             // U+0c54 : Undefined
  1717.             // U+0c55 : Telugu Length Mark
  1718.             // U+0c56 : Telugu Ai Length Mark
  1719.             // U+0c57 : Undefined
  1720.             // U+0c58 : Undefined
  1721.             // U+0c59 : Undefined
  1722.             // U+0c5a : Undefined
  1723.             // U+0c5b : Undefined
  1724.             // U+0c5c : Undefined
  1725.             // U+0c5d : Undefined
  1726.             // U+0c5e : Undefined
  1727.             // U+0c5f : Undefined
  1728.             // U+0c60 : Telugu Letter Vocalic Rr
  1729.             // U+0c61 : Telugu Letter Vocalic Ll
  1730.             // U+0c62 : Undefined
  1731.             // U+0c63 : Undefined
  1732.             // U+0c64 : Undefined
  1733.             // U+0c65 : Undefined
  1734.             // U+0c66 : Telugu Digit Zero
  1735.             // U+0c67 : Telugu Digit One
  1736.             // U+0c68 : Telugu Digit Two
  1737.             // U+0c69 : Telugu Digit Three
  1738.             // U+0c6a : Telugu Digit Four
  1739.             // U+0c6b : Telugu Digit Five
  1740.             // U+0c6c : Telugu Digit Six
  1741.             // U+0c6d : Telugu Digit Seven
  1742.             // U+0c6e : Telugu Digit Eight
  1743.             // U+0c6f : Telugu Digit Nine
  1744.             // U+0c70 : Undefined
  1745.             // U+0c71 : Undefined
  1746.             // U+0c72 : Undefined
  1747.             // U+0c73 : Undefined
  1748.             // U+0c74 : Undefined
  1749.             // U+0c75 : Undefined
  1750.             // U+0c76 : Undefined
  1751.             // U+0c77 : Undefined
  1752.             // U+0c78 : Undefined
  1753.             // U+0c79 : Undefined
  1754.             // U+0c7a : Undefined
  1755.             // U+0c7b : Undefined
  1756.             // U+0c7c : Undefined
  1757.             // U+0c7d : Undefined
  1758.             // U+0c7e : Undefined
  1759.             // U+0c7f : Undefined
  1760.             // U+0c80 : Undefined
  1761.             // U+0c81 : Undefined
  1762.             // U+0c82 : Kannada Sign Anusvara
  1763.             // U+0c83 : Kannada Sign Visarga
  1764.             // U+0c84 : Undefined
  1765.             // U+0c85 : Kannada Letter A
  1766.             // U+0c86 : Kannada Letter Aa
  1767.             // U+0c87 : Kannada Letter I
  1768.             // U+0c88 : Kannada Letter Ii
  1769.             // U+0c89 : Kannada Letter U
  1770.             // U+0c8a : Kannada Letter Uu
  1771.             // U+0c8b : Kannada Letter Vocalic R
  1772.             // U+0c8c : Kannada Letter Vocalic L
  1773.             // U+0c8d : Undefined
  1774.             // U+0c8e : Kannada Letter E
  1775.             // U+0c8f : Kannada Letter Ee
  1776.             // U+0c90 : Kannada Letter Ai
  1777.             // U+0c91 : Undefined
  1778.             // U+0c92 : Kannada Letter O
  1779.             // U+0c93 : Kannada Letter Oo
  1780.             // U+0c94 : Kannada Letter Au
  1781.             // U+0c95 : Kannada Letter Ka
  1782.             // U+0c96 : Kannada Letter Kha
  1783.             // U+0c97 : Kannada Letter Ga
  1784.             // U+0c98 : Kannada Letter Gha
  1785.             // U+0c99 : Kannada Letter Nga
  1786.             // U+0c9a : Kannada Letter Ca
  1787.             // U+0c9b : Kannada Letter Cha
  1788.             // U+0c9c : Kannada Letter Ja
  1789.             // U+0c9d : Kannada Letter Jha
  1790.             // U+0c9e : Kannada Letter Nya
  1791.             // U+0c9f : Kannada Letter Tta
  1792.             // U+0ca0 : Kannada Letter Ttha
  1793.             // U+0ca1 : Kannada Letter Dda
  1794.             // U+0ca2 : Kannada Letter Ddha
  1795.             // U+0ca3 : Kannada Letter Nna
  1796.             // U+0ca4 : Kannada Letter Ta
  1797.             // U+0ca5 : Kannada Letter Tha
  1798.             // U+0ca6 : Kannada Letter Da
  1799.             // U+0ca7 : Kannada Letter Dha
  1800.             // U+0ca8 : Kannada Letter Na
  1801.             // U+0ca9 : Undefined
  1802.             // U+0caa : Kannada Letter Pa
  1803.             // U+0cab : Kannada Letter Pha
  1804.             // U+0cac : Kannada Letter Ba
  1805.             // U+0cad : Kannada Letter Bha
  1806.             // U+0cae : Kannada Letter Ma
  1807.             // U+0caf : Kannada Letter Ya
  1808.             // U+0cb0 : Kannada Letter Ra
  1809.             // U+0cb1 : Kannada Letter Rra
  1810.             // U+0cb2 : Kannada Letter La
  1811.             // U+0cb3 : Kannada Letter Lla
  1812.             // U+0cb4 : Undefined
  1813.             // U+0cb5 : Kannada Letter Va
  1814.             // U+0cb6 : Kannada Letter Sha
  1815.             // U+0cb7 : Kannada Letter Ssa
  1816.             // U+0cb8 : Kannada Letter Sa
  1817.             // U+0cb9 : Kannada Letter Ha
  1818.             // U+0cba : Undefined
  1819.             // U+0cbb : Undefined
  1820.             // U+0cbc : Undefined
  1821.             // U+0cbd : Undefined
  1822.             // U+0cbe : Kannada Vowel Sign Aa
  1823.             // U+0cbf : Kannada Vowel Sign I
  1824.             // U+0cc0 : Kannada Vowel Sign Ii
  1825.             // U+0cc1 : Kannada Vowel Sign U
  1826.             // U+0cc2 : Kannada Vowel Sign Uu
  1827.             // U+0cc3 : Kannada Vowel Sign Vocalic R
  1828.             // U+0cc4 : Kannada Vowel Sign Vocalic Rr
  1829.             // U+0cc5 : Undefined
  1830.             // U+0cc6 : Kannada Vowel Sign E
  1831.             // U+0cc7 : Kannada Vowel Sign Ee
  1832.             // U+0cc8 : Kannada Vowel Sign Ai
  1833.             // U+0cc9 : Undefined
  1834.             // U+0cca : Kannada Vowel Sign O
  1835.             // U+0ccb : Kannada Vowel Sign Oo
  1836.             // U+0ccc : Kannada Vowel Sign Au
  1837.             // U+0ccd : Kannada Sign Virama
  1838.             // U+0cce : Undefined
  1839.             // U+0ccf : Undefined
  1840.             // U+0cd0 : Undefined
  1841.             // U+0cd1 : Undefined
  1842.             // U+0cd2 : Undefined
  1843.             // U+0cd3 : Undefined
  1844.             // U+0cd4 : Undefined
  1845.             // U+0cd5 : Kannada Length Mark
  1846.             // U+0cd6 : Kannada Ai Length Mark
  1847.             // U+0cd7 : Undefined
  1848.             // U+0cd8 : Undefined
  1849.             // U+0cd9 : Undefined
  1850.             // U+0cda : Undefined
  1851.             // U+0cdb : Undefined
  1852.             // U+0cdc : Undefined
  1853.             // U+0cdd : Undefined
  1854.             // U+0cde : Kannada Letter Fa
  1855.             // U+0cdf : Undefined
  1856.             // U+0ce0 : Kannada Letter Vocalic Rr
  1857.             // U+0ce1 : Kannada Letter Vocalic Ll
  1858.             // U+0ce2 : Undefined
  1859.             // U+0ce3 : Undefined
  1860.             // U+0ce4 : Undefined
  1861.             // U+0ce5 : Undefined
  1862.             // U+0ce6 : Kannada Digit Zero
  1863.             // U+0ce7 : Kannada Digit One
  1864.             // U+0ce8 : Kannada Digit Two
  1865.             // U+0ce9 : Kannada Digit Three
  1866.             // U+0cea : Kannada Digit Four
  1867.             // U+0ceb : Kannada Digit Five
  1868.             // U+0cec : Kannada Digit Six
  1869.             // U+0ced : Kannada Digit Seven
  1870.             // U+0cee : Kannada Digit Eight
  1871.             // U+0cef : Kannada Digit Nine
  1872.             // U+0cf0 : Undefined
  1873.             // U+0cf1 : Undefined
  1874.             // U+0cf2 : Undefined
  1875.             // U+0cf3 : Undefined
  1876.             // U+0cf4 : Undefined
  1877.             // U+0cf5 : Undefined
  1878.             // U+0cf6 : Undefined
  1879.             // U+0cf7 : Undefined
  1880.             // U+0cf8 : Undefined
  1881.             // U+0cf9 : Undefined
  1882.             // U+0cfa : Undefined
  1883.             // U+0cfb : Undefined
  1884.             // U+0cfc : Undefined
  1885.             // U+0cfd : Undefined
  1886.             // U+0cfe : Undefined
  1887.             // U+0cff : Undefined
  1888.             // U+0d00 : Undefined
  1889.             // U+0d01 : Undefined
  1890.             // U+0d02 : Malayalam Sign Anusvara
  1891.             // U+0d03 : Malayalam Sign Visarga
  1892.             // U+0d04 : Undefined
  1893.             // U+0d05 : Malayalam Letter A
  1894.             // U+0d06 : Malayalam Letter Aa
  1895.             // U+0d07 : Malayalam Letter I
  1896.             // U+0d08 : Malayalam Letter Ii
  1897.             // U+0d09 : Malayalam Letter U
  1898.             // U+0d0a : Malayalam Letter Uu
  1899.             // U+0d0b : Malayalam Letter Vocalic R
  1900.             // U+0d0c : Malayalam Letter Vocalic L
  1901.             // U+0d0d : Undefined
  1902.             // U+0d0e : Malayalam Letter E
  1903.             // U+0d0f : Malayalam Letter Ee
  1904.             // U+0d10 : Malayalam Letter Ai
  1905.             // U+0d11 : Undefined
  1906.             // U+0d12 : Malayalam Letter O
  1907.             // U+0d13 : Malayalam Letter Oo
  1908.             // U+0d14 : Malayalam Letter Au
  1909.             // U+0d15 : Malayalam Letter Ka
  1910.             // U+0d16 : Malayalam Letter Kha
  1911.             // U+0d17 : Malayalam Letter Ga
  1912.             // U+0d18 : Malayalam Letter Gha
  1913.             // U+0d19 : Malayalam Letter Nga
  1914.             // U+0d1a : Malayalam Letter Ca
  1915.             // U+0d1b : Malayalam Letter Cha
  1916.             // U+0d1c : Malayalam Letter Ja
  1917.             // U+0d1d : Malayalam Letter Jha
  1918.             // U+0d1e : Malayalam Letter Nya
  1919.             // U+0d1f : Malayalam Letter Tta
  1920.             // U+0d20 : Malayalam Letter Ttha
  1921.             // U+0d21 : Malayalam Letter Dda
  1922.             // U+0d22 : Malayalam Letter Ddha
  1923.             // U+0d23 : Malayalam Letter Nna
  1924.             // U+0d24 : Malayalam Letter Ta
  1925.             // U+0d25 : Malayalam Letter Tha
  1926.             // U+0d26 : Malayalam Letter Da
  1927.             // U+0d27 : Malayalam Letter Dha
  1928.             // U+0d28 : Malayalam Letter Na
  1929.             // U+0d29 : Undefined
  1930.             // U+0d2a : Malayalam Letter Pa
  1931.             // U+0d2b : Malayalam Letter Pha
  1932.             // U+0d2c : Malayalam Letter Ba
  1933.             // U+0d2d : Malayalam Letter Bha
  1934.             // U+0d2e : Malayalam Letter Ma
  1935.             // U+0d2f : Malayalam Letter Ya
  1936.             // U+0d30 : Malayalam Letter Ra
  1937.             // U+0d31 : Malayalam Letter Rra
  1938.             // U+0d32 : Malayalam Letter La
  1939.             // U+0d33 : Malayalam Letter Lla
  1940.             // U+0d34 : Malayalam Letter Llla
  1941.             // U+0d35 : Malayalam Letter Va
  1942.             // U+0d36 : Malayalam Letter Sha
  1943.             // U+0d37 : Malayalam Letter Ssa
  1944.             // U+0d38 : Malayalam Letter Sa
  1945.             // U+0d39 : Malayalam Letter Ha
  1946.             // U+0d3a : Undefined
  1947.             // U+0d3b : Undefined
  1948.             // U+0d3c : Undefined
  1949.             // U+0d3d : Undefined
  1950.             // U+0d3e : Malayalam Vowel Sign Aa
  1951.             // U+0d3f : Malayalam Vowel Sign I
  1952.             // U+0d40 : Malayalam Vowel Sign Ii
  1953.             // U+0d41 : Malayalam Vowel Sign U
  1954.             // U+0d42 : Malayalam Vowel Sign Uu
  1955.             // U+0d43 : Malayalam Vowel Sign Vocalic R
  1956.             // U+0d44 : Undefined
  1957.             // U+0d45 : Undefined
  1958.             // U+0d46 : Malayalam Vowel Sign E
  1959.             // U+0d47 : Malayalam Vowel Sign Ee
  1960.             // U+0d48 : Malayalam Vowel Sign Ai
  1961.             // U+0d49 : Undefined
  1962.             // U+0d4a : Malayalam Vowel Sign O
  1963.             // U+0d4b : Malayalam Vowel Sign Oo
  1964.             // U+0d4c : Malayalam Vowel Sign Au
  1965.             // U+0d4d : Malayalam Sign Virama
  1966.             // U+0d4e : Undefined
  1967.             // U+0d4f : Undefined
  1968.             // U+0d50 : Undefined
  1969.             // U+0d51 : Undefined
  1970.             // U+0d52 : Undefined
  1971.             // U+0d53 : Undefined
  1972.             // U+0d54 : Undefined
  1973.             // U+0d55 : Undefined
  1974.             // U+0d56 : Undefined
  1975.             // U+0d57 : Malayalam Au Length Mark
  1976.             // U+0d58 : Undefined
  1977.             // U+0d59 : Undefined
  1978.             // U+0d5a : Undefined
  1979.             // U+0d5b : Undefined
  1980.             // U+0d5c : Undefined
  1981.             // U+0d5d : Undefined
  1982.             // U+0d5e : Undefined
  1983.             // U+0d5f : Undefined
  1984.             // U+0d60 : Malayalam Letter Vocalic Rr
  1985.             // U+0d61 : Malayalam Letter Vocalic Ll
  1986.             // U+0d62 : Undefined
  1987.             // U+0d63 : Undefined
  1988.             // U+0d64 : Undefined
  1989.             // U+0d65 : Undefined
  1990.             // U+0d66 : Malayalam Digit Zero
  1991.             // U+0d67 : Malayalam Digit One
  1992.             // U+0d68 : Malayalam Digit Two
  1993.             // U+0d69 : Malayalam Digit Three
  1994.             // U+0d6a : Malayalam Digit Four
  1995.             // U+0d6b : Malayalam Digit Five
  1996.             // U+0d6c : Malayalam Digit Six
  1997.             // U+0d6d : Malayalam Digit Seven
  1998.             // U+0d6e : Malayalam Digit Eight
  1999.             // U+0d6f : Malayalam Digit Nine
  2000.         2550, 2551, 2552, 2553, 2554};
  2001.        
  2002.         ////////////////////////////////////////////////////////////////////////////
  2003.         // SecondIndicByte
  2004.         //
  2005.         // This is used if the UnicodeToIndic table 4 high bits are set, this is
  2006.         // the value of the second Indic byte when applicable.
  2007.         ////////////////////////////////////////////////////////////////////////////
  2008.             // U+0952 == 0xf0_0xb8
  2009.             // U+0970 == 0xf0_0xbf
  2010.         static byte[] SecondIndicByte = {0, 233, 184, 191};
  2011.        
  2012.         ////////////////////////////////////////////////////////////////////////////
  2013.         // IndicMapping
  2014.         //
  2015.         // This table maps the 10 indic code pages to their unicode counterparts.
  2016.         // There are 0x60 characters in each table. The tables are in pairs of 2
  2017.         // (1st char, 2nd char) and there are 10 tables (1 for each code page "font")
  2018.         ////////////////////////////////////////////////////////////////////////////
  2019.         static int[] IndicMappingIndex = {-1, -1, 0, 1, 2, 3, 1, 4, 5, 6,
  2020.             // 0 DEF 0X40 Default // Not a real code page
  2021.             // 1 RMN 0X41 Roman // Transliteration not supported
  2022.             // 2 DEV 0X42 Devanagari
  2023.             // 3 BNG 0X43 Bengali
  2024.             // 4 TML 0X44 Tamil
  2025.             // 5 TLG 0X45 Telugu
  2026.             // 6 ASM 0X46 Assamese (Bengali) - Reuses table 1
  2027.             // 7 ORI 0X47 Oriya
  2028.             // 8 KND 0X48 Kannada
  2029.             // 9 MLM 0X49 Malayalam
  2030.             // 10 GJR 0X4A Gujarati
  2031.             // 11 PNJ 0X4B Punjabi (Gurmukhi)
  2032.         7, 8};
  2033.        
  2034.         ////////////////////////////////////////////////////////////////////////////
  2035.         // IndicMapping
  2036.         //
  2037.         // This table contains 9 tables for the 10 indic code pages to their unicode counterparts.
  2038.         // There are 0x60 characters in each table. The tables are in pairs of 2
  2039.         // (1st char, 2nd char) and there are 10 tables (1 for each code page "font")
  2040.         //
  2041.         // The first index is the table index (from the IndicMappingIndex table),
  2042.         // the 2nd the byte index, the third the character index.
  2043.         //
  2044.         // For byte 0 a 0x0000 value indicates an unknown character
  2045.         // For byte 1 a 0 value indicates no special attributes.
  2046.         // For byte 1, 200C & 200D are Virama, Nukta special cases
  2047.         // For byte 1, B8BF is Devanagari stress & abbreviation sign special cases
  2048.         //
  2049.         // WARNING: When copying these from windows, ? 0x003F were changed to 0x0000.
  2050.         //
  2051.         ////////////////////////////////////////////////////////////////////////////
  2052.         // char[codePageMapIndex][byte][character]
  2053.         static char[,,] IndicMapping = {{{'\0', 'ँ', 'ं', 'ः', 'अ', 'आ', 'इ', 'ई', 'उ', 'ऊ',
  2054.         'ऋ', 'ऎ', 'ए', 'ऐ', 'ऍ', 'ऒ', 'ओ', 'औ', 'ऑ', 'क',
  2055.         'ख', 'ग', 'घ', 'ङ', 'च', 'छ', 'ज', 'झ', 'ञ', 'ट',
  2056.         'ठ', 'ड', 'ढ', 'ण', 'त', 'थ', 'द', 'ध', 'न', 'ऩ',
  2057.         'प', 'फ', 'ब', 'भ', 'म', 'य', 'य़', 'र', 'ऱ', 'ल',
  2058.         'ळ', 'ऴ', 'व', 'श', 'ष', 'स', 'ह', '\0', 'ा', 'ि',
  2059.         'ी', 'ु', 'ू', 'ृ', 'ॆ', 'े', 'ै', 'ॅ', 'ॊ', 'ो',
  2060.         'ौ', 'ॉ', '्', '़', '।', '\0', '\0', '\0', '\0', '\0',
  2061.         '\0', '०', '१', '२', '३', '४', '५', '६', '७', '८',
  2062.         '९', '\0', '\0', '\0', '\0', '\0'}, {'\0', 'ॐ', '\0', '\0', '\0', '\0', 'ऌ', 'ॡ', '\0', '\0',
  2063.         'ॠ', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', 'क़',
  2064.         'ख़', 'ग़', '\0', '\0', '\0', '\0', 'ज़', '\0', '\0', '\0',
  2065.         '\0', 'ड़', 'ढ़', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2066.         '\0', 'फ़', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2067.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', 'ॢ',
  2068.         'ॣ', '\0', '\0', 'ॄ', '\0', '\0', '\0', '\0', '\0', '\0',
  2069.         '\0', '\0', '‌', '‍', 'ऽ', '\0', '\0', '\0', '\0', '\0',
  2070.         '뢿', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2071.         '\0', '\0', '\0', '\0', '\0', '\0'}}, {{'\0', 'ঁ', 'ং', 'ঃ', 'অ', 'আ', 'ই', 'ঈ', 'উ', 'ঊ',
  2072.         'ঋ', 'এ', 'এ', 'ঐ', 'ঐ', 'ও', 'ও', 'ঔ', 'ঔ', 'ক',
  2073.         'খ', 'গ', 'ঘ', 'ঙ', 'চ', 'ছ', 'জ', 'ঝ', 'ঞ', 'ট',
  2074.         'ঠ', 'ড', 'ঢ', 'ণ', 'ত', 'থ', 'দ', 'ধ', 'ন', 'ন',
  2075.         'প', 'ফ', 'ব', 'ভ', 'ম', 'য', 'য়', 'র', 'র', 'ল',
  2076.         'ল', 'ল', 'ব', 'শ', 'ষ', 'স', 'হ', '\0', 'া', 'ি',
  2077.         'ী', 'ু', 'ূ', 'ৃ', 'ে', 'ে', 'ৈ', 'ৈ', 'ো', 'ো',
  2078.         'ৌ', 'ৌ', '্', '়', '.', '\0', '\0', '\0', '\0', '\0',
  2079.         '\0', '০', '১', '২', '৩', '৪', '৫', '৬', '৭', '৮',
  2080.         '৯', '\0', '\0', '\0', '\0', '\0'}, {'\0', '\0', '\0', '\0', '\0', '\0', 'ঌ', 'ৡ', '\0', '\0',
  2081.         'ৠ', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2082.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2083.         '\0', 'ড়', 'ঢ়', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2084.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2085.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', 'ৢ',
  2086.         'ৣ', '\0', '\0', 'ৄ', '\0', '\0', '\0', '\0', '\0', '\0',
  2087.         '\0', '\0', '‌', '‍', '\0', '\0', '\0', '\0', '\0', '\0',
  2088.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2089.         '\0', '\0', '\0', '\0', '\0', '\0'}}, {{'\0', '\0', 'ஂ', 'ஃ', 'அ', 'ஆ', 'இ', 'ஈ', 'உ', 'ஊ',
  2090.         '\0', 'ஏ', 'ஏ', 'ஐ', 'ஐ', 'ஒ', 'ஓ', 'ஔ', 'ஔ', 'க',
  2091.         'க', 'க', 'க', 'ங', 'ச', 'ச', 'ஜ', 'ஜ', 'ஞ', 'ட',
  2092.         'ட', 'ட', 'ட', 'ண', 'த', 'த', 'த', 'த', 'ந', 'ன',
  2093.         'ப', 'ப', 'ப', 'ப', 'ம', 'ய', 'ய', 'ர', 'ற', 'ல',
  2094.         'ள', 'ழ', 'வ', 'ஷ', 'ஷ', 'ஸ', 'ஹ', '\0', 'ா', 'ி',
  2095.         'ீ', 'ு', 'ூ', '\0', 'ெ', 'ே', 'ை', 'ை', 'ொ', 'ோ',
  2096.         'ௌ', 'ௌ', '்', '\0', '.', '\0', '\0', '\0', '\0', '\0',
  2097.         '\0', '0', '௧', '௨', '௩', '௪', '௫', '௬', '௭', '௮',
  2098.         '௯', '\0', '\0', '\0', '\0', '\0'}, {'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2099.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2100.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2101.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2102.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2103.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2104.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2105.         '\0', '\0', '‌', '‍', '\0', '\0', '\0', '\0', '\0', '\0',
  2106.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2107.         '\0', '\0', '\0', '\0', '\0', '\0'}}, {{'\0', 'ఁ', 'ం', 'ః', 'అ', 'ఆ', 'ఇ', 'ఈ', 'ఉ', 'ఊ',
  2108.         'ఋ', 'ఎ', 'ఏ', 'ఐ', 'ఐ', 'ఒ', 'ఓ', 'ఔ', 'ఔ', 'క',
  2109.         'ఖ', 'గ', 'ఘ', 'ఙ', 'చ', 'ఛ', 'జ', 'ఝ', 'ఞ', 'ట',
  2110.         'ఠ', 'డ', 'ఢ', 'ణ', 'త', 'థ', 'ద', 'ధ', 'న', 'న',
  2111.         'ప', 'ఫ', 'బ', 'భ', 'మ', 'య', 'య', 'ర', 'ఱ', 'ల',
  2112.         'ళ', 'ళ', 'వ', 'శ', 'ష', 'స', 'హ', '\0', 'ా', 'ి',
  2113.         'ీ', 'ు', 'ూ', 'ృ', 'ె', 'ే', 'ై', 'ై', 'ొ', 'ో',
  2114.         'ౌ', 'ౌ', '్', '\0', '.', '\0', '\0', '\0', '\0', '\0',
  2115.         '\0', '౦', '౧', '౨', '౩', '౪', '౫', '౬', '౭', '౮',
  2116.         '౯', '\0', '\0', '\0', '\0', '\0'}, {'\0', '\0', '\0', '\0', '\0', '\0', 'ఌ', 'ౡ', '\0', '\0',
  2117.         'ౠ', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2118.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2119.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2120.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2121.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2122.         '\0', '\0', '\0', 'ౄ', '\0', '\0', '\0', '\0', '\0', '\0',
  2123.         '\0', '\0', '‌', '‍', '\0', '\0', '\0', '\0', '\0', '\0',
  2124.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2125.         '\0', '\0', '\0', '\0', '\0', '\0'}}, {{'\0', 'ଁ', 'ଂ', 'ଃ', 'ଅ', 'ଆ', 'ଇ', 'ଈ', 'ଉ', 'ଊ',
  2126.         'ଋ', 'ଏ', 'ଏ', 'ଐ', 'ଐ', 'ଐ', 'ଓ', 'ଔ', 'ଔ', 'କ',
  2127.         'ଖ', 'ଗ', 'ଘ', 'ଙ', 'ଚ', 'ଛ', 'ଜ', 'ଝ', 'ଞ', 'ଟ',
  2128.         'ଠ', 'ଡ', 'ଢ', 'ଣ', 'ତ', 'ଥ', 'ଦ', 'ଧ', 'ନ', 'ନ',
  2129.         'ପ', 'ଫ', 'ବ', 'ଭ', 'ମ', 'ଯ', 'ୟ', 'ର', 'ର', 'ଲ',
  2130.         'ଳ', 'ଳ', 'ବ', 'ଶ', 'ଷ', 'ସ', 'ହ', '\0', 'ା', 'ି',
  2131.         'ୀ', 'ୁ', 'ୂ', 'ୃ', 'େ', 'େ', 'ୈ', 'ୈ', 'ୋ', 'ୋ',
  2132.         'ୌ', 'ୌ', '୍', '଼', '.', '\0', '\0', '\0', '\0', '\0',
  2133.         '\0', '୦', '୧', '୨', '୩', '୪', '୫', '୬', '୭', '୮',
  2134.         '୯', '\0', '\0', '\0', '\0', '\0'}, {'\0', '\0', '\0', '\0', '\0', '\0', 'ఌ', 'ౡ', '\0', '\0',
  2135.         'ౠ', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2136.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2137.         '\0', 'ଡ଼', 'ଢ଼', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2138.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2139.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2140.         '\0', '\0', '\0', 'ౄ', '\0', '\0', '\0', '\0', '\0', '\0',
  2141.         '\0', '\0', '‌', '‍', 'ଽ', '\0', '\0', '\0', '\0', '\0',
  2142.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2143.         '\0', '\0', '\0', '\0', '\0', '\0'}}, {{'\0', '\0', 'ಂ', 'ಃ', 'ಅ', 'ಆ', 'ಇ', 'ಈ', 'ಉ', 'ಊ',
  2144.         'ಋ', 'ಎ', 'ಏ', 'ಐ', 'ಐ', 'ಒ', 'ಓ', 'ಔ', 'ಔ', 'ಕ',
  2145.         'ಖ', 'ಗ', 'ಘ', 'ಙ', 'ಚ', 'ಛ', 'ಜ', 'ಝ', 'ಞ', 'ಟ',
  2146.         'ಠ', 'ಡ', 'ಢ', 'ಣ', 'ತ', 'ಥ', 'ದ', 'ಧ', 'ನ', 'ನ',
  2147.         'ಪ', 'ಫ', 'ಬ', 'ಭ', 'ಮ', 'ಯ', 'ಯ', 'ರ', 'ಱ', 'ಲ',
  2148.         'ಳ', 'ಳ', 'ವ', 'ಶ', 'ಷ', 'ಸ', 'ಹ', '\0', 'ಾ', 'ಿ',
  2149.         'ೀ', 'ು', 'ೂ', 'ೃ', 'ೆ', 'ೇ', 'ೈ', 'ೈ', 'ೊ', 'ೋ',
  2150.         'ೌ', 'ೌ', '್', '\0', '.', '\0', '\0', '\0', '\0', '\0',
  2151.         '\0', '೦', '೧', '೨', '೩', '೪', '೫', '೬', '೭', '೮',
  2152.         '೯', '\0', '\0', '\0', '\0', '\0'}, {'\0', '\0', '\0', '\0', '\0', '\0', 'ಌ', 'ೡ', '\0', '\0',
  2153.         'ೠ', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2154.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2155.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2156.         '\0', 'ೞ', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2157.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2158.         '\0', '\0', '\0', 'ೄ', '\0', '\0', '\0', '\0', '\0', '\0',
  2159.         '\0', '\0', '‌', '‍', '\0', '\0', '\0', '\0', '\0', '\0',
  2160.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2161.         '\0', '\0', '\0', '\0', '\0', '\0'}}, {{'\0', '\0', 'ം', 'ഃ', 'അ', 'ആ', 'ഇ', 'ഈ', 'ഉ', 'ഊ',
  2162.         'ഋ', 'എ', 'ഏ', 'ഐ', 'ഐ', 'ഒ', 'ഓ', 'ഔ', 'ഔ', 'ക',
  2163.         'ഖ', 'ഗ', 'ഘ', 'ങ', 'ച', 'ഛ', 'ജ', 'ഝ', 'ഞ', 'ട',
  2164.         'ഠ', 'ഡ', 'ഢ', 'ണ', 'ത', 'ഥ', 'ദ', 'ധ', 'ന', 'ന',
  2165.         'പ', 'ഫ', 'ബ', 'ഭ', 'മ', 'യ', 'യ', 'ര', 'റ', 'ല',
  2166.         'ള', 'ഴ', 'വ', 'ശ', 'ഷ', 'സ', 'ഹ', '\0', 'ാ', 'ി',
  2167.         'ീ', 'ു', 'ൂ', 'ൃ', 'െ', 'േ', 'ൈ', 'ൈ', 'ൊ', 'ോ',
  2168.         'ൌ', 'ൌ', '്', '\0', '.', '\0', '\0', '\0', '\0', '\0',
  2169.         '\0', '൦', '൧', '൨', '൩', '൪', '൫', '൬', '൭', '൮',
  2170.         '൯', '\0', '\0', '\0', '\0', '\0'}, {'\0', '\0', '\0', '\0', '\0', '\0', 'ഌ', 'ൡ', '\0', '\0',
  2171.         'ൠ', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2172.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2173.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2174.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2175.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2176.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2177.         '\0', '\0', '‌', '‍', '\0', '\0', '\0', '\0', '\0', '\0',
  2178.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2179.         '\0', '\0', '\0', '\0', '\0', '\0'}}, {{'\0', 'ઁ', 'ં', 'ઃ', 'અ', 'આ', 'ઇ', 'ઈ', 'ઉ', 'ઊ',
  2180.         'ઋ', 'એ', 'એ', 'ઐ', 'ઍ', 'ઍ', 'ઓ', 'ઔ', 'ઑ', 'ક',
  2181.         'ખ', 'ગ', 'ઘ', 'ઙ', 'ચ', 'છ', 'જ', 'ઝ', 'ઞ', 'ટ',
  2182.         'ઠ', 'ડ', 'ઢ', 'ણ', 'ત', 'થ', 'દ', 'ધ', 'ન', 'ન',
  2183.         'પ', 'ફ', 'બ', 'ભ', 'મ', 'ય', 'ય', 'ર', 'ર', 'લ',
  2184.         'ળ', 'ળ', 'વ', 'શ', 'ષ', 'સ', 'હ', '\0', 'ા', 'િ',
  2185.         'ી', 'ુ', 'ૂ', 'ૃ', 'ે', 'ે', 'ૈ', 'ૅ', 'ો', 'ો',
  2186.         'ૌ', 'ૉ', '્', '઼', '.', '\0', '\0', '\0', '\0', '\0',
  2187.         '\0', '૦', '૧', '૨', '૩', '૪', '૫', '૬', '૭', '૮',
  2188.         '૯', '\0', '\0', '\0', '\0', '\0'}, {'\0', 'ૐ', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2189.         'ૠ', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2190.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2191.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2192.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2193.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2194.         '\0', '\0', '\0', 'ૄ', '\0', '\0', '\0', '\0', '\0', '\0',
  2195.         '\0', '\0', '‌', '‍', 'ઽ', '\0', '\0', '\0', '\0', '\0',
  2196.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2197.         '\0', '\0', '\0', '\0', '\0', '\0'}}, {{'\0', '\0', 'ਂ', '\0', 'ਅ', 'ਆ', 'ਇ', 'ਈ', 'ਉ', 'ਊ',
  2198.         '\0', 'ਏ', 'ਏ', 'ਐ', 'ਐ', 'ਐ', 'ਓ', 'ਔ', 'ਔ', 'ਕ',
  2199.         'ਖ', 'ਗ', 'ਘ', 'ਙ', 'ਚ', 'ਛ', 'ਜ', 'ਝ', 'ਞ', 'ਟ',
  2200.         'ਠ', 'ਡ', 'ਢ', 'ਣ', 'ਤ', 'ਥ', 'ਦ', 'ਧ', 'ਨ', 'ਨ',
  2201.         'ਪ', 'ਫ', 'ਬ', 'ਭ', 'ਮ', 'ਯ', 'ਯ', 'ਰ', 'ਰ', 'ਲ',
  2202.         'ਲ਼', 'ਲ਼', 'ਵ', 'ਸ਼', 'ਸ਼', 'ਸ', 'ਹ', '\0', 'ਾ', 'ਿ',
  2203.         'ੀ', 'ੁ', 'ੂ', '\0', 'ੇ', 'ੇ', 'ੈ', 'ੈ', 'ੋ', 'ੋ',
  2204.         'ੌ', 'ੌ', '੍', '਼', '.', '\0', '\0', '\0', '\0', '\0',
  2205.         '\0', '੦', '੧', '੨', '੩', '੪', '੫', '੬', '੭', '੮',
  2206.         '੯', '\0', '\0', '\0', '\0', '\0'}, {'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2207.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2208.         'ਖ਼', 'ਗ਼', '\0', '\0', '\0', '\0', 'ਜ਼', '\0', '\0', '\0',
  2209.         '\0', '\0', 'ੜ', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2210.         '\0', 'ਫ਼', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2211.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2212.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2213.         '\0', '\0', '‌', '‍', '\0', '\0', '\0', '\0', '\0', '\0',
  2214.         '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
  2215.             ////////////////////////////////////////////////////////////////////////////
  2216.             //
  2217.             // Devanagari Table 0, Code Page (2, 0x42, 57002)
  2218.             //
  2219.             ////////////////////////////////////////////////////////////////////////////
  2220.            
  2221.             // Default Unicode Char
  2222.             // a0, a1, a2, a3, a4, a5, a6, a7,
  2223.             // a8, a9, aa, ab, ac, ad, ae, af,
  2224.             // b0, b1, b2, b3, b4, b5, b6, b7,
  2225.             // b8, b9, ba, bb, bc, bd, be, bf,
  2226.             // c0, c1, c2, c3, c4, c5, c6, c7,
  2227.             // c8, c9, ca, cb, cc, cd, ce, cf,
  2228.             // d0, d1, d2, d3, d4, d5, d6, d7,
  2229.             // d8, d9, da, db, dc, dd, de, df,
  2230.             // e0, e1, e2, e3, e4, e5, e6, e7,
  2231.             // e8, e9, ea, eb, ec, ed, ee, ef,
  2232.             // f0, f1, f2, f3, f4, f5, f6, f7,
  2233.             // f8, f9, fa, fb, fc, fd, fe, ff
  2234.            
  2235.             // Alternate Unicode Char & Flags
  2236.             // a0, a1, a2, a3, a4, a5, a6, a7,
  2237.             // a8, a9, aa, ab, ac, ad, ae, af,
  2238.             // b0, b1, b2, b3, b4, b5, b6, b7,
  2239.             // b8, b9, ba, bb, bc, bd, be, bf,
  2240.             // c0, c1, c2, c3, c4, c5, c6, c7,
  2241.             // c8, c9, ca, cb, cc, cd, ce, cf,
  2242.             // d0, d1, d2, d3, d4, d5, d6, d7,
  2243.             // d8, d9, da, db, dc, dd, de, df,
  2244.             // e0, e1, e2, e3, e4, e5, e6, e7,
  2245.             // e8, e9, ea, eb, ec, ed, ee, ef,
  2246.             // f0, f1, f2, f3, f4, f5, f6, f7,
  2247.             // f8, f9, fa, fb, fc, fd, fe, ff
  2248.            
  2249.             ////////////////////////////////////////////////////////////////////////////
  2250.             //
  2251.             // Bengali & Assemese Table 1', Code Pages (3, '43', 57003 & 6', '46', 57006)
  2252.             //
  2253.             ////////////////////////////////////////////////////////////////////////////
  2254.            
  2255.             // Default Unicode Char
  2256.             // a0, a1, a2, a3, a4, a5, a6, a7,
  2257.             // a8, a9, aa, ab, ac, ad, ae, af,
  2258.             // b0, b1, b2, b3, b4, b5, b6, b7,
  2259.             // b8, b9, ba, bb, bc, bd, be, bf,
  2260.             // c0, c1, c2, c3, c4, c5, c6, c7,
  2261.             // c8, c9, ca, cb, cc, cd, ce, cf,
  2262.             // d0, d1, d2, d3, d4, d5, d6, d7,
  2263.             // d8, d9, da, db, dc, dd, de, df,
  2264.             // e0, e1, e2, e3, e4, e5, e6, e7,
  2265.             // e8, e9, ea, eb, ec, ed, ee, ef,
  2266.             // f0, f1, f2, f3, f4, f5, f6, f7,
  2267.             // f8, f9, fa, fb, fc, fd, fe, ff
  2268.            
  2269.             // Alternate Unicode Char & Flags
  2270.             // a0, a1, a2, a3, a4, a5, a6, a7,
  2271.             // a8, a9, aa, ab, ac, ad, ae, af,
  2272.             // b0, b1, b2, b3, b4, b5, b6, b7,
  2273.             // b8, b9, ba, bb, bc, bd, be, bf,
  2274.             // c0, c1, c2, c3, c4, c5, c6, c7,
  2275.             // c8, c9, ca, cb, cc, cd, ce, cf,
  2276.             // d0, d1, d2, d3, d4, d5, d6, d7,
  2277.             // d8, d9, da, db, dc, dd, de, df,
  2278.             // e0, e1, e2, e3, e4, e5, e6, e7,
  2279.             // e8, e9, ea, eb, ec, ed, ee, ef,
  2280.             // f0, f1, f2, f3, f4, f5, f6, f7,
  2281.             // f8, f9, fa, fb, fc, fd, fe, ff
  2282.            
  2283.             ////////////////////////////////////////////////////////////////////////////
  2284.             //
  2285.             // Tamil Table 2', Code Page (4, '44', 57004)
  2286.             //
  2287.             ////////////////////////////////////////////////////////////////////////////
  2288.            
  2289.             // Default Unicode Char
  2290.             // a0, a1, a2, a3, a4, a5, a6, a7,
  2291.             // a8, a9, aa, ab, ac, ad, ae, af,
  2292.             // b0, b1, b2, b3, b4, b5, b6, b7,
  2293.             // b8, b9, ba, bb, bc, bd, be, bf,
  2294.             // c0, c1, c2, c3, c4, c5, c6, c7,
  2295.             // c8, c9, ca, cb, cc, cd, ce, cf,
  2296.             // d0, d1, d2, d3, d4, d5, d6, d7,
  2297.             // d8, d9, da, db, dc, dd, de, df,
  2298.             // e0, e1, e2, e3, e4, e5, e6, e7,
  2299.             // e8, e9, ea, eb, ec, ed, ee, ef,
  2300.             // f0, f1, f2, f3, f4, f5, f6, f7,
  2301.             // f8, f9, fa, fb, fc, fd, fe, ff
  2302.            
  2303.             // Alternate Unicode Char & Flags
  2304.             // a0, a1, a2, a3, a4, a5, a6, a7,
  2305.             // a8, a9, aa, ab, ac, ad, ae, af,
  2306.             // b0, b1, b2, b3, b4, b5, b6, b7,
  2307.             // b8, b9, ba, bb, bc, bd, be, bf,
  2308.             // c0, c1, c2, c3, c4, c5, c6, c7,
  2309.             // c8, c9, ca, cb, cc, cd, ce, cf,
  2310.             // d0, d1, d2, d3, d4, d5, d6, d7,
  2311.             // d8, d9, da, db, dc, dd, de, df,
  2312.             // e0, e1, e2, e3, e4, e5, e6, e7,
  2313.             // e8, e9, ea, eb, ec, ed, ee, ef,
  2314.             // f0, f1, f2, f3, f4, f5, f6, f7,
  2315.             // f8, f9, fa, fb, fc, fd, fe, ff
  2316.            
  2317.             ////////////////////////////////////////////////////////////////////////////
  2318.             //
  2319.             // Telugu Table 3', Code Page (5, '45', 57005)
  2320.             //
  2321.             ////////////////////////////////////////////////////////////////////////////
  2322.            
  2323.             // Default Unicode Char
  2324.             // a0, a1, a2, a3, a4, a5, a6, a7,
  2325.             // a8, a9, aa, ab, ac, ad, ae, af,
  2326.             // b0, b1, b2, b3, b4, b5, b6, b7,
  2327.             // b8, b9, ba, bb, bc, bd, be, bf,
  2328.             // c0, c1, c2, c3, c4, c5, c6, c7,
  2329.             // c8, c9, ca, cb, cc, cd, ce, cf,
  2330.             // d0, d1, d2, d3, d4, d5, d6, d7,
  2331.             // d8, d9, da, db, dc, dd, de, df,
  2332.             // e0, e1, e2, e3, e4, e5, e6, e7,
  2333.             // e8, e9, ea, eb, ec, ed, ee, ef,
  2334.             // f0, f1, f2, f3, f4, f5, f6, f7,
  2335.             // f8, f9, fa, fb, fc, fd, fe, ff
  2336.            
  2337.             // Alternate Unicode Char & Flags
  2338.             // a0, a1, a2, a3, a4, a5, a6, a7,
  2339.             // a8, a9, aa, ab, ac, ad, ae, af,
  2340.             // b0, b1, b2, b3, b4, b5, b6, b7,
  2341.             // b8, b9, ba, bb, bc, bd, be, bf,
  2342.             // c0, c1, c2, c3, c4, c5, c6, c7,
  2343.             // c8, c9, ca, cb, cc, cd, ce, cf,
  2344.             // d0, d1, d2, d3, d4, d5, d6, d7,
  2345.             // d8, d9, da, db, dc, dd, de, df,
  2346.             // e0, e1, e2, e3, e4, e5, e6, e7,
  2347.             // e8, e9, ea, eb, ec, ed, ee, ef,
  2348.             // f0, f1, f2, f3, f4, f5, f6, f7,
  2349.             // f8, f9, fa, fb, fc, fd, fe, ff
  2350.            
  2351.             ////////////////////////////////////////////////////////////////////////////
  2352.             //
  2353.             // Oriya Table 4', Code Page (7, '47', 57007)
  2354.             //
  2355.             ////////////////////////////////////////////////////////////////////////////
  2356.            
  2357.             // Default Unicode Char
  2358.             // a0, a1, a2, a3, a4, a5, a6, a7,
  2359.             // a8, a9, aa, ab, ac, ad, ae, af,
  2360.             // b0, b1, b2, b3, b4, b5, b6, b7,
  2361.             // b8, b9, ba, bb, bc, bd, be, bf,
  2362.             // c0, c1, c2, c3, c4, c5, c6, c7,
  2363.             // c8, c9, ca, cb, cc, cd, ce, cf,
  2364.             // d0, d1, d2, d3, d4, d5, d6, d7,
  2365.             // d8, d9, da, db, dc, dd, de, df,
  2366.             // e0, e1, e2, e3, e4, e5, e6, e7,
  2367.             // e8, e9, ea, eb, ec, ed, ee, ef,
  2368.             // f0, f1, f2, f3, f4, f5, f6, f7,
  2369.             // f8, f9, fa, fb, fc, fd, fe, ff
  2370.            
  2371.             // Alternate Unicode Char & Flags
  2372.             // a0, a1, a2, a3, a4, a5, a6, a7,
  2373.             // a8, a9, aa, ab, ac, ad, ae, af,
  2374.             // b0, b1, b2, b3, b4, b5, b6, b7,
  2375.             // b8, b9, ba, bb, bc, bd, be, bf,
  2376.             // c0, c1, c2, c3, c4, c5, c6, c7,
  2377.             // c8, c9, ca, cb, cc, cd, ce, cf,
  2378.             // d0, d1, d2, d3, d4, d5, d6, d7,
  2379.             // d8, d9, da, db, dc, dd, de, df,
  2380.             // e0, e1, e2, e3, e4, e5, e6, e7,
  2381.             // e8, e9, ea, eb, ec, ed, ee, ef,
  2382.             // f0, f1, f2, f3, f4, f5, f6, f7,
  2383.             // f8, f9, fa, fb, fc, fd, fe, ff
  2384.            
  2385.             ////////////////////////////////////////////////////////////////////////////
  2386.             //
  2387.             // Kannada Table 5', Code Page (8, '48', 57008)
  2388.             //
  2389.             ////////////////////////////////////////////////////////////////////////////
  2390.            
  2391.             // Default Unicode Char
  2392.             // a0, a1, a2, a3, a4, a5, a6, a7,
  2393.             // a8, a9, aa, ab, ac, ad, ae, af,
  2394.             // b0, b1, b2, b3, b4, b5, b6, b7,
  2395.             // b8, b9, ba, bb, bc, bd, be, bf,
  2396.             // c0, c1, c2, c3, c4, c5, c6, c7,
  2397.             // c8, c9, ca, cb, cc, cd, ce, cf,
  2398.             // d0, d1, d2, d3, d4, d5, d6, d7,
  2399.             // d8, d9, da, db, dc, dd, de, df,
  2400.             // e0, e1, e2, e3, e4, e5, e6, e7,
  2401.             // e8, e9, ea, eb, ec, ed, ee, ef,
  2402.             // f0, f1, f2, f3, f4, f5, f6, f7,
  2403.             // f8, f9, fa, fb, fc, fd, fe, ff
  2404.            
  2405.             // Alternate Unicode Char & Flags
  2406.             // a0, a1, a2, a3, a4, a5, a6, a7,
  2407.             // a8, a9, aa, ab, ac, ad, ae, af,
  2408.             // b0, b1, b2, b3, b4, b5, b6, b7,
  2409.             // b8, b9, ba, bb, bc, bd, be, bf,
  2410.             // c0, c1, c2, c3, c4, c5, c6, c7,
  2411.             // c8, c9, ca, cb, cc, cd, ce, cf,
  2412.             // d0, d1, d2, d3, d4, d5, d6, d7,
  2413.             // d8, d9, da, db, dc, dd, de, df,
  2414.             // e0, e1, e2, e3, e4, e5, e6, e7,
  2415.             // e8, e9, ea, eb, ec, ed, ee, ef,
  2416.             // f0, f1, f2, f3, f4, f5, f6, f7,
  2417.             // f8, f9, fa, fb, fc, fd, fe, ff
  2418.            
  2419.             ////////////////////////////////////////////////////////////////////////////
  2420.             //
  2421.             // Malayalam Table 6', Code Page (9, '49', 57009)
  2422.             //
  2423.             ////////////////////////////////////////////////////////////////////////////
  2424.            
  2425.             // Default Unicode Char
  2426.             // a0, a1, a2, a3, a4, a5, a6, a7,
  2427.             // a8, a9, aa, ab, ac, ad, ae, af,
  2428.             // b0, b1, b2, b3, b4, b5, b6, b7,
  2429.             // b8, b9, ba, bb, bc, bd, be, bf,
  2430.             // c0, c1, c2, c3, c4, c5, c6, c7,
  2431.             // c8, c9, ca, cb, cc, cd, ce, cf,
  2432.             // d0, d1, d2, d3, d4, d5, d6, d7,
  2433.             // d8, d9, da, db, dc, dd, de, df,
  2434.             // e0, e1, e2, e3, e4, e5, e6, e7,
  2435.             // e8, e9, ea, eb, ec, ed, ee, ef,
  2436.             // f0, f1, f2, f3, f4, f5, f6, f7,
  2437.             // f8, f9, fa, fb, fc, fd, fe, ff
  2438.            
  2439.             // Alternate Unicode Char & Flags
  2440.             // a0, a1, a2, a3, a4, a5, a6, a7,
  2441.             // a8, a9, aa, ab, ac, ad, ae, af,
  2442.             // b0, b1, b2, b3, b4, b5, b6, b7,
  2443.             // b8, b9, ba, bb, bc, bd, be, bf,
  2444.             // c0, c1, c2, c3, c4, c5, c6, c7,
  2445.             // c8, c9, ca, cb, cc, cd, ce, cf,
  2446.             // d0, d1, d2, d3, d4, d5, d6, d7,
  2447.             // d8, d9, da, db, dc, dd, de, df,
  2448.             // e0, e1, e2, e3, e4, e5, e6, e7,
  2449.             // e8, e9, ea, eb, ec, ed, ee, ef,
  2450.             // f0, f1, f2, f3, f4, f5, f6, f7,
  2451.             // f8, f9, fa, fb, fc, fd, fe, ff
  2452.            
  2453.             ////////////////////////////////////////////////////////////////////////////
  2454.             //
  2455.             // Gujarati Table 7', Code Page (10', '4a', 57010)
  2456.             //
  2457.             ////////////////////////////////////////////////////////////////////////////
  2458.            
  2459.             // Default Unicode Char
  2460.             // a0, a1, a2, a3, a4, a5, a6, a7,
  2461.             // a8, a9, aa, ab, ac, ad, ae, af,
  2462.             // b0, b1, b2, b3, b4, b5, b6, b7,
  2463.             // b8, b9, ba, bb, bc, bd, be, bf,
  2464.             // c0, c1, c2, c3, c4, c5, c6, c7,
  2465.             // c8, c9, ca, cb, cc, cd, ce, cf,
  2466.             // d0, d1, d2, d3, d4, d5, d6, d7,
  2467.             // d8, d9, da, db, dc, dd, de, df,
  2468.             // e0, e1, e2, e3, e4, e5, e6, e7,
  2469.             // e8, e9, ea, eb, ec, ed, ee, ef,
  2470.             // f0, f1, f2, f3, f4, f5, f6, f7,
  2471.             // f8, f9, fa, fb, fc, fd, fe, ff
  2472.            
  2473.             // Alternate Unicode Char & Flags
  2474.             // a0, a1, a2, a3, a4, a5, a6, a7,
  2475.             // a8, a9, aa, ab, ac, ad, ae, af,
  2476.             // b0, b1, b2, b3, b4, b5, b6, b7,
  2477.             // b8, b9, ba, bb, bc, bd, be, bf,
  2478.             // c0, c1, c2, c3, c4, c5, c6, c7,
  2479.             // c8, c9, ca, cb, cc, cd, ce, cf,
  2480.             // d0, d1, d2, d3, d4, d5, d6, d7,
  2481.             // d8, d9, da, db, dc, dd, de, df,
  2482.             // e0, e1, e2, e3, e4, e5, e6, e7,
  2483.             // e8, e9, ea, eb, ec, ed, ee, ef,
  2484.             // f0, f1, f2, f3, f4, f5, f6, f7,
  2485.             // f8, f9, fa, fb, fc, fd, fe, ff
  2486.            
  2487.             ////////////////////////////////////////////////////////////////////////////
  2488.             //
  2489.             // Punjabi (Gurmukhi) Table 8', Code Page (11', '4b', 57011)
  2490.             //
  2491.             ////////////////////////////////////////////////////////////////////////////
  2492.            
  2493.             // Default Unicode Char
  2494.             // a0, a1, a2, a3, a4, a5, a6, a7,
  2495.             // a8, a9, aa, ab, ac, ad, ae, af,
  2496.             // b0, b1, b2, b3, b4, b5, b6, b7,
  2497.             // b8, b9, ba, bb, bc, bd, be, bf,
  2498.             // c0, c1, c2, c3, c4, c5, c6, c7,
  2499.             // c8, c9, ca, cb, cc, cd, ce, cf,
  2500.             // d0, d1, d2, d3, d4, d5, d6, d7,
  2501.             // d8, d9, da, db, dc, dd, de, df,
  2502.             // e0, e1, e2, e3, e4, e5, e6, e7,
  2503.             // e8, e9, ea, eb, ec, ed, ee, ef,
  2504.             // f0, f1, f2, f3, f4, f5, f6, f7,
  2505.             // f8, f9, fa, fb, fc, fd, fe, ff
  2506.            
  2507.             // Alternate Unicode Char & Flags
  2508.             // a0, a1, a2, a3, a4, a5, a6, a7,
  2509.             // a8, a9, aa, ab, ac, ad, ae, af,
  2510.             // b0, b1, b2, b3, b4, b5, b6, b7,
  2511.             // b8, b9, ba, bb, bc, bd, be, bf,
  2512.             // c0, c1, c2, c3, c4, c5, c6, c7,
  2513.             // c8, c9, ca, cb, cc, cd, ce, cf,
  2514.             // d0, d1, d2, d3, d4, d5, d6, d7,
  2515.             // d8, d9, da, db, dc, dd, de, df,
  2516.             // e0, e1, e2, e3, e4, e5, e6, e7,
  2517.             // e8, e9, ea, eb, ec, ed, ee, ef,
  2518.             // f0, f1, f2, f3, f4, f5, f6, f7,
  2519.             // f8, f9, fa, fb, fc, fd, fe, ff
  2520.         '\0', '\0', '\0', '\0', '\0', '\0'}}};
  2521.     }
  2522.    
  2523. }

Developer Fusion