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

  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. namespace System.Text
  16. {
  17.     using System;
  18.     using System.Globalization;
  19.     using System.Runtime.InteropServices;
  20.     using System.Security;
  21.     using System.Collections;
  22.     using System.Runtime.CompilerServices;
  23.     using System.Runtime.Serialization;
  24.     using System.Security.Permissions;
  25.    
  26.    
  27.     //
  28.     // Latin1Encoding is a simple override to optimize the GetString version of Latin1Encoding.
  29.     // because of the best fit cases we can't do this when encoding the string, only when decoding
  30.     //
  31.     [Serializable()]
  32.     internal class Latin1Encoding : EncodingNLS, ISerializable
  33.     {
  34.         // We only use the best-fit table, of which ASCII is a superset for us.
  35.         public Latin1Encoding() : base(Encoding.ISO_8859_1)
  36.         {
  37.         }
  38.        
  39.         // Constructor called by serialization.
  40.         // Note: We use the base GetObjectData however
  41.         internal Latin1Encoding(SerializationInfo info, StreamingContext context) : base(Encoding.ISO_8859_1)
  42.         {
  43.             // Set up our base, also throws if info was empty
  44.             DeserializeEncoding(info, context);
  45.            
  46.         }
  47.        
  48.         // ISerializable implementation, serialize it as a CodePageEncoding
  49.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)]
  50.         void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
  51.         {
  52.             // Make sure to get teh base stuff too This throws if info is null
  53.             SerializeEncoding(info, context);
  54.             BCLDebug.Assert(info != null, "[Latin1Encoding.GetObjectData] Expected null info to throw");
  55.            
  56.             info.AddValue("CodePageEncoding+maxCharSize", 1);
  57.            
  58.             info.AddValue("CodePageEncoding+m_codePage", this.CodePage);
  59.             info.AddValue("CodePageEncoding+dataItem", (CodePageDataItem)null);
  60.         }
  61.        
  62.         // GetByteCount
  63.         // Note: We start by assuming that the output will be the same as count. Having
  64.         // an encoder or fallback may change that assumption
  65.         unsafe internal override int GetByteCount(char* chars, int charCount, EncoderNLS encoder)
  66.         {
  67.             // Just need to ASSERT, this is called by something else internal that checked parameters already
  68.             BCLDebug.Assert(charCount >= 0, "[Latin1Encoding.GetByteCount]count is negative");
  69.             BCLDebug.Assert(chars != null, "[Latin1Encoding.GetByteCount]chars is null");
  70.            
  71.             // Assert because we shouldn't be able to have a null encoder.
  72.             BCLDebug.Assert(encoderFallback != null, "[Latin1Encoding.GetByteCount]Attempting to use null fallback encoder");
  73.            
  74.             char charLeftOver = (char)0;
  75.            
  76.             // If we have an encoder AND we aren't using default fallback,
  77.             // then we may have a complicated count.
  78.             EncoderReplacementFallback fallback;
  79.             if (encoder != null) {
  80.                 charLeftOver = encoder.charLeftOver;
  81.                 BCLDebug.Assert(charLeftOver == 0 || Char.IsHighSurrogate(charLeftOver), "[Latin1Encoding.GetByteCount]leftover character should be high surrogate");
  82.                
  83.                 fallback = encoder.Fallback as EncoderReplacementFallback;
  84.                
  85.                 // Verify that we have no fallbackbuffer, for Latin1 its always empty, so just assert
  86.                 BCLDebug.Assert(!encoder.m_throwOnOverflow || !encoder.InternalHasFallbackBuffer || encoder.FallbackBuffer.Remaining == 0, "[Latin1CodePageEncoding.GetByteCount]Expected empty fallback buffer");
  87.             }
  88.             else
  89.                 fallback = this.EncoderFallback as EncoderReplacementFallback;
  90.            
  91.             if ((fallback != null && fallback.MaxCharCount == 1))/* || bIsBestFit*/ {
  92.                 // Replacement fallback encodes surrogate pairs as two ?? (or two whatever), so return size is always
  93.                 // same as input size.
  94.                 // Note that no existing SBCS code pages map code points to supplimentary characters, so this is easy.
  95.                
  96.                 // We could however have 1 extra byte if the last call had an encoder and a funky fallback and
  97.                 // if we don't use the funky fallback this time.
  98.                
  99.                 // Do we have an extra char left over from last time?
  100.                 if (charLeftOver > 0)
  101.                     charCount++;
  102.                
  103.                 return (charCount);
  104.             }
  105.            
  106.             // Count is more complicated if you have a funky fallback
  107.             // For fallback we may need a fallback buffer, we know we're not default fallback
  108.             int byteCount = 0;
  109.            
  110.             // Start by assuming default count, then +/- for fallback characters
  111.             char* charEnd = chars + charCount;
  112.            
  113.             // For fallback we may need a fallback buffer, we know we aren't default fallback.
  114.             EncoderFallbackBuffer fallbackBuffer = null;
  115.            
  116.             // We may have a left over character from last time, try and process it.
  117.             if (charLeftOver > 0) {
  118.                 // Initialize the buffer
  119.                 BCLDebug.Assert(encoder != null, "[Latin1Encoding.GetByteCount]Expected encoder if we have charLeftOver");
  120.                 fallbackBuffer = encoder.FallbackBuffer;
  121.                 fallbackBuffer.InternalInitialize(chars, charEnd, encoder, false);
  122.                
  123.                 // Since left over char was a surrogate, it'll have to be fallen back.
  124.                 // Get Fallback
  125.                 // This will fallback a pair if *chars is a low surrogate
  126.                 fallbackBuffer.InternalFallback(charLeftOver, ref chars);
  127.             }
  128.            
  129.             // Now we may have fallback char[] already from the encoder
  130.            
  131.             // Go ahead and do it, including the fallback.
  132.             char ch;
  133.             while ((ch = (fallbackBuffer == null) ? '\0' : fallbackBuffer.InternalGetNextChar()) != 0 || chars < charEnd) {
  134.                 // First unwind any fallback
  135.                 if (ch == 0) {
  136.                     // No fallback, just get next char
  137.                     ch = *chars;
  138.                     chars++;
  139.                 }
  140.                
  141.                 // Check for fallback, this'll catch surrogate pairs too.
  142.                 // no chars >= 0x100 are allowed.
  143.                 if (ch > 255) {
  144.                     // Initialize the buffer
  145.                     if (fallbackBuffer == null) {
  146.                         if (encoder == null)
  147.                             fallbackBuffer = this.encoderFallback.CreateFallbackBuffer();
  148.                         else
  149.                             fallbackBuffer = encoder.FallbackBuffer;
  150.                         fallbackBuffer.InternalInitialize(charEnd - charCount, charEnd, encoder, false);
  151.                     }
  152.                    
  153.                     // Get Fallback
  154.                     fallbackBuffer.InternalFallback(ch, ref chars);
  155.                     continue;
  156.                 }
  157.                
  158.                 // We'll use this one
  159.                 byteCount++;
  160.             }
  161.            
  162.             BCLDebug.Assert(fallbackBuffer == null || fallbackBuffer.Remaining == 0, "[Latin1Encoding.GetByteCount]Expected Empty fallback buffer");
  163.            
  164.             return byteCount;
  165.         }
  166.        
  167.         unsafe internal override int GetBytes(char* chars, int charCount, byte* bytes, int byteCount, EncoderNLS encoder)
  168.         {
  169.             // Just need to ASSERT, this is called by something else internal that checked parameters already
  170.             BCLDebug.Assert(bytes != null, "[Latin1Encoding.GetBytes]bytes is null");
  171.             BCLDebug.Assert(byteCount >= 0, "[Latin1Encoding.GetBytes]byteCount is negative");
  172.             BCLDebug.Assert(chars != null, "[Latin1Encoding.GetBytes]chars is null");
  173.             BCLDebug.Assert(charCount >= 0, "[Latin1Encoding.GetBytes]charCount is negative");
  174.            
  175.             // Assert because we shouldn't be able to have a null encoder.
  176.             BCLDebug.Assert(encoderFallback != null, "[Latin1Encoding.GetBytes]Attempting to use null encoder fallback");
  177.            
  178.             // Get any left over characters & check fast or slower fallback type
  179.             char charLeftOver = (char)0;
  180.             EncoderReplacementFallback fallback = null;
  181.             if (encoder != null) {
  182.                 charLeftOver = encoder.charLeftOver;
  183.                 fallback = encoder.Fallback as EncoderReplacementFallback;
  184.                 BCLDebug.Assert(charLeftOver == 0 || Char.IsHighSurrogate(charLeftOver), "[Latin1Encoding.GetBytes]leftover character should be high surrogate");
  185.                
  186.                 // Verify that we have no fallbackbuffer, for ASCII its always empty, so just assert
  187.                 BCLDebug.Assert(!encoder.m_throwOnOverflow || !encoder.InternalHasFallbackBuffer || encoder.FallbackBuffer.Remaining == 0, "[Latin1CodePageEncoding.GetBytes]Expected empty fallback buffer");
  188.             }
  189.             else {
  190.                 fallback = this.EncoderFallback as EncoderReplacementFallback;
  191.             }
  192.            
  193.             // prepare our end
  194.             char* charEnd = chars + charCount;
  195.             byte* byteStart = bytes;
  196.             char* charStart = chars;
  197.            
  198.             // See if we do the fast default or slightly slower fallback
  199.             if (fallback != null && fallback.MaxCharCount == 1) {
  200.                 // Fast version
  201.                 char cReplacement = fallback.DefaultString[0];
  202.                
  203.                 // Check for replacements in range, otherwise fall back to slow version.
  204.                 if (cReplacement <= (char)255) {
  205.                     // We should have exactly as many output bytes as input bytes, unless there's a left
  206.                     // over character, in which case we may need one more.
  207.                    
  208.                     // If we had a left over character will have to add a ? (This happens if they had a funky
  209.                     // fallback last time, but not this time.) (We can't spit any out though
  210.                     // because with fallback encoder each surrogate is treated as a seperate code point)
  211.                     if (charLeftOver > 0) {
  212.                         // Have to have room
  213.                         // Throw even if doing no throw version because this is just 1 char,
  214.                         // so buffer will never be big enough
  215.                         if (byteCount == 0)
  216.                             ThrowBytesOverflow(encoder, true);
  217.                        
  218.                         // This'll make sure we still have more room and also make sure our return value is correct.
  219.                         *(bytes++) = (byte)cReplacement;
  220.                         byteCount--;
  221.                         // We used one of the ones we were counting.
  222.                     }
  223.                    
  224.                     // This keeps us from overrunning our output buffer
  225.                     if (byteCount < charCount) {
  226.                         // Throw or make buffer smaller?
  227.                         ThrowBytesOverflow(encoder, byteCount < 1);
  228.                        
  229.                         // Just use what we can
  230.                         charEnd = chars + byteCount;
  231.                     }
  232.                    
  233.                     // We just do a quick copy
  234.                     while (chars < charEnd) {
  235.                         char ch2 = *(chars++);
  236.                         if (ch2 > 255)
  237.                             *(bytes++) = (byte)cReplacement;
  238.                         else
  239.                             *(bytes++) = (byte)ch2;
  240.                     }
  241.                    
  242.                     // Clear encoder
  243.                     if (encoder != null) {
  244.                         encoder.charLeftOver = (char)0;
  245.                         encoder.m_charsUsed = (int)(chars - charStart);
  246.                     }
  247.                     return (int)(bytes - byteStart);
  248.                 }
  249.             }
  250.            
  251.             // Slower version, have to do real fallback.
  252.            
  253.             // prepare our end
  254.             byte* byteEnd = bytes + byteCount;
  255.            
  256.             // For fallback we may need a fallback buffer, we know we aren't default fallback, create & init it
  257.             EncoderFallbackBuffer fallbackBuffer = null;
  258.            
  259.             // We may have a left over character from last time, try and process it.
  260.             if (charLeftOver > 0) {
  261.                 // Since left over char was a surrogate, it'll have to be fallen back.
  262.                 // Get Fallback
  263.                 BCLDebug.Assert(encoder != null, "[Latin1Encoding.GetBytes]Expected encoder if we have charLeftOver");
  264.                 fallbackBuffer = encoder.FallbackBuffer;
  265.                 fallbackBuffer.InternalInitialize(chars, charEnd, encoder, true);
  266.                
  267.                 // Since left over char was a surrogate, it'll have to be fallen back.
  268.                 // Get Fallback
  269.                 // This will fallback a pair if *chars is a low surrogate
  270.                 fallbackBuffer.InternalFallback(charLeftOver, ref chars);
  271.                 if (fallbackBuffer.Remaining > byteEnd - bytes) {
  272.                     // Throw it, if we don't have enough for this we never will
  273.                     ThrowBytesOverflow(encoder, true);
  274.                 }
  275.             }
  276.            
  277.             // Now we may have fallback char[] already from the encoder fallback above
  278.            
  279.             // Go ahead and do it, including the fallback.
  280.             char ch;
  281.             while ((ch = (fallbackBuffer == null) ? '\0' : fallbackBuffer.InternalGetNextChar()) != 0 || chars < charEnd) {
  282.                 // First unwind any fallback
  283.                 if (ch == 0) {
  284.                     // No fallback, just get next char
  285.                     ch = *chars;
  286.                     chars++;
  287.                 }
  288.                
  289.                 // Check for fallback, this'll catch surrogate pairs too.
  290.                 // All characters >= 0x100 must fall back.
  291.                 if (ch > 255) {
  292.                     // Initialize the buffer
  293.                     if (fallbackBuffer == null) {
  294.                         if (encoder == null)
  295.                             fallbackBuffer = this.encoderFallback.CreateFallbackBuffer();
  296.                         else
  297.                             fallbackBuffer = encoder.FallbackBuffer;
  298.                         fallbackBuffer.InternalInitialize(charEnd - charCount, charEnd, encoder, true);
  299.                     }
  300.                    
  301.                     // Get Fallback
  302.                     fallbackBuffer.InternalFallback(ch, ref chars);
  303.                    
  304.                     // Make sure we have enough room. Each fallback char will be 1 output char
  305.                     // (or else cause a recursion exception)
  306.                     if (fallbackBuffer.Remaining > byteEnd - bytes) {
  307.                         // Didn't use this char, throw it. Chars should've advanced by now
  308.                         // If we had encoder fallback data it would've thrown before the loop
  309.                         BCLDebug.Assert(chars > charStart, "[Latin1Encoding.GetBytes]Expected chars to have advanced (fallback case)");
  310.                         chars--;
  311.                         fallbackBuffer.InternalReset();
  312.                        
  313.                         // Throw it
  314.                         ThrowBytesOverflow(encoder, chars == charStart);
  315.                         break;
  316.                     }
  317.                    
  318.                     continue;
  319.                 }
  320.                
  321.                 // We'll use this one
  322.                 // Bounds check
  323.                 if (bytes >= byteEnd) {
  324.                     // didn't use this char, we'll throw or use buffer
  325.                     BCLDebug.Assert(fallbackBuffer == null || fallbackBuffer.bFallingBack == false, "[Latin1Encoding.GetBytes]Expected fallback to have throw initially if insufficient space");
  326.                     if (fallbackBuffer == null || fallbackBuffer.bFallingBack == false) {
  327.                         BCLDebug.Assert(chars > charStart, "[Latin1Encoding.GetBytes]Expected chars to have advanced (fallback case)");
  328.                         chars--;
  329.                         // don't use last char
  330.                     }
  331.                     ThrowBytesOverflow(encoder, chars == charStart);
  332.                     // throw ?
  333.                     break;
  334.                     // don't throw, stop
  335.                 }
  336.                
  337.                 // Go ahead and add it
  338.                 *bytes = unchecked((byte)ch);
  339.                 bytes++;
  340.             }
  341.            
  342.             // Need to do encoder stuff
  343.             if (encoder != null) {
  344.                 // Fallback stuck it in encoder if necessary, but we have to clear MustFlush cases
  345.                 if (fallbackBuffer != null && !fallbackBuffer.bUsedEncoder)
  346.                     // Clear it in case of MustFlush
  347.                     encoder.charLeftOver = (char)0;
  348.                
  349.                 // Set our chars used count
  350.                 encoder.m_charsUsed = (int)(chars - charStart);
  351.             }
  352.            
  353.             BCLDebug.Assert(fallbackBuffer == null || fallbackBuffer.Remaining == 0, "[Latin1Encoding.GetBytes]Expected Empty fallback buffer");
  354.            
  355.             return (int)(bytes - byteStart);
  356.         }
  357.        
  358.         // This is internal and called by something else,
  359.         unsafe internal override int GetCharCount(byte* bytes, int count, DecoderNLS decoder)
  360.         {
  361.             // Just assert, we're called internally so these should be safe, checked already
  362.             BCLDebug.Assert(bytes != null, "[Latin1Encoding.GetCharCount]bytes is null");
  363.             BCLDebug.Assert(count >= 0, "[Latin1Encoding.GetCharCount]byteCount is negative");
  364.            
  365.             // Just return length, SBCS stay the same length because they don't map to surrogate
  366.             // pairs and we don't have to fallback because all latin1Encoding code points are unicode
  367.             return count;
  368.         }
  369.        
  370.         unsafe internal override int GetChars(byte* bytes, int byteCount, char* chars, int charCount, DecoderNLS decoder)
  371.         {
  372.             // Just need to ASSERT, this is called by something else internal that checked parameters already
  373.             BCLDebug.Assert(bytes != null, "[Latin1Encoding.GetChars]bytes is null");
  374.             BCLDebug.Assert(byteCount >= 0, "[Latin1Encoding.GetChars]byteCount is negative");
  375.             BCLDebug.Assert(chars != null, "[Latin1Encoding.GetChars]chars is null");
  376.             BCLDebug.Assert(charCount >= 0, "[Latin1Encoding.GetChars]charCount is negative");
  377.            
  378.             // Need byteCount chars, otherwise too small buffer
  379.             if (charCount < byteCount) {
  380.                 // Buffer too small. Do we throw?
  381.                 ThrowCharsOverflow(decoder, charCount < 1);
  382.                
  383.                 // Don't throw, correct buffer size
  384.                 byteCount = charCount;
  385.             }
  386.            
  387.             // Do it our fast way
  388.             byte* byteEnd = bytes + byteCount;
  389.            
  390.             // Quick loop, all bytes are the same as chars, so no fallbacks for latin1
  391.             while (bytes < byteEnd) {
  392.                 *(chars) = unchecked((char)*(bytes));
  393.                 chars++;
  394.                 bytes++;
  395.             }
  396.            
  397.             // Might need to know input bytes used
  398.             if (decoder != null)
  399.                 decoder.m_bytesUsed = byteCount;
  400.            
  401.             // Converted sequence is same length as input, so output charsUsed is same as byteCount;
  402.             return byteCount;
  403.         }
  404.        
  405.         public override int GetMaxByteCount(int charCount)
  406.         {
  407.             if (charCount < 0)
  408.                 throw new ArgumentOutOfRangeException("charCount", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
  409.            
  410.             // Characters would be # of characters + 1 in case high surrogate is ? * max fallback
  411.             long byteCount = (long)charCount + 1;
  412.            
  413.             if (EncoderFallback.MaxCharCount > 1)
  414.                 byteCount *= EncoderFallback.MaxCharCount;
  415.            
  416.             // 1 to 1 for most characters. Only surrogates with fallbacks have less.
  417.            
  418.             if (byteCount > 2147483647)
  419.                 throw new ArgumentOutOfRangeException("charCount", Environment.GetResourceString("ArgumentOutOfRange_GetByteCountOverflow"));
  420.             return (int)byteCount;
  421.         }
  422.        
  423.         public override int GetMaxCharCount(int byteCount)
  424.         {
  425.             if (byteCount < 0)
  426.                 throw new ArgumentOutOfRangeException("byteCount", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
  427.            
  428.             // Just return length, SBCS stay the same length because they don't map to surrogate
  429.             long charCount = (long)byteCount;
  430.            
  431.             // 1 to 1 for most characters. Only surrogates with fallbacks have less, unknown fallbacks could be longer.
  432.             if (DecoderFallback.MaxCharCount > 1)
  433.                 charCount *= DecoderFallback.MaxCharCount;
  434.            
  435.             if (charCount > 2147483647)
  436.                 throw new ArgumentOutOfRangeException("byteCount", Environment.GetResourceString("ArgumentOutOfRange_GetCharCountOverflow"));
  437.            
  438.             return (int)charCount;
  439.         }
  440.        
  441.         // True if and only if the encoding only uses single byte code points. (Ie, ASCII, 1252, etc)
  442.         public override bool IsSingleByte {
  443.             get { return true; }
  444.         }
  445.        
  446.         public override bool IsAlwaysNormalized(NormalizationForm form)
  447.         {
  448.             // Latin-1 contains precomposed characters, so normal for Form C.
  449.             // Since some are composed, not normal for D & KD.
  450.             // Also some letters like 0x00A8 (spacing diarisis) have compatibility decompositions, so false for KD & KC.
  451.            
  452.             // Only true for form C.
  453.             return (form == NormalizationForm.FormC);
  454.         }
  455.        
  456.         // Since our best fit table is small we'll hard code it
  457.         internal override char[] GetBestFitUnicodeToBytesData()
  458.         {
  459.             // Get our best fit data
  460.             return Latin1Encoding.arrayCharBestFit;
  461.         }
  462.        
  463.         // Best fit for ASCII, and since it works for ASCII, we use it for latin1 as well.
  464.         private static readonly char[] arrayCharBestFit = {(char)256, (char)65, (char)257, (char)97, (char)258, (char)65, (char)259, (char)97, (char)260, (char)65,
  465.         (char)261, (char)97, (char)262, (char)67, (char)263, (char)99, (char)264, (char)67, (char)265, (char)99,
  466.         (char)266, (char)67, (char)267, (char)99, (char)268, (char)67, (char)269, (char)99, (char)270, (char)68,
  467.         (char)271, (char)100, (char)272, (char)68, (char)273, (char)100, (char)274, (char)69, (char)275, (char)101,
  468.         (char)276, (char)69, (char)277, (char)101, (char)278, (char)69, (char)279, (char)101, (char)280, (char)69,
  469.         (char)281, (char)101, (char)282, (char)69, (char)283, (char)101, (char)284, (char)71, (char)285, (char)103,
  470.         (char)286, (char)71, (char)287, (char)103, (char)288, (char)71, (char)289, (char)103, (char)290, (char)71,
  471.         (char)291, (char)103, (char)292, (char)72, (char)293, (char)104, (char)294, (char)72, (char)295, (char)104,
  472.         (char)296, (char)73, (char)297, (char)105, (char)298, (char)73, (char)299, (char)105, (char)300, (char)73,
  473.         (char)301, (char)105, (char)302, (char)73, (char)303, (char)105, (char)304, (char)73, (char)305, (char)105,
  474.         (char)308, (char)74, (char)309, (char)106, (char)310, (char)75, (char)311, (char)107, (char)313, (char)76,
  475.         (char)314, (char)108, (char)315, (char)76, (char)316, (char)108, (char)317, (char)76, (char)318, (char)108,
  476.         (char)321, (char)76, (char)322, (char)108, (char)323, (char)78, (char)324, (char)110, (char)325, (char)78,
  477.         (char)326, (char)110, (char)327, (char)78, (char)328, (char)110, (char)332, (char)79, (char)333, (char)111,
  478.         (char)334, (char)79, (char)335, (char)111, (char)336, (char)79, (char)337, (char)111, (char)338, (char)79,
  479.         (char)339, (char)111, (char)340, (char)82, (char)341, (char)114, (char)342, (char)82, (char)343, (char)114,
  480.         (char)344, (char)82, (char)345, (char)114, (char)346, (char)83, (char)347, (char)115, (char)348, (char)83,
  481.         (char)349, (char)115, (char)350, (char)83, (char)351, (char)115, (char)352, (char)83, (char)353, (char)115,
  482.         (char)354, (char)84, (char)355, (char)116, (char)356, (char)84, (char)357, (char)116, (char)358, (char)84,
  483.         (char)359, (char)116, (char)360, (char)85, (char)361, (char)117, (char)362, (char)85, (char)363, (char)117,
  484.         (char)364, (char)85, (char)365, (char)117, (char)366, (char)85, (char)367, (char)117, (char)368, (char)85,
  485.         (char)369, (char)117, (char)370, (char)85, (char)371, (char)117, (char)372, (char)87, (char)373, (char)119,
  486.         (char)374, (char)89, (char)375, (char)121, (char)376, (char)89, (char)377, (char)90, (char)378, (char)122,
  487.         (char)379, (char)90, (char)380, (char)122, (char)381, (char)90, (char)382, (char)122, (char)384, (char)98,
  488.         (char)393, (char)68, (char)401, (char)70, (char)402, (char)102, (char)407, (char)73, (char)410, (char)108,
  489.         (char)415, (char)79, (char)416, (char)79, (char)417, (char)111, (char)427, (char)116, (char)430, (char)84,
  490.         (char)431, (char)85, (char)432, (char)117, (char)438, (char)122, (char)461, (char)65, (char)462, (char)97,
  491.         (char)463, (char)73, (char)464, (char)105, (char)465, (char)79, (char)466, (char)111, (char)467, (char)85,
  492.         (char)468, (char)117, (char)469, (char)85, (char)470, (char)117, (char)471, (char)85, (char)472, (char)117,
  493.         (char)473, (char)85, (char)474, (char)117, (char)475, (char)85, (char)476, (char)117, (char)478, (char)65,
  494.         (char)479, (char)97, (char)484, (char)71, (char)485, (char)103, (char)486, (char)71, (char)487, (char)103,
  495.         (char)488, (char)75, (char)489, (char)107, (char)490, (char)79, (char)491, (char)111, (char)492, (char)79,
  496.         (char)493, (char)111, (char)496, (char)106, (char)609, (char)103, (char)697, (char)39, (char)698, (char)34,
  497.         (char)700, (char)39, (char)708, (char)94, (char)710, (char)94, (char)712, (char)39, (char)713, (char)63,
  498.         (char)714, (char)63, (char)715, (char)96, (char)717, (char)95, (char)730, (char)63, (char)732, (char)126,
  499.         (char)768, (char)96, (char)770, (char)94, (char)771, (char)126, (char)782, (char)34, (char)817, (char)95,
  500.         (char)818, (char)95, (char)8192, (char)32, (char)8193, (char)32, (char)8194, (char)32, (char)8195, (char)32,
  501.         (char)8196, (char)32, (char)8197, (char)32, (char)8198, (char)32, (char)8208, (char)45, (char)8209, (char)45,
  502.         (char)8211, (char)45, (char)8212, (char)45, (char)8216, (char)39, (char)8217, (char)39, (char)8218, (char)44,
  503.         (char)8220, (char)34, (char)8221, (char)34, (char)8222, (char)34, (char)8224, (char)63, (char)8225, (char)63,
  504.         (char)8226, (char)46, (char)8230, (char)46, (char)8240, (char)63, (char)8242, (char)39, (char)8245, (char)96,
  505.         (char)8249, (char)60, (char)8250, (char)62, (char)8482, (char)84, (char)65281, (char)33, (char)65282, (char)34,
  506.         (char)65283, (char)35, (char)65284, (char)36, (char)65285, (char)37, (char)65286, (char)38, (char)65287, (char)39,
  507.         (char)65288, (char)40, (char)65289, (char)41, (char)65290, (char)42, (char)65291, (char)43, (char)65292, (char)44,
  508.         (char)65293, (char)45, (char)65294, (char)46, (char)65295, (char)47, (char)65296, (char)48, (char)65297, (char)49,
  509.         (char)65298, (char)50, (char)65299, (char)51, (char)65300, (char)52, (char)65301, (char)53, (char)65302, (char)54,
  510.         (char)65303, (char)55, (char)65304, (char)56, (char)65305, (char)57, (char)65306, (char)58, (char)65307, (char)59,
  511.         (char)65308, (char)60, (char)65309, (char)61, (char)65310, (char)62, (char)65311, (char)63, (char)65312, (char)64,
  512.         (char)65313, (char)65, (char)65314, (char)66, (char)65315, (char)67, (char)65316, (char)68, (char)65317, (char)69,
  513.         (char)65318, (char)70, (char)65319, (char)71, (char)65320, (char)72, (char)65321, (char)73, (char)65322, (char)74,
  514.         (char)65323, (char)75, (char)65324, (char)76, (char)65325, (char)77, (char)65326, (char)78, (char)65327, (char)79,
  515.         (char)65328, (char)80, (char)65329, (char)81, (char)65330, (char)82, (char)65331, (char)83, (char)65332, (char)84,
  516.         (char)65333, (char)85, (char)65334, (char)86, (char)65335, (char)87, (char)65336, (char)88, (char)65337, (char)89,
  517.         (char)65338, (char)90, (char)65339, (char)91, (char)65340, (char)92, (char)65341, (char)93, (char)65342, (char)94,
  518.         (char)65343, (char)95, (char)65344, (char)96, (char)65345, (char)97, (char)65346, (char)98, (char)65347, (char)99,
  519.         (char)65348, (char)100, (char)65349, (char)101, (char)65350, (char)102, (char)65351, (char)103, (char)65352, (char)104,
  520.         (char)65353, (char)105, (char)65354, (char)106, (char)65355, (char)107, (char)65356, (char)108, (char)65357, (char)109,
  521.         (char)65358, (char)110, (char)65359, (char)111, (char)65360, (char)112, (char)65361, (char)113, (char)65362, (char)114,
  522.         (char)65363, (char)115, (char)65364, (char)116, (char)65365, (char)117, (char)65366, (char)118, (char)65367, (char)119,
  523.         (char)65368, (char)120, (char)65369, (char)121, (char)65370, (char)122, (char)65371, (char)123, (char)65372, (char)124,
  524.             // The first many are in case you wanted to use this for ASCIIEncoding, which we don't need to do any more.
  525.             // (char)0x00a0, (char)0x0020, // No-Break Space -> Space
  526.             // (char)0x00a1, (char)0x0021, // Inverted Exclamation Mark -> !
  527.             // (char)0x00a2, (char)0x0063, // Cent Sign -> c
  528.             // (char)0x00a3, (char)0x003f, // Pound Sign
  529.             // (char)0x00a4, (char)0x0024, // Currency Sign -> $
  530.             // (char)0x00a5, (char)0x0059, // Yen Sign -> Y
  531.             // (char)0x00a6, (char)0x007c, // Broken Bar -> |
  532.             // (char)0x00a7, (char)0x003f, // Section Sign
  533.             // (char)0x00a8, (char)0x003f, // Diaeresis
  534.             // (char)0x00a9, (char)0x0043, // Copyright Sign -> C
  535.             // (char)0x00aa, (char)0x0061, // Feminine Ordinal Indicator -> a
  536.             // (char)0x00ab, (char)0x003c, // Left-Pointing Double Angle Quotation Mark -> <
  537.             // (char)0x00ac, (char)0x003f, // Not Sign
  538.             // (char)0x00ad, (char)0x002d, // Soft Hyphen -> -
  539.             // (char)0x00ae, (char)0x0052, // Registered Sign -> R
  540.             // (char)0x00af, (char)0x003f, // Macron
  541.             // (char)0x00b0, (char)0x003f, // Degree Sign
  542.             // (char)0x00b1, (char)0x003f, // Plus-Minus Sign
  543.             // (char)0x00b2, (char)0x0032, // Superscript Two -> 2
  544.             // (char)0x00b3, (char)0x0033, // Superscript Three -> 3
  545.             // (char)0x00b4, (char)0x003f, // Acute Accent
  546.             // (char)0x00b5, (char)0x003f, // Micro Sign
  547.             // (char)0x00b6, (char)0x003f, // Pilcrow Sign
  548.             // (char)0x00b7, (char)0x002e, // Middle Dot -> .
  549.             // (char)0x00b8, (char)0x002c, // Cedilla -> ,
  550.             // (char)0x00b9, (char)0x0031, // Superscript One -> 1
  551.             // (char)0x00ba, (char)0x006f, // Masculine Ordinal Indicator -> o
  552.             // (char)0x00bb, (char)0x003e, // Right-Pointing Double Angle Quotation Mark -> >
  553.             // (char)0x00bc, (char)0x003f, // Vulgar Fraction One Quarter
  554.             // (char)0x00bd, (char)0x003f, // Vulgar Fraction One Half
  555.             // (char)0x00be, (char)0x003f, // Vulgar Fraction Three Quarters
  556.             // (char)0x00bf, (char)0x003f, // Inverted Question Mark
  557.             // (char)0x00c0, (char)0x0041, // Latin Capital Letter A With Grave -> A
  558.             // (char)0x00c1, (char)0x0041, // Latin Capital Letter A With Acute -> A
  559.             // (char)0x00c2, (char)0x0041, // Latin Capital Letter A With Circumflex -> A
  560.             // (char)0x00c3, (char)0x0041, // Latin Capital Letter A With Tilde -> A
  561.             // (char)0x00c4, (char)0x0041, // Latin Capital Letter A With Diaeresis -> A
  562.             // (char)0x00c5, (char)0x0041, // Latin Capital Letter A With Ring Above -> A
  563.             // (char)0x00c6, (char)0x0041, // Latin Capital Ligature Ae -> A
  564.             // (char)0x00c7, (char)0x0043, // Latin Capital Letter C With Cedilla -> C
  565.             // (char)0x00c8, (char)0x0045, // Latin Capital Letter E With Grave -> E
  566.             // (char)0x00c9, (char)0x0045, // Latin Capital Letter E With Acute -> E
  567.             // (char)0x00ca, (char)0x0045, // Latin Capital Letter E With Circumflex -> E
  568.             // (char)0x00cb, (char)0x0045, // Latin Capital Letter E With Diaeresis -> E
  569.             // (char)0x00cc, (char)0x0049, // Latin Capital Letter I With Grave -> I
  570.             // (char)0x00cd, (char)0x0049, // Latin Capital Letter I With Acute -> I
  571.             // (char)0x00ce, (char)0x0049, // Latin Capital Letter I With Circumflex -> I
  572.             // (char)0x00cf, (char)0x0049, // Latin Capital Letter I With Diaeresis -> I
  573.             // (char)0x00d0, (char)0x0044, // Latin Capital Letter Eth -> D
  574.             // (char)0x00d1, (char)0x004e, // Latin Capital Letter N With Tilde -> N
  575.             // (char)0x00d2, (char)0x004f, // Latin Capital Letter O With Grave -> O
  576.             // (char)0x00d3, (char)0x004f, // Latin Capital Letter O With Acute -> O
  577.             // (char)0x00d4, (char)0x004f, // Latin Capital Letter O With Circumflex -> O
  578.             // (char)0x00d5, (char)0x004f, // Latin Capital Letter O With Tilde -> O
  579.             // (char)0x00d6, (char)0x004f, // Latin Capital Letter O With Diaeresis -> O
  580.             // (char)0x00d7, (char)0x003f, // Multiplication Sign
  581.             // (char)0x00d8, (char)0x004f, // Latin Capital Letter O With Stroke -> O
  582.             // (char)0x00d9, (char)0x0055, // Latin Capital Letter U With Grave -> U
  583.             // (char)0x00da, (char)0x0055, // Latin Capital Letter U With Acute -> U
  584.             // (char)0x00db, (char)0x0055, // Latin Capital Letter U With Circumflex -> U
  585.             // (char)0x00dc, (char)0x0055, // Latin Capital Letter U With Diaeresis -> U
  586.             // (char)0x00dd, (char)0x0059, // Latin Capital Letter Y With Acute -> Y
  587.             // (char)0x00de, (char)0x003f, // Latin Capital Letter Thorn
  588.             // (char)0x00df, (char)0x003f, // Latin Small Letter Sharp S
  589.             // (char)0x00e0, (char)0x0061, // Latin Small Letter A With Grave -> a
  590.             // (char)0x00e1, (char)0x0061, // Latin Small Letter A With Acute -> a
  591.             // (char)0x00e2, (char)0x0061, // Latin Small Letter A With Circumflex -> a
  592.             // (char)0x00e3, (char)0x0061, // Latin Small Letter A With Tilde -> a
  593.             // (char)0x00e4, (char)0x0061, // Latin Small Letter A With Diaeresis -> a
  594.             // (char)0x00e5, (char)0x0061, // Latin Small Letter A With Ring Above -> a
  595.             // (char)0x00e6, (char)0x0061, // Latin Small Ligature Ae -> a
  596.             // (char)0x00e7, (char)0x0063, // Latin Small Letter C With Cedilla -> c
  597.             // (char)0x00e8, (char)0x0065, // Latin Small Letter E With Grave -> e
  598.             // (char)0x00e9, (char)0x0065, // Latin Small Letter E With Acute -> e
  599.             // (char)0x00ea, (char)0x0065, // Latin Small Letter E With Circumflex -> e
  600.             // (char)0x00eb, (char)0x0065, // Latin Small Letter E With Diaeresis -> e
  601.             // (char)0x00ec, (char)0x0069, // Latin Small Letter I With Grave -> i
  602.             // (char)0x00ed, (char)0x0069, // Latin Small Letter I With Acute -> i
  603.             // (char)0x00ee, (char)0x0069, // Latin Small Letter I With Circumflex -> i
  604.             // (char)0x00ef, (char)0x0069, // Latin Small Letter I With Diaeresis -> i
  605.             // (char)0x00f0, (char)0x003f, // Latin Small Letter Eth
  606.             // (char)0x00f1, (char)0x006e, // Latin Small Letter N With Tilde -> n
  607.             // (char)0x00f2, (char)0x006f, // Latin Small Letter O With Grave -> o
  608.             // (char)0x00f3, (char)0x006f, // Latin Small Letter O With Acute -> o
  609.             // (char)0x00f4, (char)0x006f, // Latin Small Letter O With Circumflex -> o
  610.             // (char)0x00f5, (char)0x006f, // Latin Small Letter O With Tilde -> o
  611.             // (char)0x00f6, (char)0x006f, // Latin Small Letter O With Diaeresis -> o
  612.             // (char)0x00f7, (char)0x003f, // Division Sign
  613.             // (char)0x00f8, (char)0x006f, // Latin Small Letter O With Stroke -> o
  614.             // (char)0x00f9, (char)0x0075, // Latin Small Letter U With Grave -> u
  615.             // (char)0x00fa, (char)0x0075, // Latin Small Letter U With Acute -> u
  616.             // (char)0x00fb, (char)0x0075, // Latin Small Letter U With Circumflex -> u
  617.             // (char)0x00fc, (char)0x0075, // Latin Small Letter U With Diaeresis -> u
  618.             // (char)0x00fd, (char)0x0079, // Latin Small Letter Y With Acute -> y
  619.             // (char)0x00fe, (char)0x003f, // Latin Small Letter Thorn
  620.             // (char)0x00ff, (char)0x0079, // Latin Small Letter Y With Diaeresis -> y
  621.             // Latin Capital Letter A With Macron -> A
  622.             // Latin Small Letter A With Macron -> a
  623.             // Latin Capital Letter A With Breve -> A
  624.             // Latin Small Letter A With Breve -> a
  625.             // Latin Capital Letter A With Ogonek -> A
  626.             // Latin Small Letter A With Ogonek -> a
  627.             // Latin Capital Letter C With Acute -> C
  628.             // Latin Small Letter C With Acute -> c
  629.             // Latin Capital Letter C With Circumflex -> C
  630.             // Latin Small Letter C With Circumflex -> c
  631.             // Latin Capital Letter C With Dot Above -> C
  632.             // Latin Small Letter C With Dot Above -> c
  633.             // Latin Capital Letter C With Caron -> C
  634.             // Latin Small Letter C With Caron -> c
  635.             // Latin Capital Letter D With Caron -> D
  636.             // Latin Small Letter D With Caron -> d
  637.             // Latin Capital Letter D With Stroke -> D
  638.             // Latin Small Letter D With Stroke -> d
  639.             // Latin Capital Letter E With Macron -> E
  640.             // Latin Small Letter E With Macron -> e
  641.             // Latin Capital Letter E With Breve -> E
  642.             // Latin Small Letter E With Breve -> e
  643.             // Latin Capital Letter E With Dot Above -> E
  644.             // Latin Small Letter E With Dot Above -> e
  645.             // Latin Capital Letter E With Ogonek -> E
  646.             // Latin Small Letter E With Ogonek -> e
  647.             // Latin Capital Letter E With Caron -> E
  648.             // Latin Small Letter E With Caron -> e
  649.             // Latin Capital Letter G With Circumflex -> G
  650.             // Latin Small Letter G With Circumflex -> g
  651.             // Latin Capital Letter G With Breve -> G
  652.             // Latin Small Letter G With Breve -> g
  653.             // Latin Capital Letter G With Dot Above -> G
  654.             // Latin Small Letter G With Dot Above -> g
  655.             // Latin Capital Letter G With Cedilla -> G
  656.             // Latin Small Letter G With Cedilla -> g
  657.             // Latin Capital Letter H With Circumflex -> H
  658.             // Latin Small Letter H With Circumflex -> h
  659.             // Latin Capital Letter H With Stroke -> H
  660.             // Latin Small Letter H With Stroke -> h
  661.             // Latin Capital Letter I With Tilde -> I
  662.             // Latin Small Letter I With Tilde -> i
  663.             // Latin Capital Letter I With Macron -> I
  664.             // Latin Small Letter I With Macron -> i
  665.             // Latin Capital Letter I With Breve -> I
  666.             // Latin Small Letter I With Breve -> i
  667.             // Latin Capital Letter I With Ogonek -> I
  668.             // Latin Small Letter I With Ogonek -> i
  669.             // Latin Capital Letter I With Dot Above -> I
  670.             // Latin Small Letter Dotless I -> i
  671.             // Latin Capital Letter J With Circumflex -> J
  672.             // Latin Small Letter J With Circumflex -> j
  673.             // Latin Capital Letter K With Cedilla -> K
  674.             // Latin Small Letter K With Cedilla -> k
  675.             // Latin Capital Letter L With Acute -> L
  676.             // Latin Small Letter L With Acute -> l
  677.             // Latin Capital Letter L With Cedilla -> L
  678.             // Latin Small Letter L With Cedilla -> l
  679.             // Latin Capital Letter L With Caron -> L
  680.             // Latin Small Letter L With Caron -> l
  681.             // Latin Capital Letter L With Stroke -> L
  682.             // Latin Small Letter L With Stroke -> l
  683.             // Latin Capital Letter N With Acute -> N
  684.             // Latin Small Letter N With Acute -> n
  685.             // Latin Capital Letter N With Cedilla -> N
  686.             // Latin Small Letter N With Cedilla -> n
  687.             // Latin Capital Letter N With Caron -> N
  688.             // Latin Small Letter N With Caron -> n
  689.             // Latin Capital Letter O With Macron -> O
  690.             // Latin Small Letter O With Macron -> o
  691.             // Latin Capital Letter O With Breve -> O
  692.             // Latin Small Letter O With Breve -> o
  693.             // Latin Capital Letter O With Double Acute -> O
  694.             // Latin Small Letter O With Double Acute -> o
  695.             // Latin Capital Ligature Oe -> O
  696.             // Latin Small Ligature Oe -> o
  697.             // Latin Capital Letter R With Acute -> R
  698.             // Latin Small Letter R With Acute -> r
  699.             // Latin Capital Letter R With Cedilla -> R
  700.             // Latin Small Letter R With Cedilla -> r
  701.             // Latin Capital Letter R With Caron -> R
  702.             // Latin Small Letter R With Caron -> r
  703.             // Latin Capital Letter S With Acute -> S
  704.             // Latin Small Letter S With Acute -> s
  705.             // Latin Capital Letter S With Circumflex -> S
  706.             // Latin Small Letter S With Circumflex -> s
  707.             // Latin Capital Letter S With Cedilla -> S
  708.             // Latin Small Letter S With Cedilla -> s
  709.             // Latin Capital Letter S With Caron -> S
  710.             // Latin Small Letter S With Caron -> s
  711.             // Latin Capital Letter T With Cedilla -> T
  712.             // Latin Small Letter T With Cedilla -> t
  713.             // Latin Capital Letter T With Caron -> T
  714.             // Latin Small Letter T With Caron -> t
  715.             // Latin Capital Letter T With Stroke -> T
  716.             // Latin Small Letter T With Stroke -> t
  717.             // Latin Capital Letter U With Tilde -> U
  718.             // Latin Small Letter U With Tilde -> u
  719.             // Latin Capital Letter U With Macron -> U
  720.             // Latin Small Letter U With Macron -> u
  721.             // Latin Capital Letter U With Breve -> U
  722.             // Latin Small Letter U With Breve -> u
  723.             // Latin Capital Letter U With Ring Above -> U
  724.             // Latin Small Letter U With Ring Above -> u
  725.             // Latin Capital Letter U With Double Acute -> U
  726.             // Latin Small Letter U With Double Acute -> u
  727.             // Latin Capital Letter U With Ogonek -> U
  728.             // Latin Small Letter U With Ogonek -> u
  729.             // Latin Capital Letter W With Circumflex -> W
  730.             // Latin Small Letter W With Circumflex -> w
  731.             // Latin Capital Letter Y With Circumflex -> Y
  732.             // Latin Small Letter Y With Circumflex -> y
  733.             // Latin Capital Letter Y With Diaeresis -> Y
  734.             // Latin Capital Letter Z With Acute -> Z
  735.             // Latin Small Letter Z With Acute -> z
  736.             // Latin Capital Letter Z With Dot Above -> Z
  737.             // Latin Small Letter Z With Dot Above -> z
  738.             // Latin Capital Letter Z With Caron -> Z
  739.             // Latin Small Letter Z With Caron -> z
  740.             // Latin Small Letter B With Stroke -> b
  741.             // Latin Capital Letter African D -> D
  742.             // Latin Capital Letter F With Hook -> F
  743.             // Latin Small Letter F With Hook -> f
  744.             // Latin Capital Letter I With Stroke -> I
  745.             // Latin Small Letter L With Bar -> l
  746.             // Latin Capital Letter O With Middle Tilde -> O
  747.             // Latin Capital Letter O With Horn -> O
  748.             // Latin Small Letter O With Horn -> o
  749.             // Latin Small Letter T With Palatal Hook -> t
  750.             // Latin Capital Letter T With Retroflex Hook -> T
  751.             // Latin Capital Letter U With Horn -> U
  752.             // Latin Small Letter U With Horn -> u
  753.             // Latin Small Letter Z With Stroke -> z
  754.             // Latin Capital Letter A With Caron -> A
  755.             // Latin Small Letter A With Caron -> a
  756.             // Latin Capital Letter I With Caron -> I
  757.             // Latin Small Letter I With Caron -> i
  758.             // Latin Capital Letter O With Caron -> O
  759.             // Latin Small Letter O With Caron -> o
  760.             // Latin Capital Letter U With Caron -> U
  761.             // Latin Small Letter U With Caron -> u
  762.             // Latin Capital Letter U With Diaeresis And Macron -> U
  763.             // Latin Small Letter U With Diaeresis And Macron -> u
  764.             // Latin Capital Letter U With Diaeresis And Acute -> U
  765.             // Latin Small Letter U With Diaeresis And Acute -> u
  766.             // Latin Capital Letter U With Diaeresis And Caron -> U
  767.             // Latin Small Letter U With Diaeresis And Caron -> u
  768.             // Latin Capital Letter U With Diaeresis And Grave -> U
  769.             // Latin Small Letter U With Diaeresis And Grave -> u
  770.             // Latin Capital Letter A With Diaeresis And Macron -> A
  771.             // Latin Small Letter A With Diaeresis And Macron -> a
  772.             // Latin Capital Letter G With Stroke -> G
  773.             // Latin Small Letter G With Stroke -> g
  774.             // Latin Capital Letter G With Caron -> G
  775.             // Latin Small Letter G With Caron -> g
  776.             // Latin Capital Letter K With Caron -> K
  777.             // Latin Small Letter K With Caron -> k
  778.             // Latin Capital Letter O With Ogonek -> O
  779.             // Latin Small Letter O With Ogonek -> o
  780.             // Latin Capital Letter O With Ogonek And Macron -> O
  781.             // Latin Small Letter O With Ogonek And Macron -> o
  782.             // Latin Small Letter J With Caron -> j
  783.             // Latin Small Letter Script G -> g
  784.             // Modifier Letter Prime -> '
  785.             // Modifier Letter Double Prime -> "
  786.             // Modifier Letter Apostrophe -> '
  787.             // Modifier Letter Up Arrowhead -> ^
  788.             // Modifier Letter Circumflex Accent -> ^
  789.             // Modifier Letter Vertical Line -> '
  790.             // Modifier Letter Macron
  791.             // Modifier Letter Acute Accent
  792.             // Modifier Letter Grave Accent -> `
  793.             // Modifier Letter Low Macron -> _
  794.             // Ring Above
  795.             // Small Tilde -> ~
  796.             // Combining Grave Accent -> `
  797.             // Combining Circumflex Accent -> ^
  798.             // Combining Tilde -> ~
  799.             // Combining Double Vertical Line Above -> "
  800.             // Combining Macron Below -> _
  801.             // Combining Low Line -> _
  802.             // En Quad
  803.             // Em Quad
  804.             // En Space
  805.             // Em Space
  806.             // Three-Per-Em Space
  807.             // Four-Per-Em Space
  808.             // Six-Per-Em Space
  809.             // Hyphen -> -
  810.             // Non-Breaking Hyphen -> -
  811.             // En Dash -> -
  812.             // Em Dash -> -
  813.             // Left Single Quotation Mark -> '
  814.             // Right Single Quotation Mark -> '
  815.             // Single Low-9 Quotation Mark -> ,
  816.             // Left Double Quotation Mark -> "
  817.             // Right Double Quotation Mark -> "
  818.             // Double Low-9 Quotation Mark -> "
  819.             // Dagger
  820.             // Double Dagger
  821.             // Bullet -> .
  822.             // Horizontal Ellipsis -> .
  823.             // Per Mille Sign
  824.             // Prime -> '
  825.             // Reversed Prime -> `
  826.             // Single Left-Pointing Angle Quotation Mark -> <
  827.             // Single Right-Pointing Angle Quotation Mark -> >
  828.             // Trade Mark Sign -> T
  829.             // Fullwidth Exclamation Mark -> !
  830.             // Fullwidth Quotation Mark -> "
  831.             // Fullwidth Number Sign -> #
  832.             // Fullwidth Dollar Sign -> $
  833.             // Fullwidth Percent Sign -> %
  834.             // Fullwidth Ampersand -> &
  835.             // Fullwidth Apostrophe -> '
  836.             // Fullwidth Left Parenthesis -> (
  837.             // Fullwidth Right Parenthesis -> )
  838.             // Fullwidth Asterisk -> *
  839.             // Fullwidth Plus Sign -> +
  840.             // Fullwidth Comma -> ,
  841.             // Fullwidth Hyphen-Minus -> -
  842.             // Fullwidth Full Stop -> .
  843.             // Fullwidth Solidus -> /
  844.             // Fullwidth Digit Zero -> 0
  845.             // Fullwidth Digit One -> 1
  846.             // Fullwidth Digit Two -> 2
  847.             // Fullwidth Digit Three -> 3
  848.             // Fullwidth Digit Four -> 4
  849.             // Fullwidth Digit Five -> 5
  850.             // Fullwidth Digit Six -> 6
  851.             // Fullwidth Digit Seven -> 7
  852.             // Fullwidth Digit Eight -> 8
  853.             // Fullwidth Digit Nine -> 9
  854.             // Fullwidth Colon -> :
  855.             // Fullwidth Semicolon -> ;
  856.             // Fullwidth Less-Than Sign -> <
  857.             // Fullwidth Equals Sign -> =
  858.             // Fullwidth Greater-Than Sign -> >
  859.             // Fullwidth Question Mark
  860.             // Fullwidth Commercial At -> @
  861.             // Fullwidth Latin Capital Letter A -> A
  862.             // Fullwidth Latin Capital Letter B -> B
  863.             // Fullwidth Latin Capital Letter C -> C
  864.             // Fullwidth Latin Capital Letter D -> D
  865.             // Fullwidth Latin Capital Letter E -> E
  866.             // Fullwidth Latin Capital Letter F -> F
  867.             // Fullwidth Latin Capital Letter G -> G
  868.             // Fullwidth Latin Capital Letter H -> H
  869.             // Fullwidth Latin Capital Letter I -> I
  870.             // Fullwidth Latin Capital Letter J -> J
  871.             // Fullwidth Latin Capital Letter K -> K
  872.             // Fullwidth Latin Capital Letter L -> L
  873.             // Fullwidth Latin Capital Letter M -> M
  874.             // Fullwidth Latin Capital Letter N -> N
  875.             // Fullwidth Latin Capital Letter O -> O
  876.             // Fullwidth Latin Capital Letter P -> P
  877.             // Fullwidth Latin Capital Letter Q -> Q
  878.             // Fullwidth Latin Capital Letter R -> R
  879.             // Fullwidth Latin Capital Letter S -> S
  880.             // Fullwidth Latin Capital Letter T -> T
  881.             // Fullwidth Latin Capital Letter U -> U
  882.             // Fullwidth Latin Capital Letter V -> V
  883.             // Fullwidth Latin Capital Letter W -> W
  884.             // Fullwidth Latin Capital Letter X -> X
  885.             // Fullwidth Latin Capital Letter Y -> Y
  886.             // Fullwidth Latin Capital Letter Z -> Z
  887.             // Fullwidth Left Square Bracket -> [
  888.             // Fullwidth Reverse Solidus -> \
  889.             // Fullwidth Right Square Bracket -> ]
  890.             // Fullwidth Circumflex Accent -> ^
  891.             // Fullwidth Low Line -> _
  892.             // Fullwidth Grave Accent -> `
  893.             // Fullwidth Latin Small Letter A -> a
  894.             // Fullwidth Latin Small Letter B -> b
  895.             // Fullwidth Latin Small Letter C -> c
  896.             // Fullwidth Latin Small Letter D -> d
  897.             // Fullwidth Latin Small Letter E -> e
  898.             // Fullwidth Latin Small Letter F -> f
  899.             // Fullwidth Latin Small Letter G -> g
  900.             // Fullwidth Latin Small Letter H -> h
  901.             // Fullwidth Latin Small Letter I -> i
  902.             // Fullwidth Latin Small Letter J -> j
  903.             // Fullwidth Latin Small Letter K -> k
  904.             // Fullwidth Latin Small Letter L -> l
  905.             // Fullwidth Latin Small Letter M -> m
  906.             // Fullwidth Latin Small Letter N -> n
  907.             // Fullwidth Latin Small Letter O -> o
  908.             // Fullwidth Latin Small Letter P -> p
  909.             // Fullwidth Latin Small Letter Q -> q
  910.             // Fullwidth Latin Small Letter R -> r
  911.             // Fullwidth Latin Small Letter S -> s
  912.             // Fullwidth Latin Small Letter T -> t
  913.             // Fullwidth Latin Small Letter U -> u
  914.             // Fullwidth Latin Small Letter V -> v
  915.             // Fullwidth Latin Small Letter W -> w
  916.             // Fullwidth Latin Small Letter X -> x
  917.             // Fullwidth Latin Small Letter Y -> y
  918.             // Fullwidth Latin Small Letter Z -> z
  919.             // Fullwidth Left Curly Bracket -> {
  920.             // Fullwidth Vertical Line -> |
  921.             // Fullwidth Right Curly Bracket -> }
  922.             // Fullwidth Tilde -> ~
  923.         (char)65373, (char)125, (char)65374, (char)126};
  924.     }
  925. }

Developer Fusion