Advertisement
lvs

UTF8 lua

lvs
Feb 2nd, 2014
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 41.00 KB | None | 0 0
  1. -- $Id: utf8.lua 179 2009-04-03 18:10:03Z pasta $
  2. --
  3. -- Provides UTF-8 aware string functions implemented in pure lua:
  4. -- * string.utf8len(s)
  5. -- * string.utf8sub(s, i, j)
  6. -- * string.utf8reverse(s)
  7. --
  8. -- If utf8data.lua (containing the lower<->upper case mappings) is loaded, these
  9. -- additional functions are available:
  10. -- * string.utf8upper(s)
  11. -- * string.utf8lower(s)
  12. --
  13. -- All functions behave as their non UTF-8 aware counterparts with the exception
  14. -- that UTF-8 characters are used instead of bytes for all units.
  15.  
  16. --[[
  17. Copyright (c) 2006-2007, Kyle Smith
  18. All rights reserved.
  19.  
  20. Redistribution and use in source and binary forms, with or without
  21. modification, are permitted provided that the following conditions are met:
  22.  
  23.     * Redistributions of source code must retain the above copyright notice,
  24.       this list of conditions and the following disclaimer.
  25.     * Redistributions in binary form must reproduce the above copyright
  26.       notice, this list of conditions and the following disclaimer in the
  27.       documentation and/or other materials provided with the distribution.
  28.     * Neither the name of the author nor the names of its contributors may be
  29.       used to endorse or promote products derived from this software without
  30.       specific prior written permission.
  31.  
  32. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  33. AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  34. IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  35. DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
  36. FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  37. DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  38. SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  39. CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  40. OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  41. OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  42. --]]
  43.  
  44. -- ABNF from RFC 3629
  45. --
  46. -- UTF8-octets = *( UTF8-char )
  47. -- UTF8-char   = UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4
  48. -- UTF8-1      = %x00-7F
  49. -- UTF8-2      = %xC2-DF UTF8-tail
  50. -- UTF8-3      = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) /
  51. --               %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail )
  52. -- UTF8-4      = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) /
  53. --               %xF4 %x80-8F 2( UTF8-tail )
  54. -- UTF8-tail   = %x80-BF
  55. --
  56.  
  57. local utf8_lc_uc = {
  58.     ["a"] = "A",
  59.     ["b"] = "B",
  60.     ["c"] = "C",
  61.     ["d"] = "D",
  62.     ["e"] = "E",
  63.     ["f"] = "F",
  64.     ["g"] = "G",
  65.     ["h"] = "H",
  66.     ["i"] = "I",
  67.     ["j"] = "J",
  68.     ["k"] = "K",
  69.     ["l"] = "L",
  70.     ["m"] = "M",
  71.     ["n"] = "N",
  72.     ["o"] = "O",
  73.     ["p"] = "P",
  74.     ["q"] = "Q",
  75.     ["r"] = "R",
  76.     ["s"] = "S",
  77.     ["t"] = "T",
  78.     ["u"] = "U",
  79.     ["v"] = "V",
  80.     ["w"] = "W",
  81.     ["x"] = "X",
  82.     ["y"] = "Y",
  83.     ["z"] = "Z",
  84.     ["µ"] = "Μ",
  85.     ["à"] = "À",
  86.     ["á"] = "Á",
  87.     ["â"] = "Â",
  88.     ["ã"] = "Ã",
  89.     ["ä"] = "Ä",
  90.     ["å"] = "Å",
  91.     ["æ"] = "Æ",
  92.     ["ç"] = "Ç",
  93.     ["è"] = "È",
  94.     ["é"] = "É",
  95.     ["ê"] = "Ê",
  96.     ["ë"] = "Ë",
  97.     ["ì"] = "Ì",
  98.     ["í"] = "Í",
  99.     ["î"] = "Î",
  100.     ["ï"] = "Ï",
  101.     ["ð"] = "Ð",
  102.     ["ñ"] = "Ñ",
  103.     ["ò"] = "Ò",
  104.     ["ó"] = "Ó",
  105.     ["ô"] = "Ô",
  106.     ["õ"] = "Õ",
  107.     ["ö"] = "Ö",
  108.     ["ø"] = "Ø",
  109.     ["ù"] = "Ù",
  110.     ["ú"] = "Ú",
  111.     ["û"] = "Û",
  112.     ["ü"] = "Ü",
  113.     ["ý"] = "Ý",
  114.     ["þ"] = "Þ",
  115.     ["ÿ"] = "Ÿ",
  116.     ["ā"] = "Ā",
  117.     ["ă"] = "Ă",
  118.     ["ą"] = "Ą",
  119.     ["ć"] = "Ć",
  120.     ["ĉ"] = "Ĉ",
  121.     ["ċ"] = "Ċ",
  122.     ["č"] = "Č",
  123.     ["ď"] = "Ď",
  124.     ["đ"] = "Đ",
  125.     ["ē"] = "Ē",
  126.     ["ĕ"] = "Ĕ",
  127.     ["ė"] = "Ė",
  128.     ["ę"] = "Ę",
  129.     ["ě"] = "Ě",
  130.     ["ĝ"] = "Ĝ",
  131.     ["ğ"] = "Ğ",
  132.     ["ġ"] = "Ġ",
  133.     ["ģ"] = "Ģ",
  134.     ["ĥ"] = "Ĥ",
  135.     ["ħ"] = "Ħ",
  136.     ["ĩ"] = "Ĩ",
  137.     ["ī"] = "Ī",
  138.     ["ĭ"] = "Ĭ",
  139.     ["į"] = "Į",
  140.     ["ı"] = "I",
  141.     ["ij"] = "IJ",
  142.     ["ĵ"] = "Ĵ",
  143.     ["ķ"] = "Ķ",
  144.     ["ĺ"] = "Ĺ",
  145.     ["ļ"] = "Ļ",
  146.     ["ľ"] = "Ľ",
  147.     ["ŀ"] = "Ŀ",
  148.     ["ł"] = "Ł",
  149.     ["ń"] = "Ń",
  150.     ["ņ"] = "Ņ",
  151.     ["ň"] = "Ň",
  152.     ["ŋ"] = "Ŋ",
  153.     ["ō"] = "Ō",
  154.     ["ŏ"] = "Ŏ",
  155.     ["ő"] = "Ő",
  156.     ["œ"] = "Œ",
  157.     ["ŕ"] = "Ŕ",
  158.     ["ŗ"] = "Ŗ",
  159.     ["ř"] = "Ř",
  160.     ["ś"] = "Ś",
  161.     ["ŝ"] = "Ŝ",
  162.     ["ş"] = "Ş",
  163.     ["š"] = "Š",
  164.     ["ţ"] = "Ţ",
  165.     ["ť"] = "Ť",
  166.     ["ŧ"] = "Ŧ",
  167.     ["ũ"] = "Ũ",
  168.     ["ū"] = "Ū",
  169.     ["ŭ"] = "Ŭ",
  170.     ["ů"] = "Ů",
  171.     ["ű"] = "Ű",
  172.     ["ų"] = "Ų",
  173.     ["ŵ"] = "Ŵ",
  174.     ["ŷ"] = "Ŷ",
  175.     ["ź"] = "Ź",
  176.     ["ż"] = "Ż",
  177.     ["ž"] = "Ž",
  178.     ["ſ"] = "S",
  179.     ["ƀ"] = "Ƀ",
  180.     ["ƃ"] = "Ƃ",
  181.     ["ƅ"] = "Ƅ",
  182.     ["ƈ"] = "Ƈ",
  183.     ["ƌ"] = "Ƌ",
  184.     ["ƒ"] = "Ƒ",
  185.     ["ƕ"] = "Ƕ",
  186.     ["ƙ"] = "Ƙ",
  187.     ["ƚ"] = "Ƚ",
  188.     ["ƞ"] = "Ƞ",
  189.     ["ơ"] = "Ơ",
  190.     ["ƣ"] = "Ƣ",
  191.     ["ƥ"] = "Ƥ",
  192.     ["ƨ"] = "Ƨ",
  193.     ["ƭ"] = "Ƭ",
  194.     ["ư"] = "Ư",
  195.     ["ƴ"] = "Ƴ",
  196.     ["ƶ"] = "Ƶ",
  197.     ["ƹ"] = "Ƹ",
  198.     ["ƽ"] = "Ƽ",
  199.     ["ƿ"] = "Ƿ",
  200.     ["Dž"] = "DŽ",
  201.     ["dž"] = "DŽ",
  202.     ["Lj"] = "LJ",
  203.     ["lj"] = "LJ",
  204.     ["Nj"] = "NJ",
  205.     ["nj"] = "NJ",
  206.     ["ǎ"] = "Ǎ",
  207.     ["ǐ"] = "Ǐ",
  208.     ["ǒ"] = "Ǒ",
  209.     ["ǔ"] = "Ǔ",
  210.     ["ǖ"] = "Ǖ",
  211.     ["ǘ"] = "Ǘ",
  212.     ["ǚ"] = "Ǚ",
  213.     ["ǜ"] = "Ǜ",
  214.     ["ǝ"] = "Ǝ",
  215.     ["ǟ"] = "Ǟ",
  216.     ["ǡ"] = "Ǡ",
  217.     ["ǣ"] = "Ǣ",
  218.     ["ǥ"] = "Ǥ",
  219.     ["ǧ"] = "Ǧ",
  220.     ["ǩ"] = "Ǩ",
  221.     ["ǫ"] = "Ǫ",
  222.     ["ǭ"] = "Ǭ",
  223.     ["ǯ"] = "Ǯ",
  224.     ["Dz"] = "DZ",
  225.     ["dz"] = "DZ",
  226.     ["ǵ"] = "Ǵ",
  227.     ["ǹ"] = "Ǹ",
  228.     ["ǻ"] = "Ǻ",
  229.     ["ǽ"] = "Ǽ",
  230.     ["ǿ"] = "Ǿ",
  231.     ["ȁ"] = "Ȁ",
  232.     ["ȃ"] = "Ȃ",
  233.     ["ȅ"] = "Ȅ",
  234.     ["ȇ"] = "Ȇ",
  235.     ["ȉ"] = "Ȉ",
  236.     ["ȋ"] = "Ȋ",
  237.     ["ȍ"] = "Ȍ",
  238.     ["ȏ"] = "Ȏ",
  239.     ["ȑ"] = "Ȑ",
  240.     ["ȓ"] = "Ȓ",
  241.     ["ȕ"] = "Ȕ",
  242.     ["ȗ"] = "Ȗ",
  243.     ["ș"] = "Ș",
  244.     ["ț"] = "Ț",
  245.     ["ȝ"] = "Ȝ",
  246.     ["ȟ"] = "Ȟ",
  247.     ["ȣ"] = "Ȣ",
  248.     ["ȥ"] = "Ȥ",
  249.     ["ȧ"] = "Ȧ",
  250.     ["ȩ"] = "Ȩ",
  251.     ["ȫ"] = "Ȫ",
  252.     ["ȭ"] = "Ȭ",
  253.     ["ȯ"] = "Ȯ",
  254.     ["ȱ"] = "Ȱ",
  255.     ["ȳ"] = "Ȳ",
  256.     ["ȼ"] = "Ȼ",
  257.     ["ɂ"] = "Ɂ",
  258.     ["ɇ"] = "Ɇ",
  259.     ["ɉ"] = "Ɉ",
  260.     ["ɋ"] = "Ɋ",
  261.     ["ɍ"] = "Ɍ",
  262.     ["ɏ"] = "Ɏ",
  263.     ["ɓ"] = "Ɓ",
  264.     ["ɔ"] = "Ɔ",
  265.     ["ɖ"] = "Ɖ",
  266.     ["ɗ"] = "Ɗ",
  267.     ["ə"] = "Ə",
  268.     ["ɛ"] = "Ɛ",
  269.     ["ɠ"] = "Ɠ",
  270.     ["ɣ"] = "Ɣ",
  271.     ["ɨ"] = "Ɨ",
  272.     ["ɩ"] = "Ɩ",
  273.     ["ɫ"] = "Ɫ",
  274.     ["ɯ"] = "Ɯ",
  275.     ["ɲ"] = "Ɲ",
  276.     ["ɵ"] = "Ɵ",
  277.     ["ɽ"] = "Ɽ",
  278.     ["ʀ"] = "Ʀ",
  279.     ["ʃ"] = "Ʃ",
  280.     ["ʈ"] = "Ʈ",
  281.     ["ʉ"] = "Ʉ",
  282.     ["ʊ"] = "Ʊ",
  283.     ["ʋ"] = "Ʋ",
  284.     ["ʌ"] = "Ʌ",
  285.     ["ʒ"] = "Ʒ",
  286.     ["ͅ"] = "Ι",
  287.     ["ͻ"] = "Ͻ",
  288.     ["ͼ"] = "Ͼ",
  289.     ["ͽ"] = "Ͽ",
  290.     ["ά"] = "Ά",
  291.     ["έ"] = "Έ",
  292.     ["ή"] = "Ή",
  293.     ["ί"] = "Ί",
  294.     ["α"] = "Α",
  295.     ["β"] = "Β",
  296.     ["γ"] = "Γ",
  297.     ["δ"] = "Δ",
  298.     ["ε"] = "Ε",
  299.     ["ζ"] = "Ζ",
  300.     ["η"] = "Η",
  301.     ["θ"] = "Θ",
  302.     ["ι"] = "Ι",
  303.     ["κ"] = "Κ",
  304.     ["λ"] = "Λ",
  305.     ["μ"] = "Μ",
  306.     ["ν"] = "Ν",
  307.     ["ξ"] = "Ξ",
  308.     ["ο"] = "Ο",
  309.     ["π"] = "Π",
  310.     ["ρ"] = "Ρ",
  311.     ["ς"] = "Σ",
  312.     ["σ"] = "Σ",
  313.     ["τ"] = "Τ",
  314.     ["υ"] = "Υ",
  315.     ["φ"] = "Φ",
  316.     ["χ"] = "Χ",
  317.     ["ψ"] = "Ψ",
  318.     ["ω"] = "Ω",
  319.     ["ϊ"] = "Ϊ",
  320.     ["ϋ"] = "Ϋ",
  321.     ["ό"] = "Ό",
  322.     ["ύ"] = "Ύ",
  323.     ["ώ"] = "Ώ",
  324.     ["ϐ"] = "Β",
  325.     ["ϑ"] = "Θ",
  326.     ["ϕ"] = "Φ",
  327.     ["ϖ"] = "Π",
  328.     ["ϙ"] = "Ϙ",
  329.     ["ϛ"] = "Ϛ",
  330.     ["ϝ"] = "Ϝ",
  331.     ["ϟ"] = "Ϟ",
  332.     ["ϡ"] = "Ϡ",
  333.     ["ϣ"] = "Ϣ",
  334.     ["ϥ"] = "Ϥ",
  335.     ["ϧ"] = "Ϧ",
  336.     ["ϩ"] = "Ϩ",
  337.     ["ϫ"] = "Ϫ",
  338.     ["ϭ"] = "Ϭ",
  339.     ["ϯ"] = "Ϯ",
  340.     ["ϰ"] = "Κ",
  341.     ["ϱ"] = "Ρ",
  342.     ["ϲ"] = "Ϲ",
  343.     ["ϵ"] = "Ε",
  344.     ["ϸ"] = "Ϸ",
  345.     ["ϻ"] = "Ϻ",
  346.     ["а"] = "А",
  347.     ["б"] = "Б",
  348.     ["в"] = "В",
  349.     ["г"] = "Г",
  350.     ["д"] = "Д",
  351.     ["е"] = "Е",
  352.     ["ж"] = "Ж",
  353.     ["з"] = "З",
  354.     ["и"] = "И",
  355.     ["й"] = "Й",
  356.     ["к"] = "К",
  357.     ["л"] = "Л",
  358.     ["м"] = "М",
  359.     ["н"] = "Н",
  360.     ["о"] = "О",
  361.     ["п"] = "П",
  362.     ["р"] = "Р",
  363.     ["с"] = "С",
  364.     ["т"] = "Т",
  365.     ["у"] = "У",
  366.     ["ф"] = "Ф",
  367.     ["х"] = "Х",
  368.     ["ц"] = "Ц",
  369.     ["ч"] = "Ч",
  370.     ["ш"] = "Ш",
  371.     ["щ"] = "Щ",
  372.     ["ъ"] = "Ъ",
  373.     ["ы"] = "Ы",
  374.     ["ь"] = "Ь",
  375.     ["э"] = "Э",
  376.     ["ю"] = "Ю",
  377.     ["я"] = "Я",
  378.     ["ѐ"] = "Ѐ",
  379.     ["ё"] = "Ё",
  380.     ["ђ"] = "Ђ",
  381.     ["ѓ"] = "Ѓ",
  382.     ["є"] = "Є",
  383.     ["ѕ"] = "Ѕ",
  384.     ["і"] = "І",
  385.     ["ї"] = "Ї",
  386.     ["ј"] = "Ј",
  387.     ["љ"] = "Љ",
  388.     ["њ"] = "Њ",
  389.     ["ћ"] = "Ћ",
  390.     ["ќ"] = "Ќ",
  391.     ["ѝ"] = "Ѝ",
  392.     ["ў"] = "Ў",
  393.     ["џ"] = "Џ",
  394.     ["ѡ"] = "Ѡ",
  395.     ["ѣ"] = "Ѣ",
  396.     ["ѥ"] = "Ѥ",
  397.     ["ѧ"] = "Ѧ",
  398.     ["ѩ"] = "Ѩ",
  399.     ["ѫ"] = "Ѫ",
  400.     ["ѭ"] = "Ѭ",
  401.     ["ѯ"] = "Ѯ",
  402.     ["ѱ"] = "Ѱ",
  403.     ["ѳ"] = "Ѳ",
  404.     ["ѵ"] = "Ѵ",
  405.     ["ѷ"] = "Ѷ",
  406.     ["ѹ"] = "Ѹ",
  407.     ["ѻ"] = "Ѻ",
  408.     ["ѽ"] = "Ѽ",
  409.     ["ѿ"] = "Ѿ",
  410.     ["ҁ"] = "Ҁ",
  411.     ["ҋ"] = "Ҋ",
  412.     ["ҍ"] = "Ҍ",
  413.     ["ҏ"] = "Ҏ",
  414.     ["ґ"] = "Ґ",
  415.     ["ғ"] = "Ғ",
  416.     ["ҕ"] = "Ҕ",
  417.     ["җ"] = "Җ",
  418.     ["ҙ"] = "Ҙ",
  419.     ["қ"] = "Қ",
  420.     ["ҝ"] = "Ҝ",
  421.     ["ҟ"] = "Ҟ",
  422.     ["ҡ"] = "Ҡ",
  423.     ["ң"] = "Ң",
  424.     ["ҥ"] = "Ҥ",
  425.     ["ҧ"] = "Ҧ",
  426.     ["ҩ"] = "Ҩ",
  427.     ["ҫ"] = "Ҫ",
  428.     ["ҭ"] = "Ҭ",
  429.     ["ү"] = "Ү",
  430.     ["ұ"] = "Ұ",
  431.     ["ҳ"] = "Ҳ",
  432.     ["ҵ"] = "Ҵ",
  433.     ["ҷ"] = "Ҷ",
  434.     ["ҹ"] = "Ҹ",
  435.     ["һ"] = "Һ",
  436.     ["ҽ"] = "Ҽ",
  437.     ["ҿ"] = "Ҿ",
  438.     ["ӂ"] = "Ӂ",
  439.     ["ӄ"] = "Ӄ",
  440.     ["ӆ"] = "Ӆ",
  441.     ["ӈ"] = "Ӈ",
  442.     ["ӊ"] = "Ӊ",
  443.     ["ӌ"] = "Ӌ",
  444.     ["ӎ"] = "Ӎ",
  445.     ["ӏ"] = "Ӏ",
  446.     ["ӑ"] = "Ӑ",
  447.     ["ӓ"] = "Ӓ",
  448.     ["ӕ"] = "Ӕ",
  449.     ["ӗ"] = "Ӗ",
  450.     ["ә"] = "Ә",
  451.     ["ӛ"] = "Ӛ",
  452.     ["ӝ"] = "Ӝ",
  453.     ["ӟ"] = "Ӟ",
  454.     ["ӡ"] = "Ӡ",
  455.     ["ӣ"] = "Ӣ",
  456.     ["ӥ"] = "Ӥ",
  457.     ["ӧ"] = "Ӧ",
  458.     ["ө"] = "Ө",
  459.     ["ӫ"] = "Ӫ",
  460.     ["ӭ"] = "Ӭ",
  461.     ["ӯ"] = "Ӯ",
  462.     ["ӱ"] = "Ӱ",
  463.     ["ӳ"] = "Ӳ",
  464.     ["ӵ"] = "Ӵ",
  465.     ["ӷ"] = "Ӷ",
  466.     ["ӹ"] = "Ӹ",
  467.     ["ӻ"] = "Ӻ",
  468.     ["ӽ"] = "Ӽ",
  469.     ["ӿ"] = "Ӿ",
  470.     ["ԁ"] = "Ԁ",
  471.     ["ԃ"] = "Ԃ",
  472.     ["ԅ"] = "Ԅ",
  473.     ["ԇ"] = "Ԇ",
  474.     ["ԉ"] = "Ԉ",
  475.     ["ԋ"] = "Ԋ",
  476.     ["ԍ"] = "Ԍ",
  477.     ["ԏ"] = "Ԏ",
  478.     ["ԑ"] = "Ԑ",
  479.     ["ԓ"] = "Ԓ",
  480.     ["ա"] = "Ա",
  481.     ["բ"] = "Բ",
  482.     ["գ"] = "Գ",
  483.     ["դ"] = "Դ",
  484.     ["ե"] = "Ե",
  485.     ["զ"] = "Զ",
  486.     ["է"] = "Է",
  487.     ["ը"] = "Ը",
  488.     ["թ"] = "Թ",
  489.     ["ժ"] = "Ժ",
  490.     ["ի"] = "Ի",
  491.     ["լ"] = "Լ",
  492.     ["խ"] = "Խ",
  493.     ["ծ"] = "Ծ",
  494.     ["կ"] = "Կ",
  495.     ["հ"] = "Հ",
  496.     ["ձ"] = "Ձ",
  497.     ["ղ"] = "Ղ",
  498.     ["ճ"] = "Ճ",
  499.     ["մ"] = "Մ",
  500.     ["յ"] = "Յ",
  501.     ["ն"] = "Ն",
  502.     ["շ"] = "Շ",
  503.     ["ո"] = "Ո",
  504.     ["չ"] = "Չ",
  505.     ["պ"] = "Պ",
  506.     ["ջ"] = "Ջ",
  507.     ["ռ"] = "Ռ",
  508.     ["ս"] = "Ս",
  509.     ["վ"] = "Վ",
  510.     ["տ"] = "Տ",
  511.     ["ր"] = "Ր",
  512.     ["ց"] = "Ց",
  513.     ["ւ"] = "Ւ",
  514.     ["փ"] = "Փ",
  515.     ["ք"] = "Ք",
  516.     ["օ"] = "Օ",
  517.     ["ֆ"] = "Ֆ",
  518.     ["ᵽ"] = "Ᵽ",
  519.     ["ḁ"] = "Ḁ",
  520.     ["ḃ"] = "Ḃ",
  521.     ["ḅ"] = "Ḅ",
  522.     ["ḇ"] = "Ḇ",
  523.     ["ḉ"] = "Ḉ",
  524.     ["ḋ"] = "Ḋ",
  525.     ["ḍ"] = "Ḍ",
  526.     ["ḏ"] = "Ḏ",
  527.     ["ḑ"] = "Ḑ",
  528.     ["ḓ"] = "Ḓ",
  529.     ["ḕ"] = "Ḕ",
  530.     ["ḗ"] = "Ḗ",
  531.     ["ḙ"] = "Ḙ",
  532.     ["ḛ"] = "Ḛ",
  533.     ["ḝ"] = "Ḝ",
  534.     ["ḟ"] = "Ḟ",
  535.     ["ḡ"] = "Ḡ",
  536.     ["ḣ"] = "Ḣ",
  537.     ["ḥ"] = "Ḥ",
  538.     ["ḧ"] = "Ḧ",
  539.     ["ḩ"] = "Ḩ",
  540.     ["ḫ"] = "Ḫ",
  541.     ["ḭ"] = "Ḭ",
  542.     ["ḯ"] = "Ḯ",
  543.     ["ḱ"] = "Ḱ",
  544.     ["ḳ"] = "Ḳ",
  545.     ["ḵ"] = "Ḵ",
  546.     ["ḷ"] = "Ḷ",
  547.     ["ḹ"] = "Ḹ",
  548.     ["ḻ"] = "Ḻ",
  549.     ["ḽ"] = "Ḽ",
  550.     ["ḿ"] = "Ḿ",
  551.     ["ṁ"] = "Ṁ",
  552.     ["ṃ"] = "Ṃ",
  553.     ["ṅ"] = "Ṅ",
  554.     ["ṇ"] = "Ṇ",
  555.     ["ṉ"] = "Ṉ",
  556.     ["ṋ"] = "Ṋ",
  557.     ["ṍ"] = "Ṍ",
  558.     ["ṏ"] = "Ṏ",
  559.     ["ṑ"] = "Ṑ",
  560.     ["ṓ"] = "Ṓ",
  561.     ["ṕ"] = "Ṕ",
  562.     ["ṗ"] = "Ṗ",
  563.     ["ṙ"] = "Ṙ",
  564.     ["ṛ"] = "Ṛ",
  565.     ["ṝ"] = "Ṝ",
  566.     ["ṟ"] = "Ṟ",
  567.     ["ṡ"] = "Ṡ",
  568.     ["ṣ"] = "Ṣ",
  569.     ["ṥ"] = "Ṥ",
  570.     ["ṧ"] = "Ṧ",
  571.     ["ṩ"] = "Ṩ",
  572.     ["ṫ"] = "Ṫ",
  573.     ["ṭ"] = "Ṭ",
  574.     ["ṯ"] = "Ṯ",
  575.     ["ṱ"] = "Ṱ",
  576.     ["ṳ"] = "Ṳ",
  577.     ["ṵ"] = "Ṵ",
  578.     ["ṷ"] = "Ṷ",
  579.     ["ṹ"] = "Ṹ",
  580.     ["ṻ"] = "Ṻ",
  581.     ["ṽ"] = "Ṽ",
  582.     ["ṿ"] = "Ṿ",
  583.     ["ẁ"] = "Ẁ",
  584.     ["ẃ"] = "Ẃ",
  585.     ["ẅ"] = "Ẅ",
  586.     ["ẇ"] = "Ẇ",
  587.     ["ẉ"] = "Ẉ",
  588.     ["ẋ"] = "Ẋ",
  589.     ["ẍ"] = "Ẍ",
  590.     ["ẏ"] = "Ẏ",
  591.     ["ẑ"] = "Ẑ",
  592.     ["ẓ"] = "Ẓ",
  593.     ["ẕ"] = "Ẕ",
  594.     ["ẛ"] = "Ṡ",
  595.     ["ạ"] = "Ạ",
  596.     ["ả"] = "Ả",
  597.     ["ấ"] = "Ấ",
  598.     ["ầ"] = "Ầ",
  599.     ["ẩ"] = "Ẩ",
  600.     ["ẫ"] = "Ẫ",
  601.     ["ậ"] = "Ậ",
  602.     ["ắ"] = "Ắ",
  603.     ["ằ"] = "Ằ",
  604.     ["ẳ"] = "Ẳ",
  605.     ["ẵ"] = "Ẵ",
  606.     ["ặ"] = "Ặ",
  607.     ["ẹ"] = "Ẹ",
  608.     ["ẻ"] = "Ẻ",
  609.     ["ẽ"] = "Ẽ",
  610.     ["ế"] = "Ế",
  611.     ["ề"] = "Ề",
  612.     ["ể"] = "Ể",
  613.     ["ễ"] = "Ễ",
  614.     ["ệ"] = "Ệ",
  615.     ["ỉ"] = "Ỉ",
  616.     ["ị"] = "Ị",
  617.     ["ọ"] = "Ọ",
  618.     ["ỏ"] = "Ỏ",
  619.     ["ố"] = "Ố",
  620.     ["ồ"] = "Ồ",
  621.     ["ổ"] = "Ổ",
  622.     ["ỗ"] = "Ỗ",
  623.     ["ộ"] = "Ộ",
  624.     ["ớ"] = "Ớ",
  625.     ["ờ"] = "Ờ",
  626.     ["ở"] = "Ở",
  627.     ["ỡ"] = "Ỡ",
  628.     ["ợ"] = "Ợ",
  629.     ["ụ"] = "Ụ",
  630.     ["ủ"] = "Ủ",
  631.     ["ứ"] = "Ứ",
  632.     ["ừ"] = "Ừ",
  633.     ["ử"] = "Ử",
  634.     ["ữ"] = "Ữ",
  635.     ["ự"] = "Ự",
  636.     ["ỳ"] = "Ỳ",
  637.     ["ỵ"] = "Ỵ",
  638.     ["ỷ"] = "Ỷ",
  639.     ["ỹ"] = "Ỹ",
  640.     ["ἀ"] = "Ἀ",
  641.     ["ἁ"] = "Ἁ",
  642.     ["ἂ"] = "Ἂ",
  643.     ["ἃ"] = "Ἃ",
  644.     ["ἄ"] = "Ἄ",
  645.     ["ἅ"] = "Ἅ",
  646.     ["ἆ"] = "Ἆ",
  647.     ["ἇ"] = "Ἇ",
  648.     ["ἐ"] = "Ἐ",
  649.     ["ἑ"] = "Ἑ",
  650.     ["ἒ"] = "Ἒ",
  651.     ["ἓ"] = "Ἓ",
  652.     ["ἔ"] = "Ἔ",
  653.     ["ἕ"] = "Ἕ",
  654.     ["ἠ"] = "Ἠ",
  655.     ["ἡ"] = "Ἡ",
  656.     ["ἢ"] = "Ἢ",
  657.     ["ἣ"] = "Ἣ",
  658.     ["ἤ"] = "Ἤ",
  659.     ["ἥ"] = "Ἥ",
  660.     ["ἦ"] = "Ἦ",
  661.     ["ἧ"] = "Ἧ",
  662.     ["ἰ"] = "Ἰ",
  663.     ["ἱ"] = "Ἱ",
  664.     ["ἲ"] = "Ἲ",
  665.     ["ἳ"] = "Ἳ",
  666.     ["ἴ"] = "Ἴ",
  667.     ["ἵ"] = "Ἵ",
  668.     ["ἶ"] = "Ἶ",
  669.     ["ἷ"] = "Ἷ",
  670.     ["ὀ"] = "Ὀ",
  671.     ["ὁ"] = "Ὁ",
  672.     ["ὂ"] = "Ὂ",
  673.     ["ὃ"] = "Ὃ",
  674.     ["ὄ"] = "Ὄ",
  675.     ["ὅ"] = "Ὅ",
  676.     ["ὑ"] = "Ὑ",
  677.     ["ὓ"] = "Ὓ",
  678.     ["ὕ"] = "Ὕ",
  679.     ["ὗ"] = "Ὗ",
  680.     ["ὠ"] = "Ὠ",
  681.     ["ὡ"] = "Ὡ",
  682.     ["ὢ"] = "Ὢ",
  683.     ["ὣ"] = "Ὣ",
  684.     ["ὤ"] = "Ὤ",
  685.     ["ὥ"] = "Ὥ",
  686.     ["ὦ"] = "Ὦ",
  687.     ["ὧ"] = "Ὧ",
  688.     ["ὰ"] = "Ὰ",
  689.     ["ά"] = "Ά",
  690.     ["ὲ"] = "Ὲ",
  691.     ["έ"] = "Έ",
  692.     ["ὴ"] = "Ὴ",
  693.     ["ή"] = "Ή",
  694.     ["ὶ"] = "Ὶ",
  695.     ["ί"] = "Ί",
  696.     ["ὸ"] = "Ὸ",
  697.     ["ό"] = "Ό",
  698.     ["ὺ"] = "Ὺ",
  699.     ["ύ"] = "Ύ",
  700.     ["ὼ"] = "Ὼ",
  701.     ["ώ"] = "Ώ",
  702.     ["ᾀ"] = "ᾈ",
  703.     ["ᾁ"] = "ᾉ",
  704.     ["ᾂ"] = "ᾊ",
  705.     ["ᾃ"] = "ᾋ",
  706.     ["ᾄ"] = "ᾌ",
  707.     ["ᾅ"] = "ᾍ",
  708.     ["ᾆ"] = "ᾎ",
  709.     ["ᾇ"] = "ᾏ",
  710.     ["ᾐ"] = "ᾘ",
  711.     ["ᾑ"] = "ᾙ",
  712.     ["ᾒ"] = "ᾚ",
  713.     ["ᾓ"] = "ᾛ",
  714.     ["ᾔ"] = "ᾜ",
  715.     ["ᾕ"] = "ᾝ",
  716.     ["ᾖ"] = "ᾞ",
  717.     ["ᾗ"] = "ᾟ",
  718.     ["ᾠ"] = "ᾨ",
  719.     ["ᾡ"] = "ᾩ",
  720.     ["ᾢ"] = "ᾪ",
  721.     ["ᾣ"] = "ᾫ",
  722.     ["ᾤ"] = "ᾬ",
  723.     ["ᾥ"] = "ᾭ",
  724.     ["ᾦ"] = "ᾮ",
  725.     ["ᾧ"] = "ᾯ",
  726.     ["ᾰ"] = "Ᾰ",
  727.     ["ᾱ"] = "Ᾱ",
  728.     ["ᾳ"] = "ᾼ",
  729.     ["ι"] = "Ι",
  730.     ["ῃ"] = "ῌ",
  731.     ["ῐ"] = "Ῐ",
  732.     ["ῑ"] = "Ῑ",
  733.     ["ῠ"] = "Ῠ",
  734.     ["ῡ"] = "Ῡ",
  735.     ["ῥ"] = "Ῥ",
  736.     ["ῳ"] = "ῼ",
  737.     ["ⅎ"] = "Ⅎ",
  738.     ["ⅰ"] = "Ⅰ",
  739.     ["ⅱ"] = "Ⅱ",
  740.     ["ⅲ"] = "Ⅲ",
  741.     ["ⅳ"] = "Ⅳ",
  742.     ["ⅴ"] = "Ⅴ",
  743.     ["ⅵ"] = "Ⅵ",
  744.     ["ⅶ"] = "Ⅶ",
  745.     ["ⅷ"] = "Ⅷ",
  746.     ["ⅸ"] = "Ⅸ",
  747.     ["ⅹ"] = "Ⅹ",
  748.     ["ⅺ"] = "Ⅺ",
  749.     ["ⅻ"] = "Ⅻ",
  750.     ["ⅼ"] = "Ⅼ",
  751.     ["ⅽ"] = "Ⅽ",
  752.     ["ⅾ"] = "Ⅾ",
  753.     ["ⅿ"] = "Ⅿ",
  754.     ["ↄ"] = "Ↄ",
  755.     ["ⓐ"] = "Ⓐ",
  756.     ["ⓑ"] = "Ⓑ",
  757.     ["ⓒ"] = "Ⓒ",
  758.     ["ⓓ"] = "Ⓓ",
  759.     ["ⓔ"] = "Ⓔ",
  760.     ["ⓕ"] = "Ⓕ",
  761.     ["ⓖ"] = "Ⓖ",
  762.     ["ⓗ"] = "Ⓗ",
  763.     ["ⓘ"] = "Ⓘ",
  764.     ["ⓙ"] = "Ⓙ",
  765.     ["ⓚ"] = "Ⓚ",
  766.     ["ⓛ"] = "Ⓛ",
  767.     ["ⓜ"] = "Ⓜ",
  768.     ["ⓝ"] = "Ⓝ",
  769.     ["ⓞ"] = "Ⓞ",
  770.     ["ⓟ"] = "Ⓟ",
  771.     ["ⓠ"] = "Ⓠ",
  772.     ["ⓡ"] = "Ⓡ",
  773.     ["ⓢ"] = "Ⓢ",
  774.     ["ⓣ"] = "Ⓣ",
  775.     ["ⓤ"] = "Ⓤ",
  776.     ["ⓥ"] = "Ⓥ",
  777.     ["ⓦ"] = "Ⓦ",
  778.     ["ⓧ"] = "Ⓧ",
  779.     ["ⓨ"] = "Ⓨ",
  780.     ["ⓩ"] = "Ⓩ",
  781.     ["ⰰ"] = "Ⰰ",
  782.     ["ⰱ"] = "Ⰱ",
  783.     ["ⰲ"] = "Ⰲ",
  784.     ["ⰳ"] = "Ⰳ",
  785.     ["ⰴ"] = "Ⰴ",
  786.     ["ⰵ"] = "Ⰵ",
  787.     ["ⰶ"] = "Ⰶ",
  788.     ["ⰷ"] = "Ⰷ",
  789.     ["ⰸ"] = "Ⰸ",
  790.     ["ⰹ"] = "Ⰹ",
  791.     ["ⰺ"] = "Ⰺ",
  792.     ["ⰻ"] = "Ⰻ",
  793.     ["ⰼ"] = "Ⰼ",
  794.     ["ⰽ"] = "Ⰽ",
  795.     ["ⰾ"] = "Ⰾ",
  796.     ["ⰿ"] = "Ⰿ",
  797.     ["ⱀ"] = "Ⱀ",
  798.     ["ⱁ"] = "Ⱁ",
  799.     ["ⱂ"] = "Ⱂ",
  800.     ["ⱃ"] = "Ⱃ",
  801.     ["ⱄ"] = "Ⱄ",
  802.     ["ⱅ"] = "Ⱅ",
  803.     ["ⱆ"] = "Ⱆ",
  804.     ["ⱇ"] = "Ⱇ",
  805.     ["ⱈ"] = "Ⱈ",
  806.     ["ⱉ"] = "Ⱉ",
  807.     ["ⱊ"] = "Ⱊ",
  808.     ["ⱋ"] = "Ⱋ",
  809.     ["ⱌ"] = "Ⱌ",
  810.     ["ⱍ"] = "Ⱍ",
  811.     ["ⱎ"] = "Ⱎ",
  812.     ["ⱏ"] = "Ⱏ",
  813.     ["ⱐ"] = "Ⱐ",
  814.     ["ⱑ"] = "Ⱑ",
  815.     ["ⱒ"] = "Ⱒ",
  816.     ["ⱓ"] = "Ⱓ",
  817.     ["ⱔ"] = "Ⱔ",
  818.     ["ⱕ"] = "Ⱕ",
  819.     ["ⱖ"] = "Ⱖ",
  820.     ["ⱗ"] = "Ⱗ",
  821.     ["ⱘ"] = "Ⱘ",
  822.     ["ⱙ"] = "Ⱙ",
  823.     ["ⱚ"] = "Ⱚ",
  824.     ["ⱛ"] = "Ⱛ",
  825.     ["ⱜ"] = "Ⱜ",
  826.     ["ⱝ"] = "Ⱝ",
  827.     ["ⱞ"] = "Ⱞ",
  828.     ["ⱡ"] = "Ⱡ",
  829.     ["ⱥ"] = "Ⱥ",
  830.     ["ⱦ"] = "Ⱦ",
  831.     ["ⱨ"] = "Ⱨ",
  832.     ["ⱪ"] = "Ⱪ",
  833.     ["ⱬ"] = "Ⱬ",
  834.     ["ⱶ"] = "Ⱶ",
  835.     ["ⲁ"] = "Ⲁ",
  836.     ["ⲃ"] = "Ⲃ",
  837.     ["ⲅ"] = "Ⲅ",
  838.     ["ⲇ"] = "Ⲇ",
  839.     ["ⲉ"] = "Ⲉ",
  840.     ["ⲋ"] = "Ⲋ",
  841.     ["ⲍ"] = "Ⲍ",
  842.     ["ⲏ"] = "Ⲏ",
  843.     ["ⲑ"] = "Ⲑ",
  844.     ["ⲓ"] = "Ⲓ",
  845.     ["ⲕ"] = "Ⲕ",
  846.     ["ⲗ"] = "Ⲗ",
  847.     ["ⲙ"] = "Ⲙ",
  848.     ["ⲛ"] = "Ⲛ",
  849.     ["ⲝ"] = "Ⲝ",
  850.     ["ⲟ"] = "Ⲟ",
  851.     ["ⲡ"] = "Ⲡ",
  852.     ["ⲣ"] = "Ⲣ",
  853.     ["ⲥ"] = "Ⲥ",
  854.     ["ⲧ"] = "Ⲧ",
  855.     ["ⲩ"] = "Ⲩ",
  856.     ["ⲫ"] = "Ⲫ",
  857.     ["ⲭ"] = "Ⲭ",
  858.     ["ⲯ"] = "Ⲯ",
  859.     ["ⲱ"] = "Ⲱ",
  860.     ["ⲳ"] = "Ⲳ",
  861.     ["ⲵ"] = "Ⲵ",
  862.     ["ⲷ"] = "Ⲷ",
  863.     ["ⲹ"] = "Ⲹ",
  864.     ["ⲻ"] = "Ⲻ",
  865.     ["ⲽ"] = "Ⲽ",
  866.     ["ⲿ"] = "Ⲿ",
  867.     ["ⳁ"] = "Ⳁ",
  868.     ["ⳃ"] = "Ⳃ",
  869.     ["ⳅ"] = "Ⳅ",
  870.     ["ⳇ"] = "Ⳇ",
  871.     ["ⳉ"] = "Ⳉ",
  872.     ["ⳋ"] = "Ⳋ",
  873.     ["ⳍ"] = "Ⳍ",
  874.     ["ⳏ"] = "Ⳏ",
  875.     ["ⳑ"] = "Ⳑ",
  876.     ["ⳓ"] = "Ⳓ",
  877.     ["ⳕ"] = "Ⳕ",
  878.     ["ⳗ"] = "Ⳗ",
  879.     ["ⳙ"] = "Ⳙ",
  880.     ["ⳛ"] = "Ⳛ",
  881.     ["ⳝ"] = "Ⳝ",
  882.     ["ⳟ"] = "Ⳟ",
  883.     ["ⳡ"] = "Ⳡ",
  884.     ["ⳣ"] = "Ⳣ",
  885.     ["ⴀ"] = "Ⴀ",
  886.     ["ⴁ"] = "Ⴁ",
  887.     ["ⴂ"] = "Ⴂ",
  888.     ["ⴃ"] = "Ⴃ",
  889.     ["ⴄ"] = "Ⴄ",
  890.     ["ⴅ"] = "Ⴅ",
  891.     ["ⴆ"] = "Ⴆ",
  892.     ["ⴇ"] = "Ⴇ",
  893.     ["ⴈ"] = "Ⴈ",
  894.     ["ⴉ"] = "Ⴉ",
  895.     ["ⴊ"] = "Ⴊ",
  896.     ["ⴋ"] = "Ⴋ",
  897.     ["ⴌ"] = "Ⴌ",
  898.     ["ⴍ"] = "Ⴍ",
  899.     ["ⴎ"] = "Ⴎ",
  900.     ["ⴏ"] = "Ⴏ",
  901.     ["ⴐ"] = "Ⴐ",
  902.     ["ⴑ"] = "Ⴑ",
  903.     ["ⴒ"] = "Ⴒ",
  904.     ["ⴓ"] = "Ⴓ",
  905.     ["ⴔ"] = "Ⴔ",
  906.     ["ⴕ"] = "Ⴕ",
  907.     ["ⴖ"] = "Ⴖ",
  908.     ["ⴗ"] = "Ⴗ",
  909.     ["ⴘ"] = "Ⴘ",
  910.     ["ⴙ"] = "Ⴙ",
  911.     ["ⴚ"] = "Ⴚ",
  912.     ["ⴛ"] = "Ⴛ",
  913.     ["ⴜ"] = "Ⴜ",
  914.     ["ⴝ"] = "Ⴝ",
  915.     ["ⴞ"] = "Ⴞ",
  916.     ["ⴟ"] = "Ⴟ",
  917.     ["ⴠ"] = "Ⴠ",
  918.     ["ⴡ"] = "Ⴡ",
  919.     ["ⴢ"] = "Ⴢ",
  920.     ["ⴣ"] = "Ⴣ",
  921.     ["ⴤ"] = "Ⴤ",
  922.     ["ⴥ"] = "Ⴥ",
  923.     ["a"] = "A",
  924.     ["b"] = "B",
  925.     ["c"] = "C",
  926.     ["d"] = "D",
  927.     ["e"] = "E",
  928.     ["f"] = "F",
  929.     ["g"] = "G",
  930.     ["h"] = "H",
  931.     ["i"] = "I",
  932.     ["j"] = "J",
  933.     ["k"] = "K",
  934.     ["l"] = "L",
  935.     ["m"] = "M",
  936.     ["n"] = "N",
  937.     ["o"] = "O",
  938.     ["p"] = "P",
  939.     ["q"] = "Q",
  940.     ["r"] = "R",
  941.     ["s"] = "S",
  942.     ["t"] = "T",
  943.     ["u"] = "U",
  944.     ["v"] = "V",
  945.     ["w"] = "W",
  946.     ["x"] = "X",
  947.     ["y"] = "Y",
  948.     ["z"] = "Z",
  949.     ["𐐨"] = "𐐀",
  950.     ["𐐩"] = "𐐁",
  951.     ["𐐪"] = "𐐂",
  952.     ["𐐫"] = "𐐃",
  953.     ["𐐬"] = "𐐄",
  954.     ["𐐭"] = "𐐅",
  955.     ["𐐮"] = "𐐆",
  956.     ["𐐯"] = "𐐇",
  957.     ["𐐰"] = "𐐈",
  958.     ["𐐱"] = "𐐉",
  959.     ["𐐲"] = "𐐊",
  960.     ["𐐳"] = "𐐋",
  961.     ["𐐴"] = "𐐌",
  962.     ["𐐵"] = "𐐍",
  963.     ["𐐶"] = "𐐎",
  964.     ["𐐷"] = "𐐏",
  965.     ["𐐸"] = "𐐐",
  966.     ["𐐹"] = "𐐑",
  967.     ["𐐺"] = "𐐒",
  968.     ["𐐻"] = "𐐓",
  969.     ["𐐼"] = "𐐔",
  970.     ["𐐽"] = "𐐕",
  971.     ["𐐾"] = "𐐖",
  972.     ["𐐿"] = "𐐗",
  973.     ["𐑀"] = "𐐘",
  974.     ["𐑁"] = "𐐙",
  975.     ["𐑂"] = "𐐚",
  976.     ["𐑃"] = "𐐛",
  977.     ["𐑄"] = "𐐜",
  978.     ["𐑅"] = "𐐝",
  979.     ["𐑆"] = "𐐞",
  980.     ["𐑇"] = "𐐟",
  981.     ["𐑈"] = "𐐠",
  982.     ["𐑉"] = "𐐡",
  983.     ["𐑊"] = "𐐢",
  984.     ["𐑋"] = "𐐣",
  985.     ["𐑌"] = "𐐤",
  986.     ["𐑍"] = "𐐥",
  987.     ["𐑎"] = "𐐦",
  988.     ["𐑏"] = "𐐧",
  989. }
  990.  
  991.  
  992. local utf8_uc_lc = {
  993.     ["A"] = "a",
  994.     ["B"] = "b",
  995.     ["C"] = "c",
  996.     ["D"] = "d",
  997.     ["E"] = "e",
  998.     ["F"] = "f",
  999.     ["G"] = "g",
  1000.     ["H"] = "h",
  1001.     ["I"] = "i",
  1002.     ["J"] = "j",
  1003.     ["K"] = "k",
  1004.     ["L"] = "l",
  1005.     ["M"] = "m",
  1006.     ["N"] = "n",
  1007.     ["O"] = "o",
  1008.     ["P"] = "p",
  1009.     ["Q"] = "q",
  1010.     ["R"] = "r",
  1011.     ["S"] = "s",
  1012.     ["T"] = "t",
  1013.     ["U"] = "u",
  1014.     ["V"] = "v",
  1015.     ["W"] = "w",
  1016.     ["X"] = "x",
  1017.     ["Y"] = "y",
  1018.     ["Z"] = "z",
  1019.     ["À"] = "à",
  1020.     ["Á"] = "á",
  1021.     ["Â"] = "â",
  1022.     ["Ã"] = "ã",
  1023.     ["Ä"] = "ä",
  1024.     ["Å"] = "å",
  1025.     ["Æ"] = "æ",
  1026.     ["Ç"] = "ç",
  1027.     ["È"] = "è",
  1028.     ["É"] = "é",
  1029.     ["Ê"] = "ê",
  1030.     ["Ë"] = "ë",
  1031.     ["Ì"] = "ì",
  1032.     ["Í"] = "í",
  1033.     ["Î"] = "î",
  1034.     ["Ï"] = "ï",
  1035.     ["Ð"] = "ð",
  1036.     ["Ñ"] = "ñ",
  1037.     ["Ò"] = "ò",
  1038.     ["Ó"] = "ó",
  1039.     ["Ô"] = "ô",
  1040.     ["Õ"] = "õ",
  1041.     ["Ö"] = "ö",
  1042.     ["Ø"] = "ø",
  1043.     ["Ù"] = "ù",
  1044.     ["Ú"] = "ú",
  1045.     ["Û"] = "û",
  1046.     ["Ü"] = "ü",
  1047.     ["Ý"] = "ý",
  1048.     ["Þ"] = "þ",
  1049.     ["Ā"] = "ā",
  1050.     ["Ă"] = "ă",
  1051.     ["Ą"] = "ą",
  1052.     ["Ć"] = "ć",
  1053.     ["Ĉ"] = "ĉ",
  1054.     ["Ċ"] = "ċ",
  1055.     ["Č"] = "č",
  1056.     ["Ď"] = "ď",
  1057.     ["Đ"] = "đ",
  1058.     ["Ē"] = "ē",
  1059.     ["Ĕ"] = "ĕ",
  1060.     ["Ė"] = "ė",
  1061.     ["Ę"] = "ę",
  1062.     ["Ě"] = "ě",
  1063.     ["Ĝ"] = "ĝ",
  1064.     ["Ğ"] = "ğ",
  1065.     ["Ġ"] = "ġ",
  1066.     ["Ģ"] = "ģ",
  1067.     ["Ĥ"] = "ĥ",
  1068.     ["Ħ"] = "ħ",
  1069.     ["Ĩ"] = "ĩ",
  1070.     ["Ī"] = "ī",
  1071.     ["Ĭ"] = "ĭ",
  1072.     ["Į"] = "į",
  1073.     ["İ"] = "i",
  1074.     ["IJ"] = "ij",
  1075.     ["Ĵ"] = "ĵ",
  1076.     ["Ķ"] = "ķ",
  1077.     ["Ĺ"] = "ĺ",
  1078.     ["Ļ"] = "ļ",
  1079.     ["Ľ"] = "ľ",
  1080.     ["Ŀ"] = "ŀ",
  1081.     ["Ł"] = "ł",
  1082.     ["Ń"] = "ń",
  1083.     ["Ņ"] = "ņ",
  1084.     ["Ň"] = "ň",
  1085.     ["Ŋ"] = "ŋ",
  1086.     ["Ō"] = "ō",
  1087.     ["Ŏ"] = "ŏ",
  1088.     ["Ő"] = "ő",
  1089.     ["Œ"] = "œ",
  1090.     ["Ŕ"] = "ŕ",
  1091.     ["Ŗ"] = "ŗ",
  1092.     ["Ř"] = "ř",
  1093.     ["Ś"] = "ś",
  1094.     ["Ŝ"] = "ŝ",
  1095.     ["Ş"] = "ş",
  1096.     ["Š"] = "š",
  1097.     ["Ţ"] = "ţ",
  1098.     ["Ť"] = "ť",
  1099.     ["Ŧ"] = "ŧ",
  1100.     ["Ũ"] = "ũ",
  1101.     ["Ū"] = "ū",
  1102.     ["Ŭ"] = "ŭ",
  1103.     ["Ů"] = "ů",
  1104.     ["Ű"] = "ű",
  1105.     ["Ų"] = "ų",
  1106.     ["Ŵ"] = "ŵ",
  1107.     ["Ŷ"] = "ŷ",
  1108.     ["Ÿ"] = "ÿ",
  1109.     ["Ź"] = "ź",
  1110.     ["Ż"] = "ż",
  1111.     ["Ž"] = "ž",
  1112.     ["Ɓ"] = "ɓ",
  1113.     ["Ƃ"] = "ƃ",
  1114.     ["Ƅ"] = "ƅ",
  1115.     ["Ɔ"] = "ɔ",
  1116.     ["Ƈ"] = "ƈ",
  1117.     ["Ɖ"] = "ɖ",
  1118.     ["Ɗ"] = "ɗ",
  1119.     ["Ƌ"] = "ƌ",
  1120.     ["Ǝ"] = "ǝ",
  1121.     ["Ə"] = "ə",
  1122.     ["Ɛ"] = "ɛ",
  1123.     ["Ƒ"] = "ƒ",
  1124.     ["Ɠ"] = "ɠ",
  1125.     ["Ɣ"] = "ɣ",
  1126.     ["Ɩ"] = "ɩ",
  1127.     ["Ɨ"] = "ɨ",
  1128.     ["Ƙ"] = "ƙ",
  1129.     ["Ɯ"] = "ɯ",
  1130.     ["Ɲ"] = "ɲ",
  1131.     ["Ɵ"] = "ɵ",
  1132.     ["Ơ"] = "ơ",
  1133.     ["Ƣ"] = "ƣ",
  1134.     ["Ƥ"] = "ƥ",
  1135.     ["Ʀ"] = "ʀ",
  1136.     ["Ƨ"] = "ƨ",
  1137.     ["Ʃ"] = "ʃ",
  1138.     ["Ƭ"] = "ƭ",
  1139.     ["Ʈ"] = "ʈ",
  1140.     ["Ư"] = "ư",
  1141.     ["Ʊ"] = "ʊ",
  1142.     ["Ʋ"] = "ʋ",
  1143.     ["Ƴ"] = "ƴ",
  1144.     ["Ƶ"] = "ƶ",
  1145.     ["Ʒ"] = "ʒ",
  1146.     ["Ƹ"] = "ƹ",
  1147.     ["Ƽ"] = "ƽ",
  1148.     ["DŽ"] = "dž",
  1149.     ["Dž"] = "dž",
  1150.     ["LJ"] = "lj",
  1151.     ["Lj"] = "lj",
  1152.     ["NJ"] = "nj",
  1153.     ["Nj"] = "nj",
  1154.     ["Ǎ"] = "ǎ",
  1155.     ["Ǐ"] = "ǐ",
  1156.     ["Ǒ"] = "ǒ",
  1157.     ["Ǔ"] = "ǔ",
  1158.     ["Ǖ"] = "ǖ",
  1159.     ["Ǘ"] = "ǘ",
  1160.     ["Ǚ"] = "ǚ",
  1161.     ["Ǜ"] = "ǜ",
  1162.     ["Ǟ"] = "ǟ",
  1163.     ["Ǡ"] = "ǡ",
  1164.     ["Ǣ"] = "ǣ",
  1165.     ["Ǥ"] = "ǥ",
  1166.     ["Ǧ"] = "ǧ",
  1167.     ["Ǩ"] = "ǩ",
  1168.     ["Ǫ"] = "ǫ",
  1169.     ["Ǭ"] = "ǭ",
  1170.     ["Ǯ"] = "ǯ",
  1171.     ["DZ"] = "dz",
  1172.     ["Dz"] = "dz",
  1173.     ["Ǵ"] = "ǵ",
  1174.     ["Ƕ"] = "ƕ",
  1175.     ["Ƿ"] = "ƿ",
  1176.     ["Ǹ"] = "ǹ",
  1177.     ["Ǻ"] = "ǻ",
  1178.     ["Ǽ"] = "ǽ",
  1179.     ["Ǿ"] = "ǿ",
  1180.     ["Ȁ"] = "ȁ",
  1181.     ["Ȃ"] = "ȃ",
  1182.     ["Ȅ"] = "ȅ",
  1183.     ["Ȇ"] = "ȇ",
  1184.     ["Ȉ"] = "ȉ",
  1185.     ["Ȋ"] = "ȋ",
  1186.     ["Ȍ"] = "ȍ",
  1187.     ["Ȏ"] = "ȏ",
  1188.     ["Ȑ"] = "ȑ",
  1189.     ["Ȓ"] = "ȓ",
  1190.     ["Ȕ"] = "ȕ",
  1191.     ["Ȗ"] = "ȗ",
  1192.     ["Ș"] = "ș",
  1193.     ["Ț"] = "ț",
  1194.     ["Ȝ"] = "ȝ",
  1195.     ["Ȟ"] = "ȟ",
  1196.     ["Ƞ"] = "ƞ",
  1197.     ["Ȣ"] = "ȣ",
  1198.     ["Ȥ"] = "ȥ",
  1199.     ["Ȧ"] = "ȧ",
  1200.     ["Ȩ"] = "ȩ",
  1201.     ["Ȫ"] = "ȫ",
  1202.     ["Ȭ"] = "ȭ",
  1203.     ["Ȯ"] = "ȯ",
  1204.     ["Ȱ"] = "ȱ",
  1205.     ["Ȳ"] = "ȳ",
  1206.     ["Ⱥ"] = "ⱥ",
  1207.     ["Ȼ"] = "ȼ",
  1208.     ["Ƚ"] = "ƚ",
  1209.     ["Ⱦ"] = "ⱦ",
  1210.     ["Ɂ"] = "ɂ",
  1211.     ["Ƀ"] = "ƀ",
  1212.     ["Ʉ"] = "ʉ",
  1213.     ["Ʌ"] = "ʌ",
  1214.     ["Ɇ"] = "ɇ",
  1215.     ["Ɉ"] = "ɉ",
  1216.     ["Ɋ"] = "ɋ",
  1217.     ["Ɍ"] = "ɍ",
  1218.     ["Ɏ"] = "ɏ",
  1219.     ["Ά"] = "ά",
  1220.     ["Έ"] = "έ",
  1221.     ["Ή"] = "ή",
  1222.     ["Ί"] = "ί",
  1223.     ["Ό"] = "ό",
  1224.     ["Ύ"] = "ύ",
  1225.     ["Ώ"] = "ώ",
  1226.     ["Α"] = "α",
  1227.     ["Β"] = "β",
  1228.     ["Γ"] = "γ",
  1229.     ["Δ"] = "δ",
  1230.     ["Ε"] = "ε",
  1231.     ["Ζ"] = "ζ",
  1232.     ["Η"] = "η",
  1233.     ["Θ"] = "θ",
  1234.     ["Ι"] = "ι",
  1235.     ["Κ"] = "κ",
  1236.     ["Λ"] = "λ",
  1237.     ["Μ"] = "μ",
  1238.     ["Ν"] = "ν",
  1239.     ["Ξ"] = "ξ",
  1240.     ["Ο"] = "ο",
  1241.     ["Π"] = "π",
  1242.     ["Ρ"] = "ρ",
  1243.     ["Σ"] = "σ",
  1244.     ["Τ"] = "τ",
  1245.     ["Υ"] = "υ",
  1246.     ["Φ"] = "φ",
  1247.     ["Χ"] = "χ",
  1248.     ["Ψ"] = "ψ",
  1249.     ["Ω"] = "ω",
  1250.     ["Ϊ"] = "ϊ",
  1251.     ["Ϋ"] = "ϋ",
  1252.     ["Ϙ"] = "ϙ",
  1253.     ["Ϛ"] = "ϛ",
  1254.     ["Ϝ"] = "ϝ",
  1255.     ["Ϟ"] = "ϟ",
  1256.     ["Ϡ"] = "ϡ",
  1257.     ["Ϣ"] = "ϣ",
  1258.     ["Ϥ"] = "ϥ",
  1259.     ["Ϧ"] = "ϧ",
  1260.     ["Ϩ"] = "ϩ",
  1261.     ["Ϫ"] = "ϫ",
  1262.     ["Ϭ"] = "ϭ",
  1263.     ["Ϯ"] = "ϯ",
  1264.     ["ϴ"] = "θ",
  1265.     ["Ϸ"] = "ϸ",
  1266.     ["Ϲ"] = "ϲ",
  1267.     ["Ϻ"] = "ϻ",
  1268.     ["Ͻ"] = "ͻ",
  1269.     ["Ͼ"] = "ͼ",
  1270.     ["Ͽ"] = "ͽ",
  1271.     ["Ѐ"] = "ѐ",
  1272.     ["Ё"] = "ё",
  1273.     ["Ђ"] = "ђ",
  1274.     ["Ѓ"] = "ѓ",
  1275.     ["Є"] = "є",
  1276.     ["Ѕ"] = "ѕ",
  1277.     ["І"] = "і",
  1278.     ["Ї"] = "ї",
  1279.     ["Ј"] = "ј",
  1280.     ["Љ"] = "љ",
  1281.     ["Њ"] = "њ",
  1282.     ["Ћ"] = "ћ",
  1283.     ["Ќ"] = "ќ",
  1284.     ["Ѝ"] = "ѝ",
  1285.     ["Ў"] = "ў",
  1286.     ["Џ"] = "џ",
  1287.     ["А"] = "а",
  1288.     ["Б"] = "б",
  1289.     ["В"] = "в",
  1290.     ["Г"] = "г",
  1291.     ["Д"] = "д",
  1292.     ["Е"] = "е",
  1293.     ["Ж"] = "ж",
  1294.     ["З"] = "з",
  1295.     ["И"] = "и",
  1296.     ["Й"] = "й",
  1297.     ["К"] = "к",
  1298.     ["Л"] = "л",
  1299.     ["М"] = "м",
  1300.     ["Н"] = "н",
  1301.     ["О"] = "о",
  1302.     ["П"] = "п",
  1303.     ["Р"] = "р",
  1304.     ["С"] = "с",
  1305.     ["Т"] = "т",
  1306.     ["У"] = "у",
  1307.     ["Ф"] = "ф",
  1308.     ["Х"] = "х",
  1309.     ["Ц"] = "ц",
  1310.     ["Ч"] = "ч",
  1311.     ["Ш"] = "ш",
  1312.     ["Щ"] = "щ",
  1313.     ["Ъ"] = "ъ",
  1314.     ["Ы"] = "ы",
  1315.     ["Ь"] = "ь",
  1316.     ["Э"] = "э",
  1317.     ["Ю"] = "ю",
  1318.     ["Я"] = "я",
  1319.     ["Ѡ"] = "ѡ",
  1320.     ["Ѣ"] = "ѣ",
  1321.     ["Ѥ"] = "ѥ",
  1322.     ["Ѧ"] = "ѧ",
  1323.     ["Ѩ"] = "ѩ",
  1324.     ["Ѫ"] = "ѫ",
  1325.     ["Ѭ"] = "ѭ",
  1326.     ["Ѯ"] = "ѯ",
  1327.     ["Ѱ"] = "ѱ",
  1328.     ["Ѳ"] = "ѳ",
  1329.     ["Ѵ"] = "ѵ",
  1330.     ["Ѷ"] = "ѷ",
  1331.     ["Ѹ"] = "ѹ",
  1332.     ["Ѻ"] = "ѻ",
  1333.     ["Ѽ"] = "ѽ",
  1334.     ["Ѿ"] = "ѿ",
  1335.     ["Ҁ"] = "ҁ",
  1336.     ["Ҋ"] = "ҋ",
  1337.     ["Ҍ"] = "ҍ",
  1338.     ["Ҏ"] = "ҏ",
  1339.     ["Ґ"] = "ґ",
  1340.     ["Ғ"] = "ғ",
  1341.     ["Ҕ"] = "ҕ",
  1342.     ["Җ"] = "җ",
  1343.     ["Ҙ"] = "ҙ",
  1344.     ["Қ"] = "қ",
  1345.     ["Ҝ"] = "ҝ",
  1346.     ["Ҟ"] = "ҟ",
  1347.     ["Ҡ"] = "ҡ",
  1348.     ["Ң"] = "ң",
  1349.     ["Ҥ"] = "ҥ",
  1350.     ["Ҧ"] = "ҧ",
  1351.     ["Ҩ"] = "ҩ",
  1352.     ["Ҫ"] = "ҫ",
  1353.     ["Ҭ"] = "ҭ",
  1354.     ["Ү"] = "ү",
  1355.     ["Ұ"] = "ұ",
  1356.     ["Ҳ"] = "ҳ",
  1357.     ["Ҵ"] = "ҵ",
  1358.     ["Ҷ"] = "ҷ",
  1359.     ["Ҹ"] = "ҹ",
  1360.     ["Һ"] = "һ",
  1361.     ["Ҽ"] = "ҽ",
  1362.     ["Ҿ"] = "ҿ",
  1363.     ["Ӏ"] = "ӏ",
  1364.     ["Ӂ"] = "ӂ",
  1365.     ["Ӄ"] = "ӄ",
  1366.     ["Ӆ"] = "ӆ",
  1367.     ["Ӈ"] = "ӈ",
  1368.     ["Ӊ"] = "ӊ",
  1369.     ["Ӌ"] = "ӌ",
  1370.     ["Ӎ"] = "ӎ",
  1371.     ["Ӑ"] = "ӑ",
  1372.     ["Ӓ"] = "ӓ",
  1373.     ["Ӕ"] = "ӕ",
  1374.     ["Ӗ"] = "ӗ",
  1375.     ["Ә"] = "ә",
  1376.     ["Ӛ"] = "ӛ",
  1377.     ["Ӝ"] = "ӝ",
  1378.     ["Ӟ"] = "ӟ",
  1379.     ["Ӡ"] = "ӡ",
  1380.     ["Ӣ"] = "ӣ",
  1381.     ["Ӥ"] = "ӥ",
  1382.     ["Ӧ"] = "ӧ",
  1383.     ["Ө"] = "ө",
  1384.     ["Ӫ"] = "ӫ",
  1385.     ["Ӭ"] = "ӭ",
  1386.     ["Ӯ"] = "ӯ",
  1387.     ["Ӱ"] = "ӱ",
  1388.     ["Ӳ"] = "ӳ",
  1389.     ["Ӵ"] = "ӵ",
  1390.     ["Ӷ"] = "ӷ",
  1391.     ["Ӹ"] = "ӹ",
  1392.     ["Ӻ"] = "ӻ",
  1393.     ["Ӽ"] = "ӽ",
  1394.     ["Ӿ"] = "ӿ",
  1395.     ["Ԁ"] = "ԁ",
  1396.     ["Ԃ"] = "ԃ",
  1397.     ["Ԅ"] = "ԅ",
  1398.     ["Ԇ"] = "ԇ",
  1399.     ["Ԉ"] = "ԉ",
  1400.     ["Ԋ"] = "ԋ",
  1401.     ["Ԍ"] = "ԍ",
  1402.     ["Ԏ"] = "ԏ",
  1403.     ["Ԑ"] = "ԑ",
  1404.     ["Ԓ"] = "ԓ",
  1405.     ["Ա"] = "ա",
  1406.     ["Բ"] = "բ",
  1407.     ["Գ"] = "գ",
  1408.     ["Դ"] = "դ",
  1409.     ["Ե"] = "ե",
  1410.     ["Զ"] = "զ",
  1411.     ["Է"] = "է",
  1412.     ["Ը"] = "ը",
  1413.     ["Թ"] = "թ",
  1414.     ["Ժ"] = "ժ",
  1415.     ["Ի"] = "ի",
  1416.     ["Լ"] = "լ",
  1417.     ["Խ"] = "խ",
  1418.     ["Ծ"] = "ծ",
  1419.     ["Կ"] = "կ",
  1420.     ["Հ"] = "հ",
  1421.     ["Ձ"] = "ձ",
  1422.     ["Ղ"] = "ղ",
  1423.     ["Ճ"] = "ճ",
  1424.     ["Մ"] = "մ",
  1425.     ["Յ"] = "յ",
  1426.     ["Ն"] = "ն",
  1427.     ["Շ"] = "շ",
  1428.     ["Ո"] = "ո",
  1429.     ["Չ"] = "չ",
  1430.     ["Պ"] = "պ",
  1431.     ["Ջ"] = "ջ",
  1432.     ["Ռ"] = "ռ",
  1433.     ["Ս"] = "ս",
  1434.     ["Վ"] = "վ",
  1435.     ["Տ"] = "տ",
  1436.     ["Ր"] = "ր",
  1437.     ["Ց"] = "ց",
  1438.     ["Ւ"] = "ւ",
  1439.     ["Փ"] = "փ",
  1440.     ["Ք"] = "ք",
  1441.     ["Օ"] = "օ",
  1442.     ["Ֆ"] = "ֆ",
  1443.     ["Ⴀ"] = "ⴀ",
  1444.     ["Ⴁ"] = "ⴁ",
  1445.     ["Ⴂ"] = "ⴂ",
  1446.     ["Ⴃ"] = "ⴃ",
  1447.     ["Ⴄ"] = "ⴄ",
  1448.     ["Ⴅ"] = "ⴅ",
  1449.     ["Ⴆ"] = "ⴆ",
  1450.     ["Ⴇ"] = "ⴇ",
  1451.     ["Ⴈ"] = "ⴈ",
  1452.     ["Ⴉ"] = "ⴉ",
  1453.     ["Ⴊ"] = "ⴊ",
  1454.     ["Ⴋ"] = "ⴋ",
  1455.     ["Ⴌ"] = "ⴌ",
  1456.     ["Ⴍ"] = "ⴍ",
  1457.     ["Ⴎ"] = "ⴎ",
  1458.     ["Ⴏ"] = "ⴏ",
  1459.     ["Ⴐ"] = "ⴐ",
  1460.     ["Ⴑ"] = "ⴑ",
  1461.     ["Ⴒ"] = "ⴒ",
  1462.     ["Ⴓ"] = "ⴓ",
  1463.     ["Ⴔ"] = "ⴔ",
  1464.     ["Ⴕ"] = "ⴕ",
  1465.     ["Ⴖ"] = "ⴖ",
  1466.     ["Ⴗ"] = "ⴗ",
  1467.     ["Ⴘ"] = "ⴘ",
  1468.     ["Ⴙ"] = "ⴙ",
  1469.     ["Ⴚ"] = "ⴚ",
  1470.     ["Ⴛ"] = "ⴛ",
  1471.     ["Ⴜ"] = "ⴜ",
  1472.     ["Ⴝ"] = "ⴝ",
  1473.     ["Ⴞ"] = "ⴞ",
  1474.     ["Ⴟ"] = "ⴟ",
  1475.     ["Ⴠ"] = "ⴠ",
  1476.     ["Ⴡ"] = "ⴡ",
  1477.     ["Ⴢ"] = "ⴢ",
  1478.     ["Ⴣ"] = "ⴣ",
  1479.     ["Ⴤ"] = "ⴤ",
  1480.     ["Ⴥ"] = "ⴥ",
  1481.     ["Ḁ"] = "ḁ",
  1482.     ["Ḃ"] = "ḃ",
  1483.     ["Ḅ"] = "ḅ",
  1484.     ["Ḇ"] = "ḇ",
  1485.     ["Ḉ"] = "ḉ",
  1486.     ["Ḋ"] = "ḋ",
  1487.     ["Ḍ"] = "ḍ",
  1488.     ["Ḏ"] = "ḏ",
  1489.     ["Ḑ"] = "ḑ",
  1490.     ["Ḓ"] = "ḓ",
  1491.     ["Ḕ"] = "ḕ",
  1492.     ["Ḗ"] = "ḗ",
  1493.     ["Ḙ"] = "ḙ",
  1494.     ["Ḛ"] = "ḛ",
  1495.     ["Ḝ"] = "ḝ",
  1496.     ["Ḟ"] = "ḟ",
  1497.     ["Ḡ"] = "ḡ",
  1498.     ["Ḣ"] = "ḣ",
  1499.     ["Ḥ"] = "ḥ",
  1500.     ["Ḧ"] = "ḧ",
  1501.     ["Ḩ"] = "ḩ",
  1502.     ["Ḫ"] = "ḫ",
  1503.     ["Ḭ"] = "ḭ",
  1504.     ["Ḯ"] = "ḯ",
  1505.     ["Ḱ"] = "ḱ",
  1506.     ["Ḳ"] = "ḳ",
  1507.     ["Ḵ"] = "ḵ",
  1508.     ["Ḷ"] = "ḷ",
  1509.     ["Ḹ"] = "ḹ",
  1510.     ["Ḻ"] = "ḻ",
  1511.     ["Ḽ"] = "ḽ",
  1512.     ["Ḿ"] = "ḿ",
  1513.     ["Ṁ"] = "ṁ",
  1514.     ["Ṃ"] = "ṃ",
  1515.     ["Ṅ"] = "ṅ",
  1516.     ["Ṇ"] = "ṇ",
  1517.     ["Ṉ"] = "ṉ",
  1518.     ["Ṋ"] = "ṋ",
  1519.     ["Ṍ"] = "ṍ",
  1520.     ["Ṏ"] = "ṏ",
  1521.     ["Ṑ"] = "ṑ",
  1522.     ["Ṓ"] = "ṓ",
  1523.     ["Ṕ"] = "ṕ",
  1524.     ["Ṗ"] = "ṗ",
  1525.     ["Ṙ"] = "ṙ",
  1526.     ["Ṛ"] = "ṛ",
  1527.     ["Ṝ"] = "ṝ",
  1528.     ["Ṟ"] = "ṟ",
  1529.     ["Ṡ"] = "ṡ",
  1530.     ["Ṣ"] = "ṣ",
  1531.     ["Ṥ"] = "ṥ",
  1532.     ["Ṧ"] = "ṧ",
  1533.     ["Ṩ"] = "ṩ",
  1534.     ["Ṫ"] = "ṫ",
  1535.     ["Ṭ"] = "ṭ",
  1536.     ["Ṯ"] = "ṯ",
  1537.     ["Ṱ"] = "ṱ",
  1538.     ["Ṳ"] = "ṳ",
  1539.     ["Ṵ"] = "ṵ",
  1540.     ["Ṷ"] = "ṷ",
  1541.     ["Ṹ"] = "ṹ",
  1542.     ["Ṻ"] = "ṻ",
  1543.     ["Ṽ"] = "ṽ",
  1544.     ["Ṿ"] = "ṿ",
  1545.     ["Ẁ"] = "ẁ",
  1546.     ["Ẃ"] = "ẃ",
  1547.     ["Ẅ"] = "ẅ",
  1548.     ["Ẇ"] = "ẇ",
  1549.     ["Ẉ"] = "ẉ",
  1550.     ["Ẋ"] = "ẋ",
  1551.     ["Ẍ"] = "ẍ",
  1552.     ["Ẏ"] = "ẏ",
  1553.     ["Ẑ"] = "ẑ",
  1554.     ["Ẓ"] = "ẓ",
  1555.     ["Ẕ"] = "ẕ",
  1556.     ["Ạ"] = "ạ",
  1557.     ["Ả"] = "ả",
  1558.     ["Ấ"] = "ấ",
  1559.     ["Ầ"] = "ầ",
  1560.     ["Ẩ"] = "ẩ",
  1561.     ["Ẫ"] = "ẫ",
  1562.     ["Ậ"] = "ậ",
  1563.     ["Ắ"] = "ắ",
  1564.     ["Ằ"] = "ằ",
  1565.     ["Ẳ"] = "ẳ",
  1566.     ["Ẵ"] = "ẵ",
  1567.     ["Ặ"] = "ặ",
  1568.     ["Ẹ"] = "ẹ",
  1569.     ["Ẻ"] = "ẻ",
  1570.     ["Ẽ"] = "ẽ",
  1571.     ["Ế"] = "ế",
  1572.     ["Ề"] = "ề",
  1573.     ["Ể"] = "ể",
  1574.     ["Ễ"] = "ễ",
  1575.     ["Ệ"] = "ệ",
  1576.     ["Ỉ"] = "ỉ",
  1577.     ["Ị"] = "ị",
  1578.     ["Ọ"] = "ọ",
  1579.     ["Ỏ"] = "ỏ",
  1580.     ["Ố"] = "ố",
  1581.     ["Ồ"] = "ồ",
  1582.     ["Ổ"] = "ổ",
  1583.     ["Ỗ"] = "ỗ",
  1584.     ["Ộ"] = "ộ",
  1585.     ["Ớ"] = "ớ",
  1586.     ["Ờ"] = "ờ",
  1587.     ["Ở"] = "ở",
  1588.     ["Ỡ"] = "ỡ",
  1589.     ["Ợ"] = "ợ",
  1590.     ["Ụ"] = "ụ",
  1591.     ["Ủ"] = "ủ",
  1592.     ["Ứ"] = "ứ",
  1593.     ["Ừ"] = "ừ",
  1594.     ["Ử"] = "ử",
  1595.     ["Ữ"] = "ữ",
  1596.     ["Ự"] = "ự",
  1597.     ["Ỳ"] = "ỳ",
  1598.     ["Ỵ"] = "ỵ",
  1599.     ["Ỷ"] = "ỷ",
  1600.     ["Ỹ"] = "ỹ",
  1601.     ["Ἀ"] = "ἀ",
  1602.     ["Ἁ"] = "ἁ",
  1603.     ["Ἂ"] = "ἂ",
  1604.     ["Ἃ"] = "ἃ",
  1605.     ["Ἄ"] = "ἄ",
  1606.     ["Ἅ"] = "ἅ",
  1607.     ["Ἆ"] = "ἆ",
  1608.     ["Ἇ"] = "ἇ",
  1609.     ["Ἐ"] = "ἐ",
  1610.     ["Ἑ"] = "ἑ",
  1611.     ["Ἒ"] = "ἒ",
  1612.     ["Ἓ"] = "ἓ",
  1613.     ["Ἔ"] = "ἔ",
  1614.     ["Ἕ"] = "ἕ",
  1615.     ["Ἠ"] = "ἠ",
  1616.     ["Ἡ"] = "ἡ",
  1617.     ["Ἢ"] = "ἢ",
  1618.     ["Ἣ"] = "ἣ",
  1619.     ["Ἤ"] = "ἤ",
  1620.     ["Ἥ"] = "ἥ",
  1621.     ["Ἦ"] = "ἦ",
  1622.     ["Ἧ"] = "ἧ",
  1623.     ["Ἰ"] = "ἰ",
  1624.     ["Ἱ"] = "ἱ",
  1625.     ["Ἲ"] = "ἲ",
  1626.     ["Ἳ"] = "ἳ",
  1627.     ["Ἴ"] = "ἴ",
  1628.     ["Ἵ"] = "ἵ",
  1629.     ["Ἶ"] = "ἶ",
  1630.     ["Ἷ"] = "ἷ",
  1631.     ["Ὀ"] = "ὀ",
  1632.     ["Ὁ"] = "ὁ",
  1633.     ["Ὂ"] = "ὂ",
  1634.     ["Ὃ"] = "ὃ",
  1635.     ["Ὄ"] = "ὄ",
  1636.     ["Ὅ"] = "ὅ",
  1637.     ["Ὑ"] = "ὑ",
  1638.     ["Ὓ"] = "ὓ",
  1639.     ["Ὕ"] = "ὕ",
  1640.     ["Ὗ"] = "ὗ",
  1641.     ["Ὠ"] = "ὠ",
  1642.     ["Ὡ"] = "ὡ",
  1643.     ["Ὢ"] = "ὢ",
  1644.     ["Ὣ"] = "ὣ",
  1645.     ["Ὤ"] = "ὤ",
  1646.     ["Ὥ"] = "ὥ",
  1647.     ["Ὦ"] = "ὦ",
  1648.     ["Ὧ"] = "ὧ",
  1649.     ["ᾈ"] = "ᾀ",
  1650.     ["ᾉ"] = "ᾁ",
  1651.     ["ᾊ"] = "ᾂ",
  1652.     ["ᾋ"] = "ᾃ",
  1653.     ["ᾌ"] = "ᾄ",
  1654.     ["ᾍ"] = "ᾅ",
  1655.     ["ᾎ"] = "ᾆ",
  1656.     ["ᾏ"] = "ᾇ",
  1657.     ["ᾘ"] = "ᾐ",
  1658.     ["ᾙ"] = "ᾑ",
  1659.     ["ᾚ"] = "ᾒ",
  1660.     ["ᾛ"] = "ᾓ",
  1661.     ["ᾜ"] = "ᾔ",
  1662.     ["ᾝ"] = "ᾕ",
  1663.     ["ᾞ"] = "ᾖ",
  1664.     ["ᾟ"] = "ᾗ",
  1665.     ["ᾨ"] = "ᾠ",
  1666.     ["ᾩ"] = "ᾡ",
  1667.     ["ᾪ"] = "ᾢ",
  1668.     ["ᾫ"] = "ᾣ",
  1669.     ["ᾬ"] = "ᾤ",
  1670.     ["ᾭ"] = "ᾥ",
  1671.     ["ᾮ"] = "ᾦ",
  1672.     ["ᾯ"] = "ᾧ",
  1673.     ["Ᾰ"] = "ᾰ",
  1674.     ["Ᾱ"] = "ᾱ",
  1675.     ["Ὰ"] = "ὰ",
  1676.     ["Ά"] = "ά",
  1677.     ["ᾼ"] = "ᾳ",
  1678.     ["Ὲ"] = "ὲ",
  1679.     ["Έ"] = "έ",
  1680.     ["Ὴ"] = "ὴ",
  1681.     ["Ή"] = "ή",
  1682.     ["ῌ"] = "ῃ",
  1683.     ["Ῐ"] = "ῐ",
  1684.     ["Ῑ"] = "ῑ",
  1685.     ["Ὶ"] = "ὶ",
  1686.     ["Ί"] = "ί",
  1687.     ["Ῠ"] = "ῠ",
  1688.     ["Ῡ"] = "ῡ",
  1689.     ["Ὺ"] = "ὺ",
  1690.     ["Ύ"] = "ύ",
  1691.     ["Ῥ"] = "ῥ",
  1692.     ["Ὸ"] = "ὸ",
  1693.     ["Ό"] = "ό",
  1694.     ["Ὼ"] = "ὼ",
  1695.     ["Ώ"] = "ώ",
  1696.     ["ῼ"] = "ῳ",
  1697.     ["Ω"] = "ω",
  1698.     ["K"] = "k",
  1699.     ["Å"] = "å",
  1700.     ["Ⅎ"] = "ⅎ",
  1701.     ["Ⅰ"] = "ⅰ",
  1702.     ["Ⅱ"] = "ⅱ",
  1703.     ["Ⅲ"] = "ⅲ",
  1704.     ["Ⅳ"] = "ⅳ",
  1705.     ["Ⅴ"] = "ⅴ",
  1706.     ["Ⅵ"] = "ⅵ",
  1707.     ["Ⅶ"] = "ⅶ",
  1708.     ["Ⅷ"] = "ⅷ",
  1709.     ["Ⅸ"] = "ⅸ",
  1710.     ["Ⅹ"] = "ⅹ",
  1711.     ["Ⅺ"] = "ⅺ",
  1712.     ["Ⅻ"] = "ⅻ",
  1713.     ["Ⅼ"] = "ⅼ",
  1714.     ["Ⅽ"] = "ⅽ",
  1715.     ["Ⅾ"] = "ⅾ",
  1716.     ["Ⅿ"] = "ⅿ",
  1717.     ["Ↄ"] = "ↄ",
  1718.     ["Ⓐ"] = "ⓐ",
  1719.     ["Ⓑ"] = "ⓑ",
  1720.     ["Ⓒ"] = "ⓒ",
  1721.     ["Ⓓ"] = "ⓓ",
  1722.     ["Ⓔ"] = "ⓔ",
  1723.     ["Ⓕ"] = "ⓕ",
  1724.     ["Ⓖ"] = "ⓖ",
  1725.     ["Ⓗ"] = "ⓗ",
  1726.     ["Ⓘ"] = "ⓘ",
  1727.     ["Ⓙ"] = "ⓙ",
  1728.     ["Ⓚ"] = "ⓚ",
  1729.     ["Ⓛ"] = "ⓛ",
  1730.     ["Ⓜ"] = "ⓜ",
  1731.     ["Ⓝ"] = "ⓝ",
  1732.     ["Ⓞ"] = "ⓞ",
  1733.     ["Ⓟ"] = "ⓟ",
  1734.     ["Ⓠ"] = "ⓠ",
  1735.     ["Ⓡ"] = "ⓡ",
  1736.     ["Ⓢ"] = "ⓢ",
  1737.     ["Ⓣ"] = "ⓣ",
  1738.     ["Ⓤ"] = "ⓤ",
  1739.     ["Ⓥ"] = "ⓥ",
  1740.     ["Ⓦ"] = "ⓦ",
  1741.     ["Ⓧ"] = "ⓧ",
  1742.     ["Ⓨ"] = "ⓨ",
  1743.     ["Ⓩ"] = "ⓩ",
  1744.     ["Ⰰ"] = "ⰰ",
  1745.     ["Ⰱ"] = "ⰱ",
  1746.     ["Ⰲ"] = "ⰲ",
  1747.     ["Ⰳ"] = "ⰳ",
  1748.     ["Ⰴ"] = "ⰴ",
  1749.     ["Ⰵ"] = "ⰵ",
  1750.     ["Ⰶ"] = "ⰶ",
  1751.     ["Ⰷ"] = "ⰷ",
  1752.     ["Ⰸ"] = "ⰸ",
  1753.     ["Ⰹ"] = "ⰹ",
  1754.     ["Ⰺ"] = "ⰺ",
  1755.     ["Ⰻ"] = "ⰻ",
  1756.     ["Ⰼ"] = "ⰼ",
  1757.     ["Ⰽ"] = "ⰽ",
  1758.     ["Ⰾ"] = "ⰾ",
  1759.     ["Ⰿ"] = "ⰿ",
  1760.     ["Ⱀ"] = "ⱀ",
  1761.     ["Ⱁ"] = "ⱁ",
  1762.     ["Ⱂ"] = "ⱂ",
  1763.     ["Ⱃ"] = "ⱃ",
  1764.     ["Ⱄ"] = "ⱄ",
  1765.     ["Ⱅ"] = "ⱅ",
  1766.     ["Ⱆ"] = "ⱆ",
  1767.     ["Ⱇ"] = "ⱇ",
  1768.     ["Ⱈ"] = "ⱈ",
  1769.     ["Ⱉ"] = "ⱉ",
  1770.     ["Ⱊ"] = "ⱊ",
  1771.     ["Ⱋ"] = "ⱋ",
  1772.     ["Ⱌ"] = "ⱌ",
  1773.     ["Ⱍ"] = "ⱍ",
  1774.     ["Ⱎ"] = "ⱎ",
  1775.     ["Ⱏ"] = "ⱏ",
  1776.     ["Ⱐ"] = "ⱐ",
  1777.     ["Ⱑ"] = "ⱑ",
  1778.     ["Ⱒ"] = "ⱒ",
  1779.     ["Ⱓ"] = "ⱓ",
  1780.     ["Ⱔ"] = "ⱔ",
  1781.     ["Ⱕ"] = "ⱕ",
  1782.     ["Ⱖ"] = "ⱖ",
  1783.     ["Ⱗ"] = "ⱗ",
  1784.     ["Ⱘ"] = "ⱘ",
  1785.     ["Ⱙ"] = "ⱙ",
  1786.     ["Ⱚ"] = "ⱚ",
  1787.     ["Ⱛ"] = "ⱛ",
  1788.     ["Ⱜ"] = "ⱜ",
  1789.     ["Ⱝ"] = "ⱝ",
  1790.     ["Ⱞ"] = "ⱞ",
  1791.     ["Ⱡ"] = "ⱡ",
  1792.     ["Ɫ"] = "ɫ",
  1793.     ["Ᵽ"] = "ᵽ",
  1794.     ["Ɽ"] = "ɽ",
  1795.     ["Ⱨ"] = "ⱨ",
  1796.     ["Ⱪ"] = "ⱪ",
  1797.     ["Ⱬ"] = "ⱬ",
  1798.     ["Ⱶ"] = "ⱶ",
  1799.     ["Ⲁ"] = "ⲁ",
  1800.     ["Ⲃ"] = "ⲃ",
  1801.     ["Ⲅ"] = "ⲅ",
  1802.     ["Ⲇ"] = "ⲇ",
  1803.     ["Ⲉ"] = "ⲉ",
  1804.     ["Ⲋ"] = "ⲋ",
  1805.     ["Ⲍ"] = "ⲍ",
  1806.     ["Ⲏ"] = "ⲏ",
  1807.     ["Ⲑ"] = "ⲑ",
  1808.     ["Ⲓ"] = "ⲓ",
  1809.     ["Ⲕ"] = "ⲕ",
  1810.     ["Ⲗ"] = "ⲗ",
  1811.     ["Ⲙ"] = "ⲙ",
  1812.     ["Ⲛ"] = "ⲛ",
  1813.     ["Ⲝ"] = "ⲝ",
  1814.     ["Ⲟ"] = "ⲟ",
  1815.     ["Ⲡ"] = "ⲡ",
  1816.     ["Ⲣ"] = "ⲣ",
  1817.     ["Ⲥ"] = "ⲥ",
  1818.     ["Ⲧ"] = "ⲧ",
  1819.     ["Ⲩ"] = "ⲩ",
  1820.     ["Ⲫ"] = "ⲫ",
  1821.     ["Ⲭ"] = "ⲭ",
  1822.     ["Ⲯ"] = "ⲯ",
  1823.     ["Ⲱ"] = "ⲱ",
  1824.     ["Ⲳ"] = "ⲳ",
  1825.     ["Ⲵ"] = "ⲵ",
  1826.     ["Ⲷ"] = "ⲷ",
  1827.     ["Ⲹ"] = "ⲹ",
  1828.     ["Ⲻ"] = "ⲻ",
  1829.     ["Ⲽ"] = "ⲽ",
  1830.     ["Ⲿ"] = "ⲿ",
  1831.     ["Ⳁ"] = "ⳁ",
  1832.     ["Ⳃ"] = "ⳃ",
  1833.     ["Ⳅ"] = "ⳅ",
  1834.     ["Ⳇ"] = "ⳇ",
  1835.     ["Ⳉ"] = "ⳉ",
  1836.     ["Ⳋ"] = "ⳋ",
  1837.     ["Ⳍ"] = "ⳍ",
  1838.     ["Ⳏ"] = "ⳏ",
  1839.     ["Ⳑ"] = "ⳑ",
  1840.     ["Ⳓ"] = "ⳓ",
  1841.     ["Ⳕ"] = "ⳕ",
  1842.     ["Ⳗ"] = "ⳗ",
  1843.     ["Ⳙ"] = "ⳙ",
  1844.     ["Ⳛ"] = "ⳛ",
  1845.     ["Ⳝ"] = "ⳝ",
  1846.     ["Ⳟ"] = "ⳟ",
  1847.     ["Ⳡ"] = "ⳡ",
  1848.     ["Ⳣ"] = "ⳣ",
  1849.     ["A"] = "a",
  1850.     ["B"] = "b",
  1851.     ["C"] = "c",
  1852.     ["D"] = "d",
  1853.     ["E"] = "e",
  1854.     ["F"] = "f",
  1855.     ["G"] = "g",
  1856.     ["H"] = "h",
  1857.     ["I"] = "i",
  1858.     ["J"] = "j",
  1859.     ["K"] = "k",
  1860.     ["L"] = "l",
  1861.     ["M"] = "m",
  1862.     ["N"] = "n",
  1863.     ["O"] = "o",
  1864.     ["P"] = "p",
  1865.     ["Q"] = "q",
  1866.     ["R"] = "r",
  1867.     ["S"] = "s",
  1868.     ["T"] = "t",
  1869.     ["U"] = "u",
  1870.     ["V"] = "v",
  1871.     ["W"] = "w",
  1872.     ["X"] = "x",
  1873.     ["Y"] = "y",
  1874.     ["Z"] = "z",
  1875.     ["𐐀"] = "𐐨",
  1876.     ["𐐁"] = "𐐩",
  1877.     ["𐐂"] = "𐐪",
  1878.     ["𐐃"] = "𐐫",
  1879.     ["𐐄"] = "𐐬",
  1880.     ["𐐅"] = "𐐭",
  1881.     ["𐐆"] = "𐐮",
  1882.     ["𐐇"] = "𐐯",
  1883.     ["𐐈"] = "𐐰",
  1884.     ["𐐉"] = "𐐱",
  1885.     ["𐐊"] = "𐐲",
  1886.     ["𐐋"] = "𐐳",
  1887.     ["𐐌"] = "𐐴",
  1888.     ["𐐍"] = "𐐵",
  1889.     ["𐐎"] = "𐐶",
  1890.     ["𐐏"] = "𐐷",
  1891.     ["𐐐"] = "𐐸",
  1892.     ["𐐑"] = "𐐹",
  1893.     ["𐐒"] = "𐐺",
  1894.     ["𐐓"] = "𐐻",
  1895.     ["𐐔"] = "𐐼",
  1896.     ["𐐕"] = "𐐽",
  1897.     ["𐐖"] = "𐐾",
  1898.     ["𐐗"] = "𐐿",
  1899.     ["𐐘"] = "𐑀",
  1900.     ["𐐙"] = "𐑁",
  1901.     ["𐐚"] = "𐑂",
  1902.     ["𐐛"] = "𐑃",
  1903.     ["𐐜"] = "𐑄",
  1904.     ["𐐝"] = "𐑅",
  1905.     ["𐐞"] = "𐑆",
  1906.     ["𐐟"] = "𐑇",
  1907.     ["𐐠"] = "𐑈",
  1908.     ["𐐡"] = "𐑉",
  1909.     ["𐐢"] = "𐑊",
  1910.     ["𐐣"] = "𐑋",
  1911.     ["𐐤"] = "𐑌",
  1912.     ["𐐥"] = "𐑍",
  1913.     ["𐐦"] = "𐑎",
  1914.     ["𐐧"] = "𐑏",
  1915. }
  1916.  
  1917.  
  1918.  
  1919. -- returns the number of bytes used by the UTF-8 character at byte i in s
  1920. -- also doubles as a UTF-8 character validator
  1921. local function utf8charbytes (s, i)
  1922.     -- argument defaults
  1923.     i = i or 1
  1924.  
  1925.     -- argument checking
  1926.     if type(s) ~= "string" then
  1927.         error("bad argument #1 to 'utf8charbytes' (string expected, got ".. type(s).. ")")
  1928.     end
  1929.     if type(i) ~= "number" then
  1930.         error("bad argument #2 to 'utf8charbytes' (number expected, got ".. type(i).. ")")
  1931.     end
  1932.  
  1933.     local c = s:byte(i)
  1934.  
  1935.     -- determine bytes needed for character, based on RFC 3629
  1936.     -- validate byte 1
  1937.     if c > 0 and c <= 127 then
  1938.         -- UTF8-1
  1939.         return 1
  1940.  
  1941.     elseif c >= 194 and c <= 223 then
  1942.         -- UTF8-2
  1943.         local c2 = s:byte(i + 1)
  1944.  
  1945.         if not c2 then
  1946.             error("UTF-8 string terminated early")
  1947.         end
  1948.  
  1949.         -- validate byte 2
  1950.         if c2 < 128 or c2 > 191 then
  1951.             error("Invalid UTF-8 character")
  1952.         end
  1953.  
  1954.         return 2
  1955.  
  1956.     elseif c >= 224 and c <= 239 then
  1957.         -- UTF8-3
  1958.         local c2 = s:byte(i + 1)
  1959.         local c3 = s:byte(i + 2)
  1960.  
  1961.         if not c2 or not c3 then
  1962.             error("UTF-8 string terminated early")
  1963.         end
  1964.  
  1965.         -- validate byte 2
  1966.         if c == 224 and (c2 < 160 or c2 > 191) then
  1967.             error("Invalid UTF-8 character")
  1968.         elseif c == 237 and (c2 < 128 or c2 > 159) then
  1969.             error("Invalid UTF-8 character")
  1970.         elseif c2 < 128 or c2 > 191 then
  1971.             error("Invalid UTF-8 character")
  1972.         end
  1973.  
  1974.         -- validate byte 3
  1975.         if c3 < 128 or c3 > 191 then
  1976.             error("Invalid UTF-8 character")
  1977.         end
  1978.  
  1979.         return 3
  1980.  
  1981.     elseif c >= 240 and c <= 244 then
  1982.         -- UTF8-4
  1983.         local c2 = s:byte(i + 1)
  1984.         local c3 = s:byte(i + 2)
  1985.         local c4 = s:byte(i + 3)
  1986.  
  1987.         if not c2 or not c3 or not c4 then
  1988.             error("UTF-8 string terminated early")
  1989.         end
  1990.  
  1991.         -- validate byte 2
  1992.         if c == 240 and (c2 < 144 or c2 > 191) then
  1993.             error("Invalid UTF-8 character")
  1994.         elseif c == 244 and (c2 < 128 or c2 > 143) then
  1995.             error("Invalid UTF-8 character")
  1996.         elseif c2 < 128 or c2 > 191 then
  1997.             error("Invalid UTF-8 character")
  1998.         end
  1999.        
  2000.         -- validate byte 3
  2001.         if c3 < 128 or c3 > 191 then
  2002.             error("Invalid UTF-8 character")
  2003.         end
  2004.  
  2005.         -- validate byte 4
  2006.         if c4 < 128 or c4 > 191 then
  2007.             error("Invalid UTF-8 character")
  2008.         end
  2009.  
  2010.         return 4
  2011.  
  2012.     else
  2013.         error("Invalid UTF-8 character")
  2014.     end
  2015. end
  2016.  
  2017.  
  2018. -- returns the number of characters in a UTF-8 string
  2019. local function utf8len (s)
  2020.     -- argument checking
  2021.     if type(s) ~= "string" then
  2022.         error("bad argument #1 to 'utf8len' (string expected, got ".. type(s).. ")")
  2023.     end
  2024.  
  2025.     local pos = 1
  2026.     local bytes = s:len()
  2027.     local len = 0
  2028.  
  2029.     while pos <= bytes do
  2030.         len = len + 1
  2031.         pos = pos + utf8charbytes(s, pos)
  2032.     end
  2033.  
  2034.     return len
  2035. end
  2036.  
  2037. -- install in the string library
  2038. if not string.utf8len then
  2039.     string.utf8len = utf8len
  2040. end
  2041.  
  2042.  
  2043. -- functions identically to string.sub except that i and j are UTF-8 characters
  2044. -- instead of bytes
  2045. local function utf8sub (s, i, j)
  2046.     -- argument defaults
  2047.     j = j or -1
  2048.  
  2049.     -- argument checking
  2050.     if type(s) ~= "string" then
  2051.         error("bad argument #1 to 'utf8sub' (string expected, got ".. type(s).. ")")
  2052.     end
  2053.     if type(i) ~= "number" then
  2054.         error("bad argument #2 to 'utf8sub' (number expected, got ".. type(i).. ")")
  2055.     end
  2056.     if type(j) ~= "number" then
  2057.         error("bad argument #3 to 'utf8sub' (number expected, got ".. type(j).. ")")
  2058.     end
  2059.  
  2060.     local pos = 1
  2061.     local bytes = s:len()
  2062.     local len = 0
  2063.  
  2064.     -- only set l if i or j is negative
  2065.     local l = (i >= 0 and j >= 0) or s:utf8len()
  2066.     local startChar = (i >= 0) and i or l + i + 1
  2067.     local endChar   = (j >= 0) and j or l + j + 1
  2068.  
  2069.     -- can't have start before end!
  2070.     if startChar > endChar then
  2071.         return ""
  2072.     end
  2073.  
  2074.     -- byte offsets to pass to string.sub
  2075.     local startByte, endByte = 1, bytes
  2076.  
  2077.     while pos <= bytes do
  2078.         len = len + 1
  2079.  
  2080.         if len == startChar then
  2081.             startByte = pos
  2082.         end
  2083.  
  2084.         pos = pos + utf8charbytes(s, pos)
  2085.  
  2086.         if len == endChar then
  2087.             endByte = pos - 1
  2088.             break
  2089.         end
  2090.     end
  2091.  
  2092.     return s:sub(startByte, endByte)
  2093. end
  2094.  
  2095. -- install in the string library
  2096. if not string.utf8sub then
  2097.     string.utf8sub = utf8sub
  2098. end
  2099.  
  2100.  
  2101. -- replace UTF-8 characters based on a mapping table
  2102. local function utf8replace (s, mapping)
  2103.     -- argument checking
  2104.     if type(s) ~= "string" then
  2105.         error("bad argument #1 to 'utf8replace' (string expected, got ".. type(s).. ")")
  2106.     end
  2107.     if type(mapping) ~= "table" then
  2108.         error("bad argument #2 to 'utf8replace' (table expected, got ".. type(mapping).. ")")
  2109.     end
  2110.  
  2111.     local pos = 1
  2112.     local bytes = s:len()
  2113.     local charbytes
  2114.     local newstr = ""
  2115.  
  2116.     while pos <= bytes do
  2117.         charbytes = utf8charbytes(s, pos)
  2118.         local c = s:sub(pos, pos + charbytes - 1)
  2119.  
  2120.         newstr = newstr .. (mapping[c] or c)
  2121.  
  2122.         pos = pos + charbytes
  2123.     end
  2124.  
  2125.     return newstr
  2126. end
  2127.  
  2128.  
  2129. -- identical to string.upper except it knows about unicode simple case conversions
  2130. local function utf8upper (s)
  2131.     return utf8replace(s, utf8_lc_uc)
  2132. end
  2133.  
  2134. -- install in the string library
  2135. if not string.utf8upper and utf8_lc_uc then
  2136.     string.utf8upper = utf8upper
  2137. end
  2138.  
  2139.  
  2140. -- identical to string.lower except it knows about unicode simple case conversions
  2141. local function utf8lower (s)
  2142.     return utf8replace(s, utf8_uc_lc)
  2143. end
  2144.  
  2145. -- install in the string library
  2146. if not string.utf8lower and utf8_uc_lc then
  2147.     string.utf8lower = utf8lower
  2148. end
  2149.  
  2150.  
  2151. -- identical to string.reverse except that it supports UTF-8
  2152. local function utf8reverse (s)
  2153.     -- argument checking
  2154.     if type(s) ~= "string" then
  2155.         error("bad argument #1 to 'utf8reverse' (string expected, got ".. type(s).. ")")
  2156.     end
  2157.  
  2158.     local bytes = s:len()
  2159.     local pos = bytes
  2160.     local charbytes
  2161.     local newstr = ""
  2162.  
  2163.     while pos > 0 do
  2164.         c = s:byte(pos)
  2165.         while c >= 128 and c <= 191 do
  2166.             pos = pos - 1
  2167.             c = s:byte(pos)
  2168.         end
  2169.  
  2170.         charbytes = utf8charbytes(s, pos)
  2171.  
  2172.         newstr = newstr .. s:sub(pos, pos + charbytes - 1)
  2173.  
  2174.         pos = pos - 1
  2175.     end
  2176.  
  2177.     return newstr
  2178. end
  2179.  
  2180. -- install in the string library
  2181. if not string.utf8reverse then
  2182.     string.utf8reverse = utf8reverse
  2183. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement