Latin1Encoding.cs 53 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884
  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the MIT license.
  3. // See the LICENSE file in the project root for more information.
  4. using System;
  5. using System.Diagnostics;
  6. namespace System.Text
  7. {
  8. //
  9. // Latin1Encoding is a simple override to optimize the GetString version of Latin1Encoding.
  10. // because of the best fit cases we can't do this when encoding the string, only when decoding
  11. //
  12. internal sealed class Latin1Encoding : EncodingNLS
  13. {
  14. // Used by Encoding.Latin1 for lazy initialization
  15. // The initialization code will not be run until a static member of the class is referenced
  16. internal static readonly Latin1Encoding s_default = new Latin1Encoding();
  17. // We only use the best-fit table, of which ASCII is a superset for us.
  18. public Latin1Encoding() : base(Encoding.ISO_8859_1)
  19. {
  20. }
  21. // GetByteCount
  22. // Note: We start by assuming that the output will be the same as count. Having
  23. // an encoder or fallback may change that assumption
  24. internal override unsafe int GetByteCount(char* chars, int charCount, EncoderNLS encoder)
  25. {
  26. // Just need to ASSERT, this is called by something else internal that checked parameters already
  27. Debug.Assert(charCount >= 0, "[Latin1Encoding.GetByteCount]count is negative");
  28. Debug.Assert(chars != null, "[Latin1Encoding.GetByteCount]chars is null");
  29. // Assert because we shouldn't be able to have a null encoder.
  30. Debug.Assert(encoderFallback != null, "[Latin1Encoding.GetByteCount]Attempting to use null fallback encoder");
  31. char charLeftOver = (char)0;
  32. // If we have an encoder AND we aren't using default fallback,
  33. // then we may have a complicated count.
  34. EncoderReplacementFallback fallback;
  35. if (encoder != null)
  36. {
  37. charLeftOver = encoder._charLeftOver;
  38. Debug.Assert(charLeftOver == 0 || char.IsHighSurrogate(charLeftOver),
  39. "[Latin1Encoding.GetByteCount]leftover character should be high surrogate");
  40. fallback = encoder.Fallback as EncoderReplacementFallback;
  41. // Verify that we have no fallbackbuffer, for Latin1 its always empty, so just assert
  42. Debug.Assert(!encoder._throwOnOverflow || !encoder.InternalHasFallbackBuffer ||
  43. encoder.FallbackBuffer.Remaining == 0,
  44. "[Latin1CodePageEncoding.GetByteCount]Expected empty fallback buffer");
  45. }
  46. else
  47. fallback = this.EncoderFallback as EncoderReplacementFallback;
  48. if ((fallback != null && fallback.MaxCharCount == 1)/* || bIsBestFit*/)
  49. {
  50. // Replacement fallback encodes surrogate pairs as two ?? (or two whatever), so return size is always
  51. // same as input size.
  52. // Note that no existing SBCS code pages map code points to supplimentary characters, so this is easy.
  53. // We could however have 1 extra byte if the last call had an encoder and a funky fallback and
  54. // if we don't use the funky fallback this time.
  55. // Do we have an extra char left over from last time?
  56. if (charLeftOver > 0)
  57. charCount++;
  58. return (charCount);
  59. }
  60. // Count is more complicated if you have a funky fallback
  61. // For fallback we may need a fallback buffer, we know we're not default fallback
  62. int byteCount = 0;
  63. // Start by assuming default count, then +/- for fallback characters
  64. char* charEnd = chars + charCount;
  65. // For fallback we may need a fallback buffer, we know we aren't default fallback.
  66. EncoderFallbackBuffer fallbackBuffer = null;
  67. char* charsForFallback;
  68. // We may have a left over character from last time, try and process it.
  69. if (charLeftOver > 0)
  70. {
  71. // Initialize the buffer
  72. Debug.Assert(encoder != null,
  73. "[Latin1Encoding.GetByteCount]Expected encoder if we have charLeftOver");
  74. fallbackBuffer = encoder.FallbackBuffer;
  75. fallbackBuffer.InternalInitialize(chars, charEnd, encoder, false);
  76. // Since left over char was a surrogate, it'll have to be fallen back.
  77. // Get Fallback
  78. // This will fallback a pair if *chars is a low surrogate
  79. charsForFallback = chars;
  80. fallbackBuffer.InternalFallback(charLeftOver, ref charsForFallback);
  81. chars = charsForFallback;
  82. }
  83. // Now we may have fallback char[] already from the encoder
  84. // Go ahead and do it, including the fallback.
  85. char ch;
  86. while ((ch = (fallbackBuffer == null) ? '\0' : fallbackBuffer.InternalGetNextChar()) != 0 ||
  87. chars < charEnd)
  88. {
  89. // First unwind any fallback
  90. if (ch == 0)
  91. {
  92. // No fallback, just get next char
  93. ch = *chars;
  94. chars++;
  95. }
  96. // Check for fallback, this'll catch surrogate pairs too.
  97. // no chars >= 0x100 are allowed.
  98. if (ch > 0xff)
  99. {
  100. // Initialize the buffer
  101. if (fallbackBuffer == null)
  102. {
  103. if (encoder == null)
  104. fallbackBuffer = this.encoderFallback.CreateFallbackBuffer();
  105. else
  106. fallbackBuffer = encoder.FallbackBuffer;
  107. fallbackBuffer.InternalInitialize(charEnd - charCount, charEnd, encoder, false);
  108. }
  109. // Get Fallback
  110. charsForFallback = chars;
  111. fallbackBuffer.InternalFallback(ch, ref charsForFallback);
  112. chars = charsForFallback;
  113. continue;
  114. }
  115. // We'll use this one
  116. byteCount++;
  117. }
  118. Debug.Assert(fallbackBuffer == null || fallbackBuffer.Remaining == 0,
  119. "[Latin1Encoding.GetByteCount]Expected Empty fallback buffer");
  120. return byteCount;
  121. }
  122. internal override unsafe int GetBytes(char* chars, int charCount,
  123. byte* bytes, int byteCount, EncoderNLS encoder)
  124. {
  125. // Just need to ASSERT, this is called by something else internal that checked parameters already
  126. Debug.Assert(bytes != null, "[Latin1Encoding.GetBytes]bytes is null");
  127. Debug.Assert(byteCount >= 0, "[Latin1Encoding.GetBytes]byteCount is negative");
  128. Debug.Assert(chars != null, "[Latin1Encoding.GetBytes]chars is null");
  129. Debug.Assert(charCount >= 0, "[Latin1Encoding.GetBytes]charCount is negative");
  130. // Assert because we shouldn't be able to have a null encoder.
  131. Debug.Assert(encoderFallback != null, "[Latin1Encoding.GetBytes]Attempting to use null encoder fallback");
  132. // Get any left over characters & check fast or slower fallback type
  133. char charLeftOver = (char)0;
  134. EncoderReplacementFallback fallback = null;
  135. if (encoder != null)
  136. {
  137. charLeftOver = encoder._charLeftOver;
  138. fallback = encoder.Fallback as EncoderReplacementFallback;
  139. Debug.Assert(charLeftOver == 0 || char.IsHighSurrogate(charLeftOver),
  140. "[Latin1Encoding.GetBytes]leftover character should be high surrogate");
  141. // Verify that we have no fallbackbuffer, for ASCII its always empty, so just assert
  142. Debug.Assert(!encoder._throwOnOverflow || !encoder.InternalHasFallbackBuffer ||
  143. encoder.FallbackBuffer.Remaining == 0,
  144. "[Latin1CodePageEncoding.GetBytes]Expected empty fallback buffer");
  145. }
  146. else
  147. {
  148. fallback = this.EncoderFallback as EncoderReplacementFallback;
  149. }
  150. // prepare our end
  151. char* charEnd = chars + charCount;
  152. byte* byteStart = bytes;
  153. char* charStart = chars;
  154. // See if we do the fast default or slightly slower fallback
  155. if (fallback != null && fallback.MaxCharCount == 1)
  156. {
  157. // Fast version
  158. char cReplacement = fallback.DefaultString[0];
  159. // Check for replacements in range, otherwise fall back to slow version.
  160. if (cReplacement <= (char)0xff)
  161. {
  162. // We should have exactly as many output bytes as input bytes, unless there's a left
  163. // over character, in which case we may need one more.
  164. // If we had a left over character will have to add a ? (This happens if they had a funky
  165. // fallback last time, but not this time.) (We can't spit any out though
  166. // because with fallback encoder each surrogate is treated as a seperate code point)
  167. if (charLeftOver > 0)
  168. {
  169. // Have to have room
  170. // Throw even if doing no throw version because this is just 1 char,
  171. // so buffer will never be big enough
  172. if (byteCount == 0)
  173. ThrowBytesOverflow(encoder, true);
  174. // This'll make sure we still have more room and also make sure our return value is correct.
  175. *(bytes++) = (byte)cReplacement;
  176. byteCount--; // We used one of the ones we were counting.
  177. }
  178. // This keeps us from overrunning our output buffer
  179. if (byteCount < charCount)
  180. {
  181. // Throw or make buffer smaller?
  182. ThrowBytesOverflow(encoder, byteCount < 1);
  183. // Just use what we can
  184. charEnd = chars + byteCount;
  185. }
  186. // We just do a quick copy
  187. while (chars < charEnd)
  188. {
  189. char ch2 = *(chars++);
  190. if (ch2 > 0x00ff) *(bytes++) = (byte)cReplacement;
  191. else *(bytes++) = (byte)ch2;
  192. }
  193. // Clear encoder
  194. if (encoder != null)
  195. {
  196. encoder._charLeftOver = (char)0;
  197. encoder._charsUsed = (int)(chars - charStart);
  198. }
  199. return (int)(bytes - byteStart);
  200. }
  201. }
  202. // Slower version, have to do real fallback.
  203. // prepare our end
  204. byte* byteEnd = bytes + byteCount;
  205. // For fallback we may need a fallback buffer, we know we aren't default fallback, create & init it
  206. EncoderFallbackBuffer fallbackBuffer = null;
  207. char* charsForFallback;
  208. // We may have a left over character from last time, try and process it.
  209. if (charLeftOver > 0)
  210. {
  211. // Since left over char was a surrogate, it'll have to be fallen back.
  212. // Get Fallback
  213. Debug.Assert(encoder != null,
  214. "[Latin1Encoding.GetBytes]Expected encoder if we have charLeftOver");
  215. fallbackBuffer = encoder.FallbackBuffer;
  216. fallbackBuffer.InternalInitialize(chars, charEnd, encoder, true);
  217. // Since left over char was a surrogate, it'll have to be fallen back.
  218. // Get Fallback
  219. // This will fallback a pair if *chars is a low surrogate
  220. charsForFallback = chars;
  221. fallbackBuffer.InternalFallback(charLeftOver, ref charsForFallback);
  222. chars = charsForFallback;
  223. if (fallbackBuffer.Remaining > byteEnd - bytes)
  224. {
  225. // Throw it, if we don't have enough for this we never will
  226. ThrowBytesOverflow(encoder, true);
  227. }
  228. }
  229. // Now we may have fallback char[] already from the encoder fallback above
  230. // Go ahead and do it, including the fallback.
  231. char ch;
  232. while ((ch = (fallbackBuffer == null) ? '\0' : fallbackBuffer.InternalGetNextChar()) != 0 ||
  233. chars < charEnd)
  234. {
  235. // First unwind any fallback
  236. if (ch == 0)
  237. {
  238. // No fallback, just get next char
  239. ch = *chars;
  240. chars++;
  241. }
  242. // Check for fallback, this'll catch surrogate pairs too.
  243. // All characters >= 0x100 must fall back.
  244. if (ch > 0xff)
  245. {
  246. // Initialize the buffer
  247. if (fallbackBuffer == null)
  248. {
  249. if (encoder == null)
  250. fallbackBuffer = this.encoderFallback.CreateFallbackBuffer();
  251. else
  252. fallbackBuffer = encoder.FallbackBuffer;
  253. fallbackBuffer.InternalInitialize(charEnd - charCount, charEnd, encoder, true);
  254. }
  255. // Get Fallback
  256. charsForFallback = chars;
  257. fallbackBuffer.InternalFallback(ch, ref charsForFallback);
  258. chars = charsForFallback;
  259. // Make sure we have enough room. Each fallback char will be 1 output char
  260. // (or else cause a recursion exception)
  261. if (fallbackBuffer.Remaining > byteEnd - bytes)
  262. {
  263. // Didn't use this char, throw it. Chars should've advanced by now
  264. // If we had encoder fallback data it would've thrown before the loop
  265. Debug.Assert(chars > charStart,
  266. "[Latin1Encoding.GetBytes]Expected chars to have advanced (fallback case)");
  267. chars--;
  268. fallbackBuffer.InternalReset();
  269. // Throw it
  270. ThrowBytesOverflow(encoder, chars == charStart);
  271. break;
  272. }
  273. continue;
  274. }
  275. // We'll use this one
  276. // Bounds check
  277. if (bytes >= byteEnd)
  278. {
  279. // didn't use this char, we'll throw or use buffer
  280. Debug.Assert(fallbackBuffer == null || fallbackBuffer.bFallingBack == false,
  281. "[Latin1Encoding.GetBytes]Expected fallback to have throw initially if insufficient space");
  282. if (fallbackBuffer == null || fallbackBuffer.bFallingBack == false)
  283. {
  284. Debug.Assert(chars > charStart,
  285. "[Latin1Encoding.GetBytes]Expected chars to have advanced (fallback case)");
  286. chars--; // don't use last char
  287. }
  288. ThrowBytesOverflow(encoder, chars == charStart); // throw ?
  289. break; // don't throw, stop
  290. }
  291. // Go ahead and add it
  292. *bytes = unchecked((byte)ch);
  293. bytes++;
  294. }
  295. // Need to do encoder stuff
  296. if (encoder != null)
  297. {
  298. // Fallback stuck it in encoder if necessary, but we have to clear MustFlush cases
  299. if (fallbackBuffer != null && !fallbackBuffer.bUsedEncoder)
  300. // Clear it in case of MustFlush
  301. encoder._charLeftOver = (char)0;
  302. // Set our chars used count
  303. encoder._charsUsed = (int)(chars - charStart);
  304. }
  305. Debug.Assert(fallbackBuffer == null || fallbackBuffer.Remaining == 0,
  306. "[Latin1Encoding.GetBytes]Expected Empty fallback buffer");
  307. return (int)(bytes - byteStart);
  308. }
  309. // This is internal and called by something else,
  310. internal override unsafe int GetCharCount(byte* bytes, int count, DecoderNLS decoder)
  311. {
  312. // Just assert, we're called internally so these should be safe, checked already
  313. Debug.Assert(bytes != null, "[Latin1Encoding.GetCharCount]bytes is null");
  314. Debug.Assert(count >= 0, "[Latin1Encoding.GetCharCount]byteCount is negative");
  315. // Just return length, SBCS stay the same length because they don't map to surrogate
  316. // pairs and we don't have to fallback because all latin1Encoding code points are unicode
  317. return count;
  318. }
  319. internal override unsafe int GetChars(byte* bytes, int byteCount,
  320. char* chars, int charCount, DecoderNLS decoder)
  321. {
  322. // Just need to ASSERT, this is called by something else internal that checked parameters already
  323. Debug.Assert(bytes != null, "[Latin1Encoding.GetChars]bytes is null");
  324. Debug.Assert(byteCount >= 0, "[Latin1Encoding.GetChars]byteCount is negative");
  325. Debug.Assert(chars != null, "[Latin1Encoding.GetChars]chars is null");
  326. Debug.Assert(charCount >= 0, "[Latin1Encoding.GetChars]charCount is negative");
  327. // Need byteCount chars, otherwise too small buffer
  328. if (charCount < byteCount)
  329. {
  330. // Buffer too small. Do we throw?
  331. ThrowCharsOverflow(decoder, charCount < 1);
  332. // Don't throw, correct buffer size
  333. byteCount = charCount;
  334. }
  335. // Do it our fast way
  336. byte* byteEnd = bytes + byteCount;
  337. // Quick loop, all bytes are the same as chars, so no fallbacks for latin1
  338. while (bytes < byteEnd)
  339. {
  340. *(chars) = unchecked((char)*(bytes));
  341. chars++;
  342. bytes++;
  343. }
  344. // Might need to know input bytes used
  345. if (decoder != null)
  346. decoder._bytesUsed = byteCount;
  347. // Converted sequence is same length as input, so output charsUsed is same as byteCount;
  348. return byteCount;
  349. }
  350. public override int GetMaxByteCount(int charCount)
  351. {
  352. if (charCount < 0)
  353. throw new ArgumentOutOfRangeException(nameof(charCount),
  354. SR.ArgumentOutOfRange_NeedNonNegNum);
  355. // Characters would be # of characters + 1 in case high surrogate is ? * max fallback
  356. long byteCount = (long)charCount + 1;
  357. if (EncoderFallback.MaxCharCount > 1)
  358. byteCount *= EncoderFallback.MaxCharCount;
  359. // 1 to 1 for most characters. Only surrogates with fallbacks have less.
  360. if (byteCount > 0x7fffffff)
  361. throw new ArgumentOutOfRangeException(nameof(charCount), SR.ArgumentOutOfRange_GetByteCountOverflow);
  362. return (int)byteCount;
  363. }
  364. public override int GetMaxCharCount(int byteCount)
  365. {
  366. if (byteCount < 0)
  367. throw new ArgumentOutOfRangeException(nameof(byteCount),
  368. SR.ArgumentOutOfRange_NeedNonNegNum);
  369. // Just return length, SBCS stay the same length because they don't map to surrogate
  370. long charCount = (long)byteCount;
  371. // 1 to 1 for most characters. Only surrogates with fallbacks have less, unknown fallbacks could be longer.
  372. if (DecoderFallback.MaxCharCount > 1)
  373. charCount *= DecoderFallback.MaxCharCount;
  374. if (charCount > 0x7fffffff)
  375. throw new ArgumentOutOfRangeException(nameof(byteCount), SR.ArgumentOutOfRange_GetCharCountOverflow);
  376. return (int)charCount;
  377. }
  378. // True if and only if the encoding only uses single byte code points. (Ie, ASCII, 1252, etc)
  379. public override bool IsSingleByte
  380. {
  381. get
  382. {
  383. return true;
  384. }
  385. }
  386. public override bool IsAlwaysNormalized(NormalizationForm form)
  387. {
  388. // Latin-1 contains precomposed characters, so normal for Form C.
  389. // Since some are composed, not normal for D & KD.
  390. // Also some letters like 0x00A8 (spacing diarisis) have compatibility decompositions, so false for KD & KC.
  391. // Only true for form C.
  392. return (form == NormalizationForm.FormC);
  393. }
  394. // Since our best fit table is small we'll hard code it
  395. internal override char[] GetBestFitUnicodeToBytesData()
  396. {
  397. // Get our best fit data
  398. return Latin1Encoding.arrayCharBestFit;
  399. }
  400. // Best fit for ASCII, and since it works for ASCII, we use it for latin1 as well.
  401. private static readonly char[] arrayCharBestFit =
  402. {
  403. // The first many are in case you wanted to use this for ASCIIEncoding, which we don't need to do any more.
  404. // (char)0x00a0, (char)0x0020, // No-Break Space -> Space
  405. // (char)0x00a1, (char)0x0021, // Inverted Exclamation Mark -> !
  406. // (char)0x00a2, (char)0x0063, // Cent Sign -> c
  407. // (char)0x00a3, (char)0x003f, // Pound Sign
  408. // (char)0x00a4, (char)0x0024, // Currency Sign -> $
  409. // (char)0x00a5, (char)0x0059, // Yen Sign -> Y
  410. // (char)0x00a6, (char)0x007c, // Broken Bar -> |
  411. // (char)0x00a7, (char)0x003f, // Section Sign
  412. // (char)0x00a8, (char)0x003f, // Diaeresis
  413. // (char)0x00a9, (char)0x0043, // Copyright Sign -> C
  414. // (char)0x00aa, (char)0x0061, // Feminine Ordinal Indicator -> a
  415. // (char)0x00ab, (char)0x003c, // Left-Pointing Double Angle Quotation Mark -> <
  416. // (char)0x00ac, (char)0x003f, // Not Sign
  417. // (char)0x00ad, (char)0x002d, // Soft Hyphen -> -
  418. // (char)0x00ae, (char)0x0052, // Registered Sign -> R
  419. // (char)0x00af, (char)0x003f, // Macron
  420. // (char)0x00b0, (char)0x003f, // Degree Sign
  421. // (char)0x00b1, (char)0x003f, // Plus-Minus Sign
  422. // (char)0x00b2, (char)0x0032, // Superscript Two -> 2
  423. // (char)0x00b3, (char)0x0033, // Superscript Three -> 3
  424. // (char)0x00b4, (char)0x003f, // Acute Accent
  425. // (char)0x00b5, (char)0x003f, // Micro Sign
  426. // (char)0x00b6, (char)0x003f, // Pilcrow Sign
  427. // (char)0x00b7, (char)0x002e, // Middle Dot -> .
  428. // (char)0x00b8, (char)0x002c, // Cedilla -> ,
  429. // (char)0x00b9, (char)0x0031, // Superscript One -> 1
  430. // (char)0x00ba, (char)0x006f, // Masculine Ordinal Indicator -> o
  431. // (char)0x00bb, (char)0x003e, // Right-Pointing Double Angle Quotation Mark -> >
  432. // (char)0x00bc, (char)0x003f, // Vulgar Fraction One Quarter
  433. // (char)0x00bd, (char)0x003f, // Vulgar Fraction One Half
  434. // (char)0x00be, (char)0x003f, // Vulgar Fraction Three Quarters
  435. // (char)0x00bf, (char)0x003f, // Inverted Question Mark
  436. // (char)0x00c0, (char)0x0041, // Latin Capital Letter A With Grave -> A
  437. // (char)0x00c1, (char)0x0041, // Latin Capital Letter A With Acute -> A
  438. // (char)0x00c2, (char)0x0041, // Latin Capital Letter A With Circumflex -> A
  439. // (char)0x00c3, (char)0x0041, // Latin Capital Letter A With Tilde -> A
  440. // (char)0x00c4, (char)0x0041, // Latin Capital Letter A With Diaeresis -> A
  441. // (char)0x00c5, (char)0x0041, // Latin Capital Letter A With Ring Above -> A
  442. // (char)0x00c6, (char)0x0041, // Latin Capital Ligature Ae -> A
  443. // (char)0x00c7, (char)0x0043, // Latin Capital Letter C With Cedilla -> C
  444. // (char)0x00c8, (char)0x0045, // Latin Capital Letter E With Grave -> E
  445. // (char)0x00c9, (char)0x0045, // Latin Capital Letter E With Acute -> E
  446. // (char)0x00ca, (char)0x0045, // Latin Capital Letter E With Circumflex -> E
  447. // (char)0x00cb, (char)0x0045, // Latin Capital Letter E With Diaeresis -> E
  448. // (char)0x00cc, (char)0x0049, // Latin Capital Letter I With Grave -> I
  449. // (char)0x00cd, (char)0x0049, // Latin Capital Letter I With Acute -> I
  450. // (char)0x00ce, (char)0x0049, // Latin Capital Letter I With Circumflex -> I
  451. // (char)0x00cf, (char)0x0049, // Latin Capital Letter I With Diaeresis -> I
  452. // (char)0x00d0, (char)0x0044, // Latin Capital Letter Eth -> D
  453. // (char)0x00d1, (char)0x004e, // Latin Capital Letter N With Tilde -> N
  454. // (char)0x00d2, (char)0x004f, // Latin Capital Letter O With Grave -> O
  455. // (char)0x00d3, (char)0x004f, // Latin Capital Letter O With Acute -> O
  456. // (char)0x00d4, (char)0x004f, // Latin Capital Letter O With Circumflex -> O
  457. // (char)0x00d5, (char)0x004f, // Latin Capital Letter O With Tilde -> O
  458. // (char)0x00d6, (char)0x004f, // Latin Capital Letter O With Diaeresis -> O
  459. // (char)0x00d7, (char)0x003f, // Multiplication Sign
  460. // (char)0x00d8, (char)0x004f, // Latin Capital Letter O With Stroke -> O
  461. // (char)0x00d9, (char)0x0055, // Latin Capital Letter U With Grave -> U
  462. // (char)0x00da, (char)0x0055, // Latin Capital Letter U With Acute -> U
  463. // (char)0x00db, (char)0x0055, // Latin Capital Letter U With Circumflex -> U
  464. // (char)0x00dc, (char)0x0055, // Latin Capital Letter U With Diaeresis -> U
  465. // (char)0x00dd, (char)0x0059, // Latin Capital Letter Y With Acute -> Y
  466. // (char)0x00de, (char)0x003f, // Latin Capital Letter Thorn
  467. // (char)0x00df, (char)0x003f, // Latin Small Letter Sharp S
  468. // (char)0x00e0, (char)0x0061, // Latin Small Letter A With Grave -> a
  469. // (char)0x00e1, (char)0x0061, // Latin Small Letter A With Acute -> a
  470. // (char)0x00e2, (char)0x0061, // Latin Small Letter A With Circumflex -> a
  471. // (char)0x00e3, (char)0x0061, // Latin Small Letter A With Tilde -> a
  472. // (char)0x00e4, (char)0x0061, // Latin Small Letter A With Diaeresis -> a
  473. // (char)0x00e5, (char)0x0061, // Latin Small Letter A With Ring Above -> a
  474. // (char)0x00e6, (char)0x0061, // Latin Small Ligature Ae -> a
  475. // (char)0x00e7, (char)0x0063, // Latin Small Letter C With Cedilla -> c
  476. // (char)0x00e8, (char)0x0065, // Latin Small Letter E With Grave -> e
  477. // (char)0x00e9, (char)0x0065, // Latin Small Letter E With Acute -> e
  478. // (char)0x00ea, (char)0x0065, // Latin Small Letter E With Circumflex -> e
  479. // (char)0x00eb, (char)0x0065, // Latin Small Letter E With Diaeresis -> e
  480. // (char)0x00ec, (char)0x0069, // Latin Small Letter I With Grave -> i
  481. // (char)0x00ed, (char)0x0069, // Latin Small Letter I With Acute -> i
  482. // (char)0x00ee, (char)0x0069, // Latin Small Letter I With Circumflex -> i
  483. // (char)0x00ef, (char)0x0069, // Latin Small Letter I With Diaeresis -> i
  484. // (char)0x00f0, (char)0x003f, // Latin Small Letter Eth
  485. // (char)0x00f1, (char)0x006e, // Latin Small Letter N With Tilde -> n
  486. // (char)0x00f2, (char)0x006f, // Latin Small Letter O With Grave -> o
  487. // (char)0x00f3, (char)0x006f, // Latin Small Letter O With Acute -> o
  488. // (char)0x00f4, (char)0x006f, // Latin Small Letter O With Circumflex -> o
  489. // (char)0x00f5, (char)0x006f, // Latin Small Letter O With Tilde -> o
  490. // (char)0x00f6, (char)0x006f, // Latin Small Letter O With Diaeresis -> o
  491. // (char)0x00f7, (char)0x003f, // Division Sign
  492. // (char)0x00f8, (char)0x006f, // Latin Small Letter O With Stroke -> o
  493. // (char)0x00f9, (char)0x0075, // Latin Small Letter U With Grave -> u
  494. // (char)0x00fa, (char)0x0075, // Latin Small Letter U With Acute -> u
  495. // (char)0x00fb, (char)0x0075, // Latin Small Letter U With Circumflex -> u
  496. // (char)0x00fc, (char)0x0075, // Latin Small Letter U With Diaeresis -> u
  497. // (char)0x00fd, (char)0x0079, // Latin Small Letter Y With Acute -> y
  498. // (char)0x00fe, (char)0x003f, // Latin Small Letter Thorn
  499. // (char)0x00ff, (char)0x0079, // Latin Small Letter Y With Diaeresis -> y
  500. (char)0x0100, (char)0x0041, // Latin Capital Letter A With Macron -> A
  501. (char)0x0101, (char)0x0061, // Latin Small Letter A With Macron -> a
  502. (char)0x0102, (char)0x0041, // Latin Capital Letter A With Breve -> A
  503. (char)0x0103, (char)0x0061, // Latin Small Letter A With Breve -> a
  504. (char)0x0104, (char)0x0041, // Latin Capital Letter A With Ogonek -> A
  505. (char)0x0105, (char)0x0061, // Latin Small Letter A With Ogonek -> a
  506. (char)0x0106, (char)0x0043, // Latin Capital Letter C With Acute -> C
  507. (char)0x0107, (char)0x0063, // Latin Small Letter C With Acute -> c
  508. (char)0x0108, (char)0x0043, // Latin Capital Letter C With Circumflex -> C
  509. (char)0x0109, (char)0x0063, // Latin Small Letter C With Circumflex -> c
  510. (char)0x010a, (char)0x0043, // Latin Capital Letter C With Dot Above -> C
  511. (char)0x010b, (char)0x0063, // Latin Small Letter C With Dot Above -> c
  512. (char)0x010c, (char)0x0043, // Latin Capital Letter C With Caron -> C
  513. (char)0x010d, (char)0x0063, // Latin Small Letter C With Caron -> c
  514. (char)0x010e, (char)0x0044, // Latin Capital Letter D With Caron -> D
  515. (char)0x010f, (char)0x0064, // Latin Small Letter D With Caron -> d
  516. (char)0x0110, (char)0x0044, // Latin Capital Letter D With Stroke -> D
  517. (char)0x0111, (char)0x0064, // Latin Small Letter D With Stroke -> d
  518. (char)0x0112, (char)0x0045, // Latin Capital Letter E With Macron -> E
  519. (char)0x0113, (char)0x0065, // Latin Small Letter E With Macron -> e
  520. (char)0x0114, (char)0x0045, // Latin Capital Letter E With Breve -> E
  521. (char)0x0115, (char)0x0065, // Latin Small Letter E With Breve -> e
  522. (char)0x0116, (char)0x0045, // Latin Capital Letter E With Dot Above -> E
  523. (char)0x0117, (char)0x0065, // Latin Small Letter E With Dot Above -> e
  524. (char)0x0118, (char)0x0045, // Latin Capital Letter E With Ogonek -> E
  525. (char)0x0119, (char)0x0065, // Latin Small Letter E With Ogonek -> e
  526. (char)0x011a, (char)0x0045, // Latin Capital Letter E With Caron -> E
  527. (char)0x011b, (char)0x0065, // Latin Small Letter E With Caron -> e
  528. (char)0x011c, (char)0x0047, // Latin Capital Letter G With Circumflex -> G
  529. (char)0x011d, (char)0x0067, // Latin Small Letter G With Circumflex -> g
  530. (char)0x011e, (char)0x0047, // Latin Capital Letter G With Breve -> G
  531. (char)0x011f, (char)0x0067, // Latin Small Letter G With Breve -> g
  532. (char)0x0120, (char)0x0047, // Latin Capital Letter G With Dot Above -> G
  533. (char)0x0121, (char)0x0067, // Latin Small Letter G With Dot Above -> g
  534. (char)0x0122, (char)0x0047, // Latin Capital Letter G With Cedilla -> G
  535. (char)0x0123, (char)0x0067, // Latin Small Letter G With Cedilla -> g
  536. (char)0x0124, (char)0x0048, // Latin Capital Letter H With Circumflex -> H
  537. (char)0x0125, (char)0x0068, // Latin Small Letter H With Circumflex -> h
  538. (char)0x0126, (char)0x0048, // Latin Capital Letter H With Stroke -> H
  539. (char)0x0127, (char)0x0068, // Latin Small Letter H With Stroke -> h
  540. (char)0x0128, (char)0x0049, // Latin Capital Letter I With Tilde -> I
  541. (char)0x0129, (char)0x0069, // Latin Small Letter I With Tilde -> i
  542. (char)0x012a, (char)0x0049, // Latin Capital Letter I With Macron -> I
  543. (char)0x012b, (char)0x0069, // Latin Small Letter I With Macron -> i
  544. (char)0x012c, (char)0x0049, // Latin Capital Letter I With Breve -> I
  545. (char)0x012d, (char)0x0069, // Latin Small Letter I With Breve -> i
  546. (char)0x012e, (char)0x0049, // Latin Capital Letter I With Ogonek -> I
  547. (char)0x012f, (char)0x0069, // Latin Small Letter I With Ogonek -> i
  548. (char)0x0130, (char)0x0049, // Latin Capital Letter I With Dot Above -> I
  549. (char)0x0131, (char)0x0069, // Latin Small Letter Dotless I -> i
  550. (char)0x0134, (char)0x004a, // Latin Capital Letter J With Circumflex -> J
  551. (char)0x0135, (char)0x006a, // Latin Small Letter J With Circumflex -> j
  552. (char)0x0136, (char)0x004b, // Latin Capital Letter K With Cedilla -> K
  553. (char)0x0137, (char)0x006b, // Latin Small Letter K With Cedilla -> k
  554. (char)0x0139, (char)0x004c, // Latin Capital Letter L With Acute -> L
  555. (char)0x013a, (char)0x006c, // Latin Small Letter L With Acute -> l
  556. (char)0x013b, (char)0x004c, // Latin Capital Letter L With Cedilla -> L
  557. (char)0x013c, (char)0x006c, // Latin Small Letter L With Cedilla -> l
  558. (char)0x013d, (char)0x004c, // Latin Capital Letter L With Caron -> L
  559. (char)0x013e, (char)0x006c, // Latin Small Letter L With Caron -> l
  560. (char)0x0141, (char)0x004c, // Latin Capital Letter L With Stroke -> L
  561. (char)0x0142, (char)0x006c, // Latin Small Letter L With Stroke -> l
  562. (char)0x0143, (char)0x004e, // Latin Capital Letter N With Acute -> N
  563. (char)0x0144, (char)0x006e, // Latin Small Letter N With Acute -> n
  564. (char)0x0145, (char)0x004e, // Latin Capital Letter N With Cedilla -> N
  565. (char)0x0146, (char)0x006e, // Latin Small Letter N With Cedilla -> n
  566. (char)0x0147, (char)0x004e, // Latin Capital Letter N With Caron -> N
  567. (char)0x0148, (char)0x006e, // Latin Small Letter N With Caron -> n
  568. (char)0x014c, (char)0x004f, // Latin Capital Letter O With Macron -> O
  569. (char)0x014d, (char)0x006f, // Latin Small Letter O With Macron -> o
  570. (char)0x014e, (char)0x004f, // Latin Capital Letter O With Breve -> O
  571. (char)0x014f, (char)0x006f, // Latin Small Letter O With Breve -> o
  572. (char)0x0150, (char)0x004f, // Latin Capital Letter O With Double Acute -> O
  573. (char)0x0151, (char)0x006f, // Latin Small Letter O With Double Acute -> o
  574. (char)0x0152, (char)0x004f, // Latin Capital Ligature Oe -> O
  575. (char)0x0153, (char)0x006f, // Latin Small Ligature Oe -> o
  576. (char)0x0154, (char)0x0052, // Latin Capital Letter R With Acute -> R
  577. (char)0x0155, (char)0x0072, // Latin Small Letter R With Acute -> r
  578. (char)0x0156, (char)0x0052, // Latin Capital Letter R With Cedilla -> R
  579. (char)0x0157, (char)0x0072, // Latin Small Letter R With Cedilla -> r
  580. (char)0x0158, (char)0x0052, // Latin Capital Letter R With Caron -> R
  581. (char)0x0159, (char)0x0072, // Latin Small Letter R With Caron -> r
  582. (char)0x015a, (char)0x0053, // Latin Capital Letter S With Acute -> S
  583. (char)0x015b, (char)0x0073, // Latin Small Letter S With Acute -> s
  584. (char)0x015c, (char)0x0053, // Latin Capital Letter S With Circumflex -> S
  585. (char)0x015d, (char)0x0073, // Latin Small Letter S With Circumflex -> s
  586. (char)0x015e, (char)0x0053, // Latin Capital Letter S With Cedilla -> S
  587. (char)0x015f, (char)0x0073, // Latin Small Letter S With Cedilla -> s
  588. (char)0x0160, (char)0x0053, // Latin Capital Letter S With Caron -> S
  589. (char)0x0161, (char)0x0073, // Latin Small Letter S With Caron -> s
  590. (char)0x0162, (char)0x0054, // Latin Capital Letter T With Cedilla -> T
  591. (char)0x0163, (char)0x0074, // Latin Small Letter T With Cedilla -> t
  592. (char)0x0164, (char)0x0054, // Latin Capital Letter T With Caron -> T
  593. (char)0x0165, (char)0x0074, // Latin Small Letter T With Caron -> t
  594. (char)0x0166, (char)0x0054, // Latin Capital Letter T With Stroke -> T
  595. (char)0x0167, (char)0x0074, // Latin Small Letter T With Stroke -> t
  596. (char)0x0168, (char)0x0055, // Latin Capital Letter U With Tilde -> U
  597. (char)0x0169, (char)0x0075, // Latin Small Letter U With Tilde -> u
  598. (char)0x016a, (char)0x0055, // Latin Capital Letter U With Macron -> U
  599. (char)0x016b, (char)0x0075, // Latin Small Letter U With Macron -> u
  600. (char)0x016c, (char)0x0055, // Latin Capital Letter U With Breve -> U
  601. (char)0x016d, (char)0x0075, // Latin Small Letter U With Breve -> u
  602. (char)0x016e, (char)0x0055, // Latin Capital Letter U With Ring Above -> U
  603. (char)0x016f, (char)0x0075, // Latin Small Letter U With Ring Above -> u
  604. (char)0x0170, (char)0x0055, // Latin Capital Letter U With Double Acute -> U
  605. (char)0x0171, (char)0x0075, // Latin Small Letter U With Double Acute -> u
  606. (char)0x0172, (char)0x0055, // Latin Capital Letter U With Ogonek -> U
  607. (char)0x0173, (char)0x0075, // Latin Small Letter U With Ogonek -> u
  608. (char)0x0174, (char)0x0057, // Latin Capital Letter W With Circumflex -> W
  609. (char)0x0175, (char)0x0077, // Latin Small Letter W With Circumflex -> w
  610. (char)0x0176, (char)0x0059, // Latin Capital Letter Y With Circumflex -> Y
  611. (char)0x0177, (char)0x0079, // Latin Small Letter Y With Circumflex -> y
  612. (char)0x0178, (char)0x0059, // Latin Capital Letter Y With Diaeresis -> Y
  613. (char)0x0179, (char)0x005a, // Latin Capital Letter Z With Acute -> Z
  614. (char)0x017a, (char)0x007a, // Latin Small Letter Z With Acute -> z
  615. (char)0x017b, (char)0x005a, // Latin Capital Letter Z With Dot Above -> Z
  616. (char)0x017c, (char)0x007a, // Latin Small Letter Z With Dot Above -> z
  617. (char)0x017d, (char)0x005a, // Latin Capital Letter Z With Caron -> Z
  618. (char)0x017e, (char)0x007a, // Latin Small Letter Z With Caron -> z
  619. (char)0x0180, (char)0x0062, // Latin Small Letter B With Stroke -> b
  620. (char)0x0189, (char)0x0044, // Latin Capital Letter African D -> D
  621. (char)0x0191, (char)0x0046, // Latin Capital Letter F With Hook -> F
  622. (char)0x0192, (char)0x0066, // Latin Small Letter F With Hook -> f
  623. (char)0x0197, (char)0x0049, // Latin Capital Letter I With Stroke -> I
  624. (char)0x019a, (char)0x006c, // Latin Small Letter L With Bar -> l
  625. (char)0x019f, (char)0x004f, // Latin Capital Letter O With Middle Tilde -> O
  626. (char)0x01a0, (char)0x004f, // Latin Capital Letter O With Horn -> O
  627. (char)0x01a1, (char)0x006f, // Latin Small Letter O With Horn -> o
  628. (char)0x01ab, (char)0x0074, // Latin Small Letter T With Palatal Hook -> t
  629. (char)0x01ae, (char)0x0054, // Latin Capital Letter T With Retroflex Hook -> T
  630. (char)0x01af, (char)0x0055, // Latin Capital Letter U With Horn -> U
  631. (char)0x01b0, (char)0x0075, // Latin Small Letter U With Horn -> u
  632. (char)0x01b6, (char)0x007a, // Latin Small Letter Z With Stroke -> z
  633. (char)0x01cd, (char)0x0041, // Latin Capital Letter A With Caron -> A
  634. (char)0x01ce, (char)0x0061, // Latin Small Letter A With Caron -> a
  635. (char)0x01cf, (char)0x0049, // Latin Capital Letter I With Caron -> I
  636. (char)0x01d0, (char)0x0069, // Latin Small Letter I With Caron -> i
  637. (char)0x01d1, (char)0x004f, // Latin Capital Letter O With Caron -> O
  638. (char)0x01d2, (char)0x006f, // Latin Small Letter O With Caron -> o
  639. (char)0x01d3, (char)0x0055, // Latin Capital Letter U With Caron -> U
  640. (char)0x01d4, (char)0x0075, // Latin Small Letter U With Caron -> u
  641. (char)0x01d5, (char)0x0055, // Latin Capital Letter U With Diaeresis And Macron -> U
  642. (char)0x01d6, (char)0x0075, // Latin Small Letter U With Diaeresis And Macron -> u
  643. (char)0x01d7, (char)0x0055, // Latin Capital Letter U With Diaeresis And Acute -> U
  644. (char)0x01d8, (char)0x0075, // Latin Small Letter U With Diaeresis And Acute -> u
  645. (char)0x01d9, (char)0x0055, // Latin Capital Letter U With Diaeresis And Caron -> U
  646. (char)0x01da, (char)0x0075, // Latin Small Letter U With Diaeresis And Caron -> u
  647. (char)0x01db, (char)0x0055, // Latin Capital Letter U With Diaeresis And Grave -> U
  648. (char)0x01dc, (char)0x0075, // Latin Small Letter U With Diaeresis And Grave -> u
  649. (char)0x01de, (char)0x0041, // Latin Capital Letter A With Diaeresis And Macron -> A
  650. (char)0x01df, (char)0x0061, // Latin Small Letter A With Diaeresis And Macron -> a
  651. (char)0x01e4, (char)0x0047, // Latin Capital Letter G With Stroke -> G
  652. (char)0x01e5, (char)0x0067, // Latin Small Letter G With Stroke -> g
  653. (char)0x01e6, (char)0x0047, // Latin Capital Letter G With Caron -> G
  654. (char)0x01e7, (char)0x0067, // Latin Small Letter G With Caron -> g
  655. (char)0x01e8, (char)0x004b, // Latin Capital Letter K With Caron -> K
  656. (char)0x01e9, (char)0x006b, // Latin Small Letter K With Caron -> k
  657. (char)0x01ea, (char)0x004f, // Latin Capital Letter O With Ogonek -> O
  658. (char)0x01eb, (char)0x006f, // Latin Small Letter O With Ogonek -> o
  659. (char)0x01ec, (char)0x004f, // Latin Capital Letter O With Ogonek And Macron -> O
  660. (char)0x01ed, (char)0x006f, // Latin Small Letter O With Ogonek And Macron -> o
  661. (char)0x01f0, (char)0x006a, // Latin Small Letter J With Caron -> j
  662. (char)0x0261, (char)0x0067, // Latin Small Letter Script G -> g
  663. (char)0x02b9, (char)0x0027, // Modifier Letter Prime -> '
  664. (char)0x02ba, (char)0x0022, // Modifier Letter Double Prime -> "
  665. (char)0x02bc, (char)0x0027, // Modifier Letter Apostrophe -> '
  666. (char)0x02c4, (char)0x005e, // Modifier Letter Up Arrowhead -> ^
  667. (char)0x02c6, (char)0x005e, // Modifier Letter Circumflex Accent -> ^
  668. (char)0x02c8, (char)0x0027, // Modifier Letter Vertical Line -> '
  669. (char)0x02c9, (char)0x003f, // Modifier Letter Macron
  670. (char)0x02ca, (char)0x003f, // Modifier Letter Acute Accent
  671. (char)0x02cb, (char)0x0060, // Modifier Letter Grave Accent -> `
  672. (char)0x02cd, (char)0x005f, // Modifier Letter Low Macron -> _
  673. (char)0x02da, (char)0x003f, // Ring Above
  674. (char)0x02dc, (char)0x007e, // Small Tilde -> ~
  675. (char)0x0300, (char)0x0060, // Combining Grave Accent -> `
  676. (char)0x0302, (char)0x005e, // Combining Circumflex Accent -> ^
  677. (char)0x0303, (char)0x007e, // Combining Tilde -> ~
  678. (char)0x030e, (char)0x0022, // Combining Double Vertical Line Above -> "
  679. (char)0x0331, (char)0x005f, // Combining Macron Below -> _
  680. (char)0x0332, (char)0x005f, // Combining Low Line -> _
  681. (char)0x2000, (char)0x0020, // En Quad
  682. (char)0x2001, (char)0x0020, // Em Quad
  683. (char)0x2002, (char)0x0020, // En Space
  684. (char)0x2003, (char)0x0020, // Em Space
  685. (char)0x2004, (char)0x0020, // Three-Per-Em Space
  686. (char)0x2005, (char)0x0020, // Four-Per-Em Space
  687. (char)0x2006, (char)0x0020, // Six-Per-Em Space
  688. (char)0x2010, (char)0x002d, // Hyphen -> -
  689. (char)0x2011, (char)0x002d, // Non-Breaking Hyphen -> -
  690. (char)0x2013, (char)0x002d, // En Dash -> -
  691. (char)0x2014, (char)0x002d, // Em Dash -> -
  692. (char)0x2018, (char)0x0027, // Left Single Quotation Mark -> '
  693. (char)0x2019, (char)0x0027, // Right Single Quotation Mark -> '
  694. (char)0x201a, (char)0x002c, // Single Low-9 Quotation Mark -> ,
  695. (char)0x201c, (char)0x0022, // Left Double Quotation Mark -> "
  696. (char)0x201d, (char)0x0022, // Right Double Quotation Mark -> "
  697. (char)0x201e, (char)0x0022, // Double Low-9 Quotation Mark -> "
  698. (char)0x2020, (char)0x003f, // Dagger
  699. (char)0x2021, (char)0x003f, // Double Dagger
  700. (char)0x2022, (char)0x002e, // Bullet -> .
  701. (char)0x2026, (char)0x002e, // Horizontal Ellipsis -> .
  702. (char)0x2030, (char)0x003f, // Per Mille Sign
  703. (char)0x2032, (char)0x0027, // Prime -> '
  704. (char)0x2035, (char)0x0060, // Reversed Prime -> `
  705. (char)0x2039, (char)0x003c, // Single Left-Pointing Angle Quotation Mark -> <
  706. (char)0x203a, (char)0x003e, // Single Right-Pointing Angle Quotation Mark -> >
  707. (char)0x2122, (char)0x0054, // Trade Mark Sign -> T
  708. (char)0xff01, (char)0x0021, // Fullwidth Exclamation Mark -> !
  709. (char)0xff02, (char)0x0022, // Fullwidth Quotation Mark -> "
  710. (char)0xff03, (char)0x0023, // Fullwidth Number Sign -> #
  711. (char)0xff04, (char)0x0024, // Fullwidth Dollar Sign -> $
  712. (char)0xff05, (char)0x0025, // Fullwidth Percent Sign -> %
  713. (char)0xff06, (char)0x0026, // Fullwidth Ampersand -> &
  714. (char)0xff07, (char)0x0027, // Fullwidth Apostrophe -> '
  715. (char)0xff08, (char)0x0028, // Fullwidth Left Parenthesis -> (
  716. (char)0xff09, (char)0x0029, // Fullwidth Right Parenthesis -> )
  717. (char)0xff0a, (char)0x002a, // Fullwidth Asterisk -> *
  718. (char)0xff0b, (char)0x002b, // Fullwidth Plus Sign -> +
  719. (char)0xff0c, (char)0x002c, // Fullwidth Comma -> ,
  720. (char)0xff0d, (char)0x002d, // Fullwidth Hyphen-Minus -> -
  721. (char)0xff0e, (char)0x002e, // Fullwidth Full Stop -> .
  722. (char)0xff0f, (char)0x002f, // Fullwidth Solidus -> /
  723. (char)0xff10, (char)0x0030, // Fullwidth Digit Zero -> 0
  724. (char)0xff11, (char)0x0031, // Fullwidth Digit One -> 1
  725. (char)0xff12, (char)0x0032, // Fullwidth Digit Two -> 2
  726. (char)0xff13, (char)0x0033, // Fullwidth Digit Three -> 3
  727. (char)0xff14, (char)0x0034, // Fullwidth Digit Four -> 4
  728. (char)0xff15, (char)0x0035, // Fullwidth Digit Five -> 5
  729. (char)0xff16, (char)0x0036, // Fullwidth Digit Six -> 6
  730. (char)0xff17, (char)0x0037, // Fullwidth Digit Seven -> 7
  731. (char)0xff18, (char)0x0038, // Fullwidth Digit Eight -> 8
  732. (char)0xff19, (char)0x0039, // Fullwidth Digit Nine -> 9
  733. (char)0xff1a, (char)0x003a, // Fullwidth Colon -> :
  734. (char)0xff1b, (char)0x003b, // Fullwidth Semicolon -> ;
  735. (char)0xff1c, (char)0x003c, // Fullwidth Less-Than Sign -> <
  736. (char)0xff1d, (char)0x003d, // Fullwidth Equals Sign -> =
  737. (char)0xff1e, (char)0x003e, // Fullwidth Greater-Than Sign -> >
  738. (char)0xff1f, (char)0x003f, // Fullwidth Question Mark
  739. (char)0xff20, (char)0x0040, // Fullwidth Commercial At -> @
  740. (char)0xff21, (char)0x0041, // Fullwidth Latin Capital Letter A -> A
  741. (char)0xff22, (char)0x0042, // Fullwidth Latin Capital Letter B -> B
  742. (char)0xff23, (char)0x0043, // Fullwidth Latin Capital Letter C -> C
  743. (char)0xff24, (char)0x0044, // Fullwidth Latin Capital Letter D -> D
  744. (char)0xff25, (char)0x0045, // Fullwidth Latin Capital Letter E -> E
  745. (char)0xff26, (char)0x0046, // Fullwidth Latin Capital Letter F -> F
  746. (char)0xff27, (char)0x0047, // Fullwidth Latin Capital Letter G -> G
  747. (char)0xff28, (char)0x0048, // Fullwidth Latin Capital Letter H -> H
  748. (char)0xff29, (char)0x0049, // Fullwidth Latin Capital Letter I -> I
  749. (char)0xff2a, (char)0x004a, // Fullwidth Latin Capital Letter J -> J
  750. (char)0xff2b, (char)0x004b, // Fullwidth Latin Capital Letter K -> K
  751. (char)0xff2c, (char)0x004c, // Fullwidth Latin Capital Letter L -> L
  752. (char)0xff2d, (char)0x004d, // Fullwidth Latin Capital Letter M -> M
  753. (char)0xff2e, (char)0x004e, // Fullwidth Latin Capital Letter N -> N
  754. (char)0xff2f, (char)0x004f, // Fullwidth Latin Capital Letter O -> O
  755. (char)0xff30, (char)0x0050, // Fullwidth Latin Capital Letter P -> P
  756. (char)0xff31, (char)0x0051, // Fullwidth Latin Capital Letter Q -> Q
  757. (char)0xff32, (char)0x0052, // Fullwidth Latin Capital Letter R -> R
  758. (char)0xff33, (char)0x0053, // Fullwidth Latin Capital Letter S -> S
  759. (char)0xff34, (char)0x0054, // Fullwidth Latin Capital Letter T -> T
  760. (char)0xff35, (char)0x0055, // Fullwidth Latin Capital Letter U -> U
  761. (char)0xff36, (char)0x0056, // Fullwidth Latin Capital Letter V -> V
  762. (char)0xff37, (char)0x0057, // Fullwidth Latin Capital Letter W -> W
  763. (char)0xff38, (char)0x0058, // Fullwidth Latin Capital Letter X -> X
  764. (char)0xff39, (char)0x0059, // Fullwidth Latin Capital Letter Y -> Y
  765. (char)0xff3a, (char)0x005a, // Fullwidth Latin Capital Letter Z -> Z
  766. (char)0xff3b, (char)0x005b, // Fullwidth Left Square Bracket -> [
  767. (char)0xff3c, (char)0x005c, // Fullwidth Reverse Solidus -> \
  768. (char)0xff3d, (char)0x005d, // Fullwidth Right Square Bracket -> ]
  769. (char)0xff3e, (char)0x005e, // Fullwidth Circumflex Accent -> ^
  770. (char)0xff3f, (char)0x005f, // Fullwidth Low Line -> _
  771. (char)0xff40, (char)0x0060, // Fullwidth Grave Accent -> `
  772. (char)0xff41, (char)0x0061, // Fullwidth Latin Small Letter A -> a
  773. (char)0xff42, (char)0x0062, // Fullwidth Latin Small Letter B -> b
  774. (char)0xff43, (char)0x0063, // Fullwidth Latin Small Letter C -> c
  775. (char)0xff44, (char)0x0064, // Fullwidth Latin Small Letter D -> d
  776. (char)0xff45, (char)0x0065, // Fullwidth Latin Small Letter E -> e
  777. (char)0xff46, (char)0x0066, // Fullwidth Latin Small Letter F -> f
  778. (char)0xff47, (char)0x0067, // Fullwidth Latin Small Letter G -> g
  779. (char)0xff48, (char)0x0068, // Fullwidth Latin Small Letter H -> h
  780. (char)0xff49, (char)0x0069, // Fullwidth Latin Small Letter I -> i
  781. (char)0xff4a, (char)0x006a, // Fullwidth Latin Small Letter J -> j
  782. (char)0xff4b, (char)0x006b, // Fullwidth Latin Small Letter K -> k
  783. (char)0xff4c, (char)0x006c, // Fullwidth Latin Small Letter L -> l
  784. (char)0xff4d, (char)0x006d, // Fullwidth Latin Small Letter M -> m
  785. (char)0xff4e, (char)0x006e, // Fullwidth Latin Small Letter N -> n
  786. (char)0xff4f, (char)0x006f, // Fullwidth Latin Small Letter O -> o
  787. (char)0xff50, (char)0x0070, // Fullwidth Latin Small Letter P -> p
  788. (char)0xff51, (char)0x0071, // Fullwidth Latin Small Letter Q -> q
  789. (char)0xff52, (char)0x0072, // Fullwidth Latin Small Letter R -> r
  790. (char)0xff53, (char)0x0073, // Fullwidth Latin Small Letter S -> s
  791. (char)0xff54, (char)0x0074, // Fullwidth Latin Small Letter T -> t
  792. (char)0xff55, (char)0x0075, // Fullwidth Latin Small Letter U -> u
  793. (char)0xff56, (char)0x0076, // Fullwidth Latin Small Letter V -> v
  794. (char)0xff57, (char)0x0077, // Fullwidth Latin Small Letter W -> w
  795. (char)0xff58, (char)0x0078, // Fullwidth Latin Small Letter X -> x
  796. (char)0xff59, (char)0x0079, // Fullwidth Latin Small Letter Y -> y
  797. (char)0xff5a, (char)0x007a, // Fullwidth Latin Small Letter Z -> z
  798. (char)0xff5b, (char)0x007b, // Fullwidth Left Curly Bracket -> {
  799. (char)0xff5c, (char)0x007c, // Fullwidth Vertical Line -> |
  800. (char)0xff5d, (char)0x007d, // Fullwidth Right Curly Bracket -> }
  801. (char)0xff5e, (char)0x007e // Fullwidth Tilde -> ~
  802. };
  803. }
  804. }