#
# Generates a PL/pgSQL function which strips all accents from a string
# of latin 1, latin extended A, latin extended B or latin extended
# additional characters.
#
# TODO:  Create a strip_ligature() function which expands the ligature
# characters like oe in "oeuvre"
#
# References:
# http://www.unicode.org/charts/
# http://www.absoluteastronomy.com/encyclopedia/D/Di/Diacritic.htm
#
# Thomas Munro
# 2005
# $Id: make-strip_accents.py 1122 2005-04-13 17:33:27Z munro $
# 

mappings = [
  # characters from latin 1 (nicked from latin1 man page)
  (0xC0, "A"),           # LATIN CAPITAL LETTER A WITH GRAVE
  (0xC1, "A"),           # LATIN CAPITAL LETTER A WITH ACUTE
  (0xC2, "A"),           # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
  (0xC3, "A"),           # LATIN CAPITAL LETTER A WITH TILDE
  (0xC4, "A"),           # LATIN CAPITAL LETTER A WITH DIAERESIS
  (0xC5, "A"),           # LATIN CAPITAL LETTER A WITH RING ABOVE
#  (0xC6, "A"),           # LATIN CAPITAL LETTER AE
  (0xC7, "C"),           # LATIN CAPITAL LETTER C WITH CEDILLA
  (0xC8, "E"),           # LATIN CAPITAL LETTER E WITH GRAVE
  (0xC9, "E"),           # LATIN CAPITAL LETTER E WITH ACUTE
  (0xCA, "E"),           # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
  (0xCB, "E"),           # LATIN CAPITAL LETTER E WITH DIAERESIS
  (0xCC, "I"),           # LATIN CAPITAL LETTER I WITH GRAVE
  (0xCD, "I"),           # LATIN CAPITAL LETTER I WITH ACUTE
  (0xCE, "I"),           # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
  (0xCF, "I"),           # LATIN CAPITAL LETTER I WITH DIAERESIS
  (0xD0, "D"),           # LATIN CAPITAL LETTER ETH
  (0xD1, "N"),           # LATIN CAPITAL LETTER N WITH TILDE
  (0xD2, "O"),           # LATIN CAPITAL LETTER O WITH GRAVE
  (0xD3, "O"),           # LATIN CAPITAL LETTER O WITH ACUTE
  (0xD4, "O"),           # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
  (0xD5, "O"),           # LATIN CAPITAL LETTER O WITH TILDE
  (0xD6, "O"),           # LATIN CAPITAL LETTER O WITH DIAERESIS
  (0xD8, "O"),           # LATIN CAPITAL LETTER O WITH STROKE
  (0xD9, "U"),           # LATIN CAPITAL LETTER U WITH GRAVE
  (0xDA, "U"),           # LATIN CAPITAL LETTER U WITH ACUTE
  (0xDB, "U"),           # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
  (0xDC, "U"),           # LATIN CAPITAL LETTER U WITH DIAERESIS
  (0xDD, "Y"),           # LATIN CAPITAL LETTER Y WITH ACUTE
  (0xDE, "D"),           # LATIN CAPITAL LETTER THORN
  (0xDF, "s"),           # LATIN SMALL LETTER SHARP S
  (0xE0, "a"),           # LATIN SMALL LETTER A WITH GRAVE
  (0xE1, "a"),           # LATIN SMALL LETTER A WITH ACUTE
  (0xE2, "a"),           # LATIN SMALL LETTER A WITH CIRCUMFLEX
  (0xE3, "a"),           # LATIN SMALL LETTER A WITH TILDE
  (0xE4, "a"),           # LATIN SMALL LETTER A WITH DIAERESIS
  (0xE5, "a"),           # LATIN SMALL LETTER A WITH RING ABOVE
#  (0xE6, "a"),           # LATIN SMALL LETTER AE
  (0xE7, "c"),           # LATIN SMALL LETTER C WITH CEDILLA
  (0xE8, "e"),           # LATIN SMALL LETTER E WITH GRAVE
  (0xE9, "e"),           # LATIN SMALL LETTER E WITH ACUTE
  (0xEA, "e"),           # LATIN SMALL LETTER E WITH CIRCUMFLEX
  (0xEB, "e"),           # LATIN SMALL LETTER E WITH DIAERESIS
  (0xEC, "i"),           # LATIN SMALL LETTER I WITH GRAVE
  (0xED, "i"),           # LATIN SMALL LETTER I WITH ACUTE
  (0xEE, "i"),           # LATIN SMALL LETTER I WITH CIRCUMFLEX
  (0xEF, "i"),           # LATIN SMALL LETTER I WITH DIAERESIS
  (0xF0, "d"),           # LATIN SMALL LETTER ETH
  (0xF1, "n"),           # LATIN SMALL LETTER N WITH TILDE
  (0xF2, "o"),           # LATIN SMALL LETTER O WITH GRAVE
  (0xF3, "o"),           # LATIN SMALL LETTER O WITH ACUTE
  (0xF4, "o"),           # LATIN SMALL LETTER O WITH CIRCUMFLEX
  (0xF5, "o"),           # LATIN SMALL LETTER O WITH TILDE
  (0xF6, "o"),           # LATIN SMALL LETTER O WITH DIAERESIS
  (0xF8, "o"),           # LATIN SMALL LETTER O WITH STROKE
  (0xF9, "u"),           # LATIN SMALL LETTER U WITH GRAVE
  (0xFA, "u"),           # LATIN SMALL LETTER U WITH ACUTE
  (0xFB, "u"),           # LATIN SMALL LETTER U WITH CIRCUMFLEX
  (0xFC, "u"),           # LATIN SMALL LETTER U WITH DIAERESIS
  (0xFD, "y"),           # LATIN SMALL LETTER Y WITH ACUTE
  (0xFE, "d"),           # LATIN SMALL LETTER THORN
  (0xFF, "y"),           # LATIN SMALL LETTER Y WITH DIAERESIS

  # latin extended a
  # http://www.fileformat.info/info/unicode/block/latin_extended_a/list.htm

  (0x0100, "A"), #  LATIN CAPITAL LETTER A WITH MACRON (U+0100)
  (0x0101, "a"), #  LATIN SMALL LETTER A WITH MACRON (U+0101)
  (0x0102, "A"), #  LATIN CAPITAL LETTER A WITH BREVE (U+0102)
  (0x0103, "a"), #  LATIN SMALL LETTER A WITH BREVE (U+0103)
  (0x0104, "A"), #  LATIN CAPITAL LETTER A WITH OGONEK (U+0104)
  (0x0105, "a"), #  LATIN SMALL LETTER A WITH OGONEK (U+0105)
  (0x0106, "C"), #  LATIN CAPITAL LETTER C WITH ACUTE (U+0106)
  (0x0107, "c"), #  LATIN SMALL LETTER C WITH ACUTE (U+0107)
  (0x0108, "C"), #  LATIN CAPITAL LETTER C WITH CIRCUMFLEX (U+0108)
  (0x0109, "c"), #  LATIN SMALL LETTER C WITH CIRCUMFLEX (U+0109)
  (0x010A, "C"), #  LATIN CAPITAL LETTER C WITH DOT ABOVE (U+010A)
  (0x010B, "c"), #  LATIN SMALL LETTER C WITH DOT ABOVE (U+010B)
  (0x010C, "C"), #  LATIN CAPITAL LETTER C WITH CARON (U+010C)
  (0x010D, "c"), #  LATIN SMALL LETTER C WITH CARON (U+010D)
  (0x010E, "D"), #  LATIN CAPITAL LETTER D WITH CARON (U+010E)
  (0x010F, "d"), #  LATIN SMALL LETTER D WITH CARON (U+010F)
  (0x0110, "D"), #  LATIN CAPITAL LETTER D WITH STROKE (U+0110)
  (0x0111, "d"), #  LATIN SMALL LETTER D WITH STROKE (U+0111)
  (0x0112, "E"), #  LATIN CAPITAL LETTER E WITH MACRON (U+0112)
  (0x0113, "e"), #  LATIN SMALL LETTER E WITH MACRON (U+0113)
  (0x0114, "E"), #  LATIN CAPITAL LETTER E WITH BREVE (U+0114)
  (0x0115, "e"), #  LATIN SMALL LETTER E WITH BREVE (U+0115)
  (0x0116, "E"), #  LATIN CAPITAL LETTER E WITH DOT ABOVE (U+0116)
  (0x0117, "e"), #  LATIN SMALL LETTER E WITH DOT ABOVE (U+0117)
  (0x0118, "E"), #  LATIN CAPITAL LETTER E WITH OGONEK (U+0118)
  (0x0119, "e"), #  LATIN SMALL LETTER E WITH OGONEK (U+0119)
  (0x011A, "E"), #  LATIN CAPITAL LETTER E WITH CARON (U+011A)
  (0x011B, "e"), #  LATIN SMALL LETTER E WITH CARON (U+011B)
  (0x011C, "G"), #  LATIN CAPITAL LETTER G WITH CIRCUMFLEX (U+011C)
  (0x011D, "g"), #  LATIN SMALL LETTER G WITH CIRCUMFLEX (U+011D)
  (0x011E, "G"), #  LATIN CAPITAL LETTER G WITH BREVE (U+011E)
  (0x011F, "g"), #  LATIN SMALL LETTER G WITH BREVE (U+011F)
  (0x0120, "G"), #  LATIN CAPITAL LETTER G WITH DOT ABOVE (U+0120)
  (0x0121, "g"), #  LATIN SMALL LETTER G WITH DOT ABOVE (U+0121)
  (0x0122, "G"), #  LATIN CAPITAL LETTER G WITH CEDILLA (U+0122)
  (0x0123, "g"), #  LATIN SMALL LETTER G WITH CEDILLA (U+0123)
  (0x0124, "H"), #  LATIN CAPITAL LETTER H WITH CIRCUMFLEX (U+0124)
  (0x0125, "h"), #  LATIN SMALL LETTER H WITH CIRCUMFLEX (U+0125)
  (0x0126, "H"), #  LATIN CAPITAL LETTER H WITH STROKE (U+0126)
  (0x0127, "h"), #  LATIN SMALL LETTER H WITH STROKE (U+0127)
  (0x0128, "I"), #  LATIN CAPITAL LETTER I WITH TILDE (U+0128)
  (0x0129, "i"), #  LATIN SMALL LETTER I WITH TILDE (U+0129)
  (0x012A, "I"), #  LATIN CAPITAL LETTER I WITH MACRON (U+012A)
  (0x012B, "i"), #  LATIN SMALL LETTER I WITH MACRON (U+012B)
  (0x012C, "I"), #  LATIN CAPITAL LETTER I WITH BREVE (U+012C)
  (0x012D, "i"), #  LATIN SMALL LETTER I WITH BREVE (U+012D)
  (0x012E, "I"), #  LATIN CAPITAL LETTER I WITH OGONEK (U+012E)
  (0x012F, "i"), #  LATIN SMALL LETTER I WITH OGONEK (U+012F)
  (0x0130, "I"), #  LATIN CAPITAL LETTER I WITH DOT ABOVE (U+0130)
  (0x0131, "i"), #  LATIN SMALL LETTER DOTLESS I (U+0131)
#  (0x0132, "I"), #  LATIN CAPITAL LIGATURE IJ (U+0132)
#  (0x0133, "i"), #  LATIN SMALL LIGATURE IJ (U+0133)
  (0x0134, "J"), #  LATIN CAPITAL LETTER J WITH CIRCUMFLEX (U+0134)
  (0x0135, "j"), #  LATIN SMALL LETTER J WITH CIRCUMFLEX (U+0135)
  (0x0136, "K"), #  LATIN CAPITAL LETTER K WITH CEDILLA (U+0136)
  (0x0137, "k"), #  LATIN SMALL LETTER K WITH CEDILLA (U+0137)
  (0x0138, "k"), #  LATIN SMALL LETTER KRA (U+0138)
  (0x0139, "L"), #  LATIN CAPITAL LETTER L WITH ACUTE (U+0139)
  (0x013A, "l"), #  LATIN SMALL LETTER L WITH ACUTE (U+013A)
  (0x013B, "L"), #  LATIN CAPITAL LETTER L WITH CEDILLA (U+013B)
  (0x013C, "l"), #  LATIN SMALL LETTER L WITH CEDILLA (U+013C)
  (0x013D, "L"), #  LATIN CAPITAL LETTER L WITH CARON (U+013D)
  (0x013E, "l"), #  LATIN SMALL LETTER L WITH CARON (U+013E)
  (0x013F, "L"), #  LATIN CAPITAL LETTER L WITH MIDDLE DOT (U+013F)
  (0x0140, "l"), #  LATIN SMALL LETTER L WITH MIDDLE DOT (U+0140)
  (0x0141, "L"), #  LATIN CAPITAL LETTER L WITH STROKE (U+0141)
  (0x0142, "l"), #  LATIN SMALL LETTER L WITH STROKE (U+0142)
  (0x0143, "N"), #  LATIN CAPITAL LETTER N WITH ACUTE (U+0143)
  (0x0144, "n"), #  LATIN SMALL LETTER N WITH ACUTE (U+0144)
  (0x0145, "N"), #  LATIN CAPITAL LETTER N WITH CEDILLA (U+0145)
  (0x0146, "n"), #  LATIN SMALL LETTER N WITH CEDILLA (U+0146)
  (0x0147, "N"), #  LATIN CAPITAL LETTER N WITH CARON (U+0147)
  (0x0148, "n"), #  LATIN SMALL LETTER N WITH CARON (U+0148)
  (0x0149, "n"), #  LATIN SMALL LETTER N PRECEDED BY APOSTROPHE (U+0149)
  (0x014A, "N"), #  LATIN CAPITAL LETTER ENG (U+014A)
  (0x014B, "n"), #  LATIN SMALL LETTER ENG (U+014B)
  (0x014C, "O"), #  LATIN CAPITAL LETTER O WITH MACRON (U+014C)
  (0x014D, "o"), #  LATIN SMALL LETTER O WITH MACRON (U+014D)
  (0x014E, "O"), #  LATIN CAPITAL LETTER O WITH BREVE (U+014E)
  (0x014F, "o"), #  LATIN SMALL LETTER O WITH BREVE (U+014F)
  (0x0150, "O"), #  LATIN CAPITAL LETTER O WITH DOUBLE ACUTE (U+0150)
  (0x0151, "o"), #  LATIN SMALL LETTER O WITH DOUBLE ACUTE (U+0151)
#  (0x0152, "O"), #  LATIN CAPITAL LIGATURE OE (U+0152)
#  (0x0153, "o"), #  LATIN SMALL LIGATURE OE (U+0153)
  (0x0154, "R"), #  LATIN CAPITAL LETTER R WITH ACUTE (U+0154)
  (0x0155, "r"), #  LATIN SMALL LETTER R WITH ACUTE (U+0155)
  (0x0156, "R"), #  LATIN CAPITAL LETTER R WITH CEDILLA (U+0156)
  (0x0157, "r"), #  LATIN SMALL LETTER R WITH CEDILLA (U+0157)
  (0x0158, "R"), # LATIN CAPITAL LETTER R WITH CARON (U+0158)
  (0x0159, "r"), # LATIN SMALL LETTER R WITH CARON (U+0159)
  (0x015A, "S"), # LATIN CAPITAL LETTER S WITH ACUTE (U+015A)
  (0x015B, "s"), # LATIN SMALL LETTER S WITH ACUTE (U+015B)
  (0x015C, "S"), # LATIN CAPITAL LETTER S WITH CIRCUMFLEX (U+015C)
  (0x015D, "s"), # LATIN SMALL LETTER S WITH CIRCUMFLEX (U+015D)
  (0x015E, "S"), # LATIN CAPITAL LETTER S WITH CEDILLA (U+015E)
  (0x015F, "s"), # LATIN SMALL LETTER S WITH CEDILLA (U+015F)
  (0x0160, "S"), # LATIN CAPITAL LETTER S WITH CARON (U+0160)
  (0x0161, "s"), # LATIN SMALL LETTER S WITH CARON (U+0161)
  (0x0162, "T"), # LATIN CAPITAL LETTER T WITH CEDILLA (U+0162)
  (0x0163, "t"), # LATIN SMALL LETTER T WITH CEDILLA (U+0163)
  (0x0164, "T"), # LATIN CAPITAL LETTER T WITH CARON (U+0164)
  (0x0165, "t"), # LATIN SMALL LETTER T WITH CARON (U+0165)
  (0x0166, "T"), # LATIN CAPITAL LETTER T WITH STROKE (U+0166)
  (0x0167, "t"), # LATIN SMALL LETTER T WITH STROKE (U+0167)
  (0x0168, "U"), # LATIN CAPITAL LETTER U WITH TILDE (U+0168)
  (0x0169, "u"), # LATIN SMALL LETTER U WITH TILDE (U+0169)
  (0x016A, "U"), # LATIN CAPITAL LETTER U WITH MACRON (U+016A)
  (0x016B, "u"), # LATIN SMALL LETTER U WITH MACRON (U+016B)
  (0x016C, "U"), # LATIN CAPITAL LETTER U WITH BREVE (U+016C)
  (0x016D, "u"), # LATIN SMALL LETTER U WITH BREVE (U+016D)
  (0x016E, "U"), # LATIN CAPITAL LETTER U WITH RING ABOVE (U+016E)
  (0x016F, "u"), # LATIN SMALL LETTER U WITH RING ABOVE (U+016F)
  (0x0170, "U"), # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE (U+0170)
  (0x0171, "u"), # LATIN SMALL LETTER U WITH DOUBLE ACUTE (U+0171)
  (0x0172, "U"), # LATIN CAPITAL LETTER U WITH OGONEK (U+0172)
  (0x0173, "u"), # LATIN SMALL LETTER U WITH OGONEK (U+0173)
  (0x0174, "W"), # LATIN CAPITAL LETTER W WITH CIRCUMFLEX (U+0174)
  (0x0175, "w"), # LATIN SMALL LETTER W WITH CIRCUMFLEX (U+0175)
  (0x0176, "Y"), # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX (U+0176)
  (0x0177, "y"), # LATIN SMALL LETTER Y WITH CIRCUMFLEX (U+0177)
  (0x0178, "Y"), # LATIN CAPITAL LETTER Y WITH DIAERESIS (U+0178)
  (0x0179, "Z"), # LATIN CAPITAL LETTER Z WITH ACUTE (U+0179)
  (0x017A, "z"), # LATIN SMALL LETTER Z WITH ACUTE (U+017A)
  (0x017B, "Z"), # LATIN CAPITAL LETTER Z WITH DOT ABOVE (U+017B)
  (0x017C, "z"), # LATIN SMALL LETTER Z WITH DOT ABOVE (U+017C)
  (0x017D, "Z"), # LATIN CAPITAL LETTER Z WITH CARON (U+017D)
  (0x017E, "z"), # LATIN SMALL LETTER Z WITH CARON (U+017E)
  (0x017F, "s"), # LATIN SMALL LETTER LONG S (U+017F)

  # latin extended b
  # http://www.fileformat.info/info/unicode/block/latin_extended_b/list.htm

  (0x0180, "b"), # LATIN SMALL LETTER B WITH STROKE (U+0180)
  (0x0181, "B"), # LATIN CAPITAL LETTER B WITH HOOK (U+0181)
  (0x0182, "B"), # LATIN CAPITAL LETTER B WITH TOPBAR (U+0182)
  (0x0183, "b"), # LATIN SMALL LETTER B WITH TOPBAR (U+0183)
  (0x0184, "B"), # LATIN CAPITAL LETTER TONE SIX (U+0184)
  (0x0185, "b"), # LATIN SMALL LETTER TONE SIX (U+0185)
  (0x0186, "O"), # LATIN CAPITAL LETTER OPEN O (U+0186)
  (0x0187, "C"), # LATIN CAPITAL LETTER C WITH HOOK (U+0187)
  (0x0188, "c"), # LATIN SMALL LETTER C WITH HOOK (U+0188)
  (0x0189, "D"), # LATIN CAPITAL LETTER AFRICAN D (U+0189)
  (0x018A, "D"), # LATIN CAPITAL LETTER D WITH HOOK (U+018A)
  (0x018B, "D"), # LATIN CAPITAL LETTER D WITH TOPBAR (U+018B)
  (0x018C, "d"), # LATIN SMALL LETTER D WITH TOPBAR (U+018C)
  (0x018D, "d"), # LATIN SMALL LETTER TURNED DELTA (U+018D)
  (0x018E, "E"), # LATIN CAPITAL LETTER REVERSED E (U+018E)
  (0x018F, "@"), # LATIN CAPITAL LETTER SCHWA (U+018F)
  (0x0190, "E"), # LATIN CAPITAL LETTER OPEN E (U+0190)
  (0x0191, "F"), # LATIN CAPITAL LETTER F WITH HOOK (U+0191)
  (0x0192, "f"), # LATIN SMALL LETTER F WITH HOOK (U+0192)
  (0x0193, "G"), # LATIN CAPITAL LETTER G WITH HOOK (U+0193)
  (0x0194, "G"), # LATIN CAPITAL LETTER GAMMA (U+0194)
#  (0x0195, "h"), # LATIN SMALL LETTER HV (U+0195)
  (0x0196, "L"), # LATIN CAPITAL LETTER IOTA (U+0196)
  (0x0197, "I"), # LATIN CAPITAL LETTER I WITH STROKE (U+0197)
  (0x0198, "K"), # LATIN CAPITAL LETTER K WITH HOOK (U+0198)
  (0x0199, "k"), # LATIN SMALL LETTER K WITH HOOK (U+0199)
  (0x019A, "k"), # LATIN SMALL LETTER L WITH BAR (U+019A)
  (0x019B, "k"), # LATIN SMALL LETTER LAMBDA WITH STROKE (U+019B)
  (0x019C, "M"), # LATIN CAPITAL LETTER TURNED M (U+019C)
  (0x019D, "N"), # LATIN CAPITAL LETTER N WITH LEFT HOOK (U+019D)
  (0x019E, "n"), # LATIN SMALL LETTER N WITH LONG RIGHT LEG (U+019E)
  (0x019F, "O"), # LATIN CAPITAL LETTER O WITH MIDDLE TILDE (U+019F)
  (0x01A0, "O"), # LATIN CAPITAL LETTER O WITH HORN (U+01A0)
  (0x01A1, "o"), # LATIN SMALL LETTER O WITH HORN (U+01A1)
#  (0x01A2, "O"), # LATIN CAPITAL LETTER OI (U+01A2)
#  (0x01A3, "o"), # LATIN SMALL LETTER OI (U+01A3)
  (0x01A4, "P"), # LATIN CAPITAL LETTER P WITH HOOK (U+01A4)
  (0x01A5, "p"), # LATIN SMALL LETTER P WITH HOOK (U+01A5)
#  (0x01A6, "Y"), # LATIN LETTER YR (U+01A6)
  (0x01A7, "S"), # LATIN CAPITAL LETTER TONE TWO (U+01A7)
  (0x01A8, "s"), # LATIN SMALL LETTER TONE TWO (U+01A8)
  (0x01A9, "E"), # LATIN CAPITAL LETTER ESH (U+01A9)
  (0x01AA, "E"), # LATIN LETTER REVERSED ESH LOOP (U+01AA)
  (0x01AB, "t"), # LATIN SMALL LETTER T WITH PALATAL HOOK (U+01AB)
  (0x01AC, "T"), # LATIN CAPITAL LETTER T WITH HOOK (U+01AC)
  (0x01AD, "t"), # LATIN SMALL LETTER T WITH HOOK (U+01AD)
  (0x01AE, "T"), # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK (U+01AE)
  (0x01AF, "U"), # LATIN CAPITAL LETTER U WITH HORN (U+01AF)
  (0x01B0, "u"), # LATIN SMALL LETTER U WITH HORN (U+01B0)
  (0x01B1, "Y"), # LATIN CAPITAL LETTER UPSILON (U+01B1)
  (0x01B2, "V"), # LATIN CAPITAL LETTER V WITH HOOK (U+01B2)
  (0x01B3, "Y"), # LATIN CAPITAL LETTER Y WITH HOOK (U+01B3)
  (0x01B4, "y"), # LATIN SMALL LETTER Y WITH HOOK (U+01B4)
  (0x01B5, "Z"), # LATIN CAPITAL LETTER Z WITH STROKE (U+01B5)
  (0x01B6, "z"), # LATIN SMALL LETTER Z WITH STROKE (U+01B6)
  (0x01B7, "E"), # LATIN CAPITAL LETTER EZH (U+01B7)
  (0x01B8, "E"), # LATIN CAPITAL LETTER EZH REVERSED (U+01B8)
  (0x01B9, "e"), # LATIN SMALL LETTER EZH REVERSED (U+01B9)
  (0x01BA, "e"), # LATIN SMALL LETTER EZH WITH TAIL (U+01BA)
  (0x01BB, "s"), # LATIN LETTER TWO WITH STROKE (U+01BB)
  (0x01BC, "5"), # LATIN CAPITAL LETTER TONE FIVE (U+01BC)
  (0x01BD, "5"), # LATIN SMALL LETTER TONE FIVE (U+01BD)
  (0x01BE, "?"), # LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE (U+01BE)
  (0x01BF, "?"), # LATIN LETTER WYNN (U+01BF)
  (0x01C0, "?"), # LATIN LETTER DENTAL CLICK (U+01C0)
  (0x01C1, "?"), # LATIN LETTER LATERAL CLICK (U+01C1)
  (0x01C2, "?"), # LATIN LETTER ALVEOLAR CLICK (U+01C2)
  (0x01C3, "?"), # LATIN LETTER RETROFLEX CLICK (U+01C3)
#  (0x01C4, "D"), # LATIN CAPITAL LETTER DZ WITH CARON (U+01C4)
  (0x01C5, "D"), # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON (U+01C5)
#  (0x01C6, "d"), # LATIN SMALL LETTER DZ WITH CARON (U+01C6)
#  (0x01C7, "L"), # LATIN CAPITAL LETTER LJ (U+01C7)
#  (0x01C8, "L"), # LATIN CAPITAL LETTER L WITH SMALL LETTER J (U+01C8)
#  (0x01C9, "l"), # LATIN SMALL LETTER LJ (U+01C9)
#  (0x01CA, "N"), # LATIN CAPITAL LETTER NJ (U+01CA)
#  (0x01CB, "N"), # LATIN CAPITAL LETTER N WITH SMALL LETTER J (U+01CB)
#  (0x01CC, "n"), # LATIN SMALL LETTER NJ (U+01CC)
  (0x01CD, "A"), # LATIN CAPITAL LETTER A WITH CARON (U+01CD)
  (0x01CE, "a"), # LATIN SMALL LETTER A WITH CARON (U+01CE)
  (0x01CF, "I"), # LATIN CAPITAL LETTER I WITH CARON (U+01CF)
  (0x01D0, "i"), # LATIN SMALL LETTER I WITH CARON (U+01D0)
  (0x01D1, "O"), # LATIN CAPITAL LETTER O WITH CARON (U+01D1)
  (0x01D2, "o"), # LATIN SMALL LETTER O WITH CARON (U+01D2)
  (0x01D3, "U"), # LATIN CAPITAL LETTER U WITH CARON (U+01D3)
  (0x01D4, "u"), # LATIN SMALL LETTER U WITH CARON (U+01D4)
  (0x01D5, "U"), # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON (U+01D5)
  (0x01D6, "u"), # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON (U+01D6)
  (0x01D7, "U"), # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE (U+01D7)
  (0x01D8, "u"), # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE (U+01D8)
  (0x01D9, "U"), # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON (U+01D9)
  (0x01DA, "u"), # LATIN SMALL LETTER U WITH DIAERESIS AND CARON (U+01DA)
  (0x01DB, "U"), # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE (U+01DB)
  (0x01DC, "u"), # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE (U+01DC)
  (0x01DD, "e"), # LATIN SMALL LETTER TURNED E (U+01DD)
  (0x01DE, "A"), # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON (U+01DE)
  (0x01DF, "a"), # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON (U+01DF)
  (0x01E0, "A"), # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON (U+01E0)
  (0x01E1, "a"), # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON (U+01E1)
#  (0x01E2, "A"), # LATIN CAPITAL LETTER AE WITH MACRON (U+01E2)
#  (0x01E3, "a"), # LATIN SMALL LETTER AE WITH MACRON (U+01E3)
  (0x01E4, "G"), # LATIN CAPITAL LETTER G WITH STROKE (U+01E4)
  (0x01E5, "g"), # LATIN SMALL LETTER G WITH STROKE (U+01E5)
  (0x01E6, "G"), # LATIN CAPITAL LETTER G WITH CARON (U+01E6)
  (0x01E7, "g"), # LATIN SMALL LETTER G WITH CARON (U+01E7)
  (0x01E8, "K"), # LATIN CAPITAL LETTER K WITH CARON (U+01E8)
  (0x01E9, "k"), # LATIN SMALL LETTER K WITH CARON (U+01E9)
  (0x01EA, "O"), # LATIN CAPITAL LETTER O WITH OGONEK (U+01EA)
  (0x01EB, "o"), # LATIN SMALL LETTER O WITH OGONEK (U+01EB)
  (0x01EC, "O"), # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON (U+01EC)
  (0x01ED, "o"), # LATIN SMALL LETTER O WITH OGONEK AND MACRON (U+01ED)
  (0x01EE, "O"), # LATIN CAPITAL LETTER EZH WITH CARON (U+01EE)
  (0x01EF, "e"), # LATIN SMALL LETTER EZH WITH CARON (U+01EF)
  (0x01F0, "j"), # LATIN SMALL LETTER J WITH CARON (U+01F0)
#  (0x01F1, "D"), # LATIN CAPITAL LETTER DZ (U+01F1)
  (0x01F2, "D"), # LATIN CAPITAL LETTER D WITH SMALL LETTER Z (U+01F2)
#  (0x01F3, "d"), # LATIN SMALL LETTER DZ (U+01F3)
  (0x01F4, "G"), # LATIN CAPITAL LETTER G WITH ACUTE (U+01F4)
  (0x01F5, "g"), # LATIN SMALL LETTER G WITH ACUTE (U+01F5)
  (0x01F6, "H"), # LATIN CAPITAL LETTER HWAIR (U+01F6)
  (0x01F7, "P"), # LATIN CAPITAL LETTER WYNN (U+01F7)
  (0x01F8, "N"), # LATIN CAPITAL LETTER N WITH GRAVE (U+01F8)
  (0x01F9, "n"), # LATIN SMALL LETTER N WITH GRAVE (U+01F9)
  (0x01FA, "A"), # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE (U+01FA)
  (0x01FB, "a"), # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE (U+01FB)
#  (0x01FC, "A"), # LATIN CAPITAL LETTER AE WITH ACUTE (U+01FC)
#  (0x01FD, "a"), # LATIN SMALL LETTER AE WITH ACUTE (U+01FD)
  (0x01FE, "O"), # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE (U+01FE)
  (0x01FF, "o"), # LATIN SMALL LETTER O WITH STROKE AND ACUTE (U+01FF)
  (0x0200, "A"), # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE (U+0200)
  (0x0201, "a"), # LATIN SMALL LETTER A WITH DOUBLE GRAVE (U+0201)
  (0x0202, "A"), # LATIN CAPITAL LETTER A WITH INVERTED BREVE (U+0202)
  (0x0203, "a"), # LATIN SMALL LETTER A WITH INVERTED BREVE (U+0203)
  (0x0204, "E"), # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE (U+0204)
  (0x0205, "e"), # LATIN SMALL LETTER E WITH DOUBLE GRAVE (U+0205)
  (0x0206, "E"), # LATIN CAPITAL LETTER E WITH INVERTED BREVE (U+0206)
  (0x0207, "e"), # LATIN SMALL LETTER E WITH INVERTED BREVE (U+0207)
  (0x0208, "I"), # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE (U+0208)
  (0x0209, "i"), # LATIN SMALL LETTER I WITH DOUBLE GRAVE (U+0209)
  (0x020A, "I"), # LATIN CAPITAL LETTER I WITH INVERTED BREVE (U+020A)
  (0x020B, "i"), # LATIN SMALL LETTER I WITH INVERTED BREVE (U+020B)
  (0x020C, "O"), # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE (U+020C)
  (0x020D, "o"), # LATIN SMALL LETTER O WITH DOUBLE GRAVE (U+020D)
  (0x020E, "O"), # LATIN CAPITAL LETTER O WITH INVERTED BREVE (U+020E)
  (0x020F, "o"), # LATIN SMALL LETTER O WITH INVERTED BREVE (U+020F)
  (0x0210, "R"), # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE (U+0210)
  (0x0211, "r"), # LATIN SMALL LETTER R WITH DOUBLE GRAVE (U+0211)
  (0x0212, "R"), # LATIN CAPITAL LETTER R WITH INVERTED BREVE (U+0212)
  (0x0213, "r"), # LATIN SMALL LETTER R WITH INVERTED BREVE (U+0213)
  (0x0214, "U"), # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE (U+0214)
  (0x0215, "u"), # LATIN SMALL LETTER U WITH DOUBLE GRAVE (U+0215)
  (0x0216, "U"), # LATIN CAPITAL LETTER U WITH INVERTED BREVE (U+0216)
  (0x0217, "u"), # LATIN SMALL LETTER U WITH INVERTED BREVE (U+0217)
  (0x0218, "S"), # LATIN CAPITAL LETTER S WITH COMMA BELOW (U+0218)
  (0x0219, "s"), # LATIN SMALL LETTER S WITH COMMA BELOW (U+0219)
  (0x021A, "T"), # LATIN CAPITAL LETTER T WITH COMMA BELOW (U+021A)
  (0x021B, "t"), # LATIN SMALL LETTER T WITH COMMA BELOW (U+021B)
  (0x021C, "?"), # LATIN CAPITAL LETTER YOGH (U+021C)
  (0x021D, "?"), # LATIN SMALL LETTER YOGH (U+021D)
  (0x021E, "H"), # LATIN CAPITAL LETTER H WITH CARON (U+021E)
  (0x021F, "h"), # LATIN SMALL LETTER H WITH CARON (U+021F)
  (0x0220, "N"), # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG (U+0220)
  (0x0221, "d"), # LATIN SMALL LETTER D WITH CURL (U+0221)
#  (0x0222, "O"), # LATIN CAPITAL LETTER OU (U+0222)
#  (0x0223, "o"), # LATIN SMALL LETTER OU (U+0223)
  (0x0224, "Z"), # LATIN CAPITAL LETTER Z WITH HOOK (U+0224)
  (0x0225, "z"), # LATIN SMALL LETTER Z WITH HOOK (U+0225)
  (0x0226, "A"), # LATIN CAPITAL LETTER A WITH DOT ABOVE (U+0226)
  (0x0227, "a"), # LATIN SMALL LETTER A WITH DOT ABOVE (U+0227)
  (0x0228, "E"), # LATIN CAPITAL LETTER E WITH CEDILLA (U+0228)
  (0x0229, "e"), # LATIN SMALL LETTER E WITH CEDILLA (U+0229)
  (0x022A, "O"), # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON (U+022A)
  (0x022B, "o"), # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON (U+022B)
  (0x022C, "O"), # LATIN CAPITAL LETTER O WITH TILDE AND MACRON (U+022C)
  (0x022D, "o"), # LATIN SMALL LETTER O WITH TILDE AND MACRON (U+022D)
  (0x022E, "O"), # LATIN CAPITAL LETTER O WITH DOT ABOVE (U+022E)
  (0x022F, "o"), # LATIN SMALL LETTER O WITH DOT ABOVE (U+022F)
  (0x0230, "O"), # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON (U+0230)
  (0x0231, "o"), # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON (U+0231)
  (0x0232, "Y"), # LATIN CAPITAL LETTER Y WITH MACRON (U+0232)
  (0x0233, "y"), # LATIN SMALL LETTER Y WITH MACRON (U+0233)
  (0x0234, "l"), # LATIN SMALL LETTER L WITH CURL (U+0234)
  (0x0235, "n"), # LATIN SMALL LETTER N WITH CURL (U+0235)
  (0x0236, "t"), # LATIN SMALL LETTER T WITH CURL (U+0236)
  (0x0237, "j"), # LATIN SMALL LETTER DOTLESS J (U+0237)
  (0x0238, "?"), # LATIN SMALL LETTER DB DIGRAPH (U+0238)
  (0x0239, "?"), # LATIN SMALL LETTER QP DIGRAPH (U+0239)
  (0x023A, "A"), # LATIN CAPITAL LETTER A WITH STROKE (U+023A)
  (0x023B, "C"), # LATIN CAPITAL LETTER C WITH STROKE (U+023B)
  (0x023C, "c"), # LATIN SMALL LETTER C WITH STROKE (U+023C)
  (0x023D, "L"), # LATIN CAPITAL LETTER L WITH BAR (U+023D)
  (0x023E, "T"), # LATIN CAPITAL LETTER T WITH DIAGONAL STROKE (U+023E)
  (0x023F, "s"), # LATIN SMALL LETTER S WITH SWASH TAIL (U+023F)
  (0x0240, "z"), # LATIN SMALL LETTER Z WITH SWASH TAIL (U+0240)
  (0x0241, "?"), # LATIN CAPITAL LETTER GLOTTAL STOP (U+0241)


  # latin extended additional
  # http://www.fileformat.info/info/unicode/block/latin_extended_additional/list.htm
  (0x1E00, "A"), # LATIN CAPITAL LETTER A WITH RING BELOW (U+1E00)
  (0x1E01, "a"), # LATIN SMALL LETTER A WITH RING BELOW (U+1E01)
  (0x1E02, "B"), # LATIN CAPITAL LETTER B WITH DOT ABOVE (U+1E02)
  (0x1E03, "b"), # LATIN SMALL LETTER B WITH DOT ABOVE (U+1E03)
  (0x1E04, "B"), # LATIN CAPITAL LETTER B WITH DOT BELOW (U+1E04)
  (0x1E05, "b"), # LATIN SMALL LETTER B WITH DOT BELOW (U+1E05)
  (0x1E06, "B"), # LATIN CAPITAL LETTER B WITH LINE BELOW (U+1E06)
  (0x1E07, "b"), # LATIN SMALL LETTER B WITH LINE BELOW (U+1E07)
  (0x1E08, "C"), # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE (U+1E08)
  (0x1E09, "c"), # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE (U+1E09)
  (0x1E0A, "D"), # LATIN CAPITAL LETTER D WITH DOT ABOVE (U+1E0A)
  (0x1E0B, "d"), # LATIN SMALL LETTER D WITH DOT ABOVE (U+1E0B)
  (0x1E0C, "D"), # LATIN CAPITAL LETTER D WITH DOT BELOW (U+1E0C)
  (0x1E0D, "d"), # LATIN SMALL LETTER D WITH DOT BELOW (U+1E0D)
  (0x1E0E, "D"), # LATIN CAPITAL LETTER D WITH LINE BELOW (U+1E0E)
  (0x1E0F, "d"), # LATIN SMALL LETTER D WITH LINE BELOW (U+1E0F)
  (0x1E10, "D"), # LATIN CAPITAL LETTER D WITH CEDILLA (U+1E10)
  (0x1E11, "d"), # LATIN SMALL LETTER D WITH CEDILLA (U+1E11)
  (0x1E12, "D"), # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW (U+1E12)
  (0x1E13, "d"), # LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW (U+1E13)
  (0x1E14, "E"), # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE (U+1E14)
  (0x1E15, "e"), # LATIN SMALL LETTER E WITH MACRON AND GRAVE (U+1E15)
  (0x1E16, "E"), # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE (U+1E16)
  (0x1E17, "e"), # LATIN SMALL LETTER E WITH MACRON AND ACUTE (U+1E17)
  (0x1E18, "E"), # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW (U+1E18)
  (0x1E19, "e"), # LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW (U+1E19)
  (0x1E1A, "E"), # LATIN CAPITAL LETTER E WITH TILDE BELOW (U+1E1A)
  (0x1E1B, "e"), # LATIN SMALL LETTER E WITH TILDE BELOW (U+1E1B)
  (0x1E1C, "E"), # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE (U+1E1C)
  (0x1E1D, "e"), # LATIN SMALL LETTER E WITH CEDILLA AND BREVE (U+1E1D)
  (0x1E1E, "F"), # LATIN CAPITAL LETTER F WITH DOT ABOVE (U+1E1E)
  (0x1E1F, "f"), # LATIN SMALL LETTER F WITH DOT ABOVE (U+1E1F)
  (0x1E20, "F"), # LATIN CAPITAL LETTER G WITH MACRON (U+1E20)
  (0x1E21, "f"), # LATIN SMALL LETTER G WITH MACRON (U+1E21)
  (0x1E22, "H"), # LATIN CAPITAL LETTER H WITH DOT ABOVE (U+1E22)
  (0x1E23, "h"), # LATIN SMALL LETTER H WITH DOT ABOVE (U+1E23)
  (0x1E24, "H"), # LATIN CAPITAL LETTER H WITH DOT BELOW (U+1E24)
  (0x1E25, "h"), # LATIN SMALL LETTER H WITH DOT BELOW (U+1E25)
  (0x1E26, "H"), # LATIN CAPITAL LETTER H WITH DIAERESIS (U+1E26)
  (0x1E27, "h"), # LATIN SMALL LETTER H WITH DIAERESIS (U+1E27)
  (0x1E28, "H"), # LATIN CAPITAL LETTER H WITH CEDILLA (U+1E28)
  (0x1E29, "h"), # LATIN SMALL LETTER H WITH CEDILLA (U+1E29)
  (0x1E2A, "H"), # LATIN CAPITAL LETTER H WITH BREVE BELOW (U+1E2A)
  (0x1E2B, "h"), # LATIN SMALL LETTER H WITH BREVE BELOW (U+1E2B)
  (0x1E2C, "I"), # LATIN CAPITAL LETTER I WITH TILDE BELOW (U+1E2C)
  (0x1E2D, "i"), # LATIN SMALL LETTER I WITH TILDE BELOW (U+1E2D)
  (0x1E2E, "I"), # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE (U+1E2E)
  (0x1E2F, "i"), # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE (U+1E2F)
  (0x1E30, "K"), # LATIN CAPITAL LETTER K WITH ACUTE (U+1E30)
  (0x1E31, "k"), # LATIN SMALL LETTER K WITH ACUTE (U+1E31)
  (0x1E32, "K"), # LATIN CAPITAL LETTER K WITH DOT BELOW (U+1E32)
  (0x1E33, "k"), # LATIN SMALL LETTER K WITH DOT BELOW (U+1E33)
  (0x1E34, "K"), # LATIN CAPITAL LETTER K WITH LINE BELOW (U+1E34)
  (0x1E35, "k"), # LATIN SMALL LETTER K WITH LINE BELOW (U+1E35)
  (0x1E36, "L"), # LATIN CAPITAL LETTER L WITH DOT BELOW (U+1E36)
  (0x1E37, "l"), # LATIN SMALL LETTER L WITH DOT BELOW (U+1E37)
  (0x1E38, "L"), # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON (U+1E38)
  (0x1E39, "l"), # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON (U+1E39)
  (0x1E3A, "L"), # LATIN CAPITAL LETTER L WITH LINE BELOW (U+1E3A)
  (0x1E3B, "l"), # LATIN SMALL LETTER L WITH LINE BELOW (U+1E3B)
  (0x1E3C, "L"), # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW (U+1E3C)
  (0x1E3D, "l"), # LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW (U+1E3D)
  (0x1E3E, "M"), # LATIN CAPITAL LETTER M WITH ACUTE (U+1E3E)
  (0x1E3F, "m"), # LATIN SMALL LETTER M WITH ACUTE (U+1E3F)
  (0x1E40, "M"), # LATIN CAPITAL LETTER M WITH DOT ABOVE (U+1E40)
  (0x1E41, "m"), # LATIN SMALL LETTER M WITH DOT ABOVE (U+1E41)
  (0x1E42, "M"), # LATIN CAPITAL LETTER M WITH DOT BELOW (U+1E42)
  (0x1E43, "m"), # LATIN SMALL LETTER M WITH DOT BELOW (U+1E43)
  (0x1E44, "N"), # LATIN CAPITAL LETTER N WITH DOT ABOVE (U+1E44)
  (0x1E45, "n"), # LATIN SMALL LETTER N WITH DOT ABOVE (U+1E45)
  (0x1E46, "N"), # LATIN CAPITAL LETTER N WITH DOT BELOW (U+1E46)
  (0x1E47, "n"), # LATIN SMALL LETTER N WITH DOT BELOW (U+1E47)
  (0x1E48, "N"), # LATIN CAPITAL LETTER N WITH LINE BELOW (U+1E48)
  (0x1E49, "n"), # LATIN SMALL LETTER N WITH LINE BELOW (U+1E49)
  (0x1E4A, "N"), # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW (U+1E4A)
  (0x1E4B, "n"), # LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW (U+1E4B)
  (0x1E4C, "O"), # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE (U+1E4C)
  (0x1E4D, "o"), # LATIN SMALL LETTER O WITH TILDE AND ACUTE (U+1E4D)
  (0x1E4E, "O"), # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS (U+1E4E)
  (0x1E4F, "o"), # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS (U+1E4F)
  (0x1E50, "O"), # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE (U+1E50)
  (0x1E51, "o"), # LATIN SMALL LETTER O WITH MACRON AND GRAVE (U+1E51)
  (0x1E52, "O"), # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE (U+1E52)
  (0x1E53, "o"), # LATIN SMALL LETTER O WITH MACRON AND ACUTE (U+1E53)
  (0x1E54, "P"), # LATIN CAPITAL LETTER P WITH ACUTE (U+1E54)
  (0x1E55, "p"), # LATIN SMALL LETTER P WITH ACUTE (U+1E55)
  (0x1E56, "P"), # LATIN CAPITAL LETTER P WITH DOT ABOVE (U+1E56)
  (0x1E57, "p"), # LATIN SMALL LETTER P WITH DOT ABOVE (U+1E57)
  (0x1E58, "R"), # LATIN CAPITAL LETTER R WITH DOT ABOVE (U+1E58)
  (0x1E59, "r"), # LATIN SMALL LETTER R WITH DOT ABOVE (U+1E59)
  (0x1E5A, "R"), # LATIN CAPITAL LETTER R WITH DOT BELOW (U+1E5A)
  (0x1E5B, "r"), # LATIN SMALL LETTER R WITH DOT BELOW (U+1E5B)
  (0x1E5C, "R"), # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON (U+1E5C)
  (0x1E5D, "r"), # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON (U+1E5D)
  (0x1E5E, "R"), # LATIN CAPITAL LETTER R WITH LINE BELOW (U+1E5E)
  (0x1E5F, "r"), # LATIN SMALL LETTER R WITH LINE BELOW (U+1E5F)
  (0x1E60, "S"), # LATIN CAPITAL LETTER S WITH DOT ABOVE (U+1E60)
  (0x1E61, "s"), # LATIN SMALL LETTER S WITH DOT ABOVE (U+1E61)
  (0x1E62, "S"), # LATIN CAPITAL LETTER S WITH DOT BELOW (U+1E62)
  (0x1E63, "s"), # LATIN SMALL LETTER S WITH DOT BELOW (U+1E63)
  (0x1E64, "S"), # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE (U+1E64)
  (0x1E65, "s"), # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE (U+1E65)
  (0x1E66, "S"), # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE (U+1E66)
  (0x1E67, "s"), # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE (U+1E67)
  (0x1E68, "S"), # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE (U+1E68)
  (0x1E69, "s"), # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE (U+1E69)
  (0x1E6A, "T"), # LATIN CAPITAL LETTER T WITH DOT ABOVE (U+1E6A)
  (0x1E6B, "t"), # LATIN SMALL LETTER T WITH DOT ABOVE (U+1E6B)
  (0x1E6C, "T"), # LATIN CAPITAL LETTER T WITH DOT BELOW (U+1E6C)
  (0x1E6D, "t"), # LATIN SMALL LETTER T WITH DOT BELOW (U+1E6D)
  (0x1E6E, "T"), # LATIN CAPITAL LETTER T WITH LINE BELOW (U+1E6E)
  (0x1E6F, "t"), # LATIN SMALL LETTER T WITH LINE BELOW (U+1E6F)
  (0x1E70, "T"), # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW (U+1E70)
  (0x1E71, "t"), # LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW (U+1E71)
  (0x1E72, "U"), # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW (U+1E72)
  (0x1E73, "u"), # LATIN SMALL LETTER U WITH DIAERESIS BELOW (U+1E73)
  (0x1E74, "U"), # LATIN CAPITAL LETTER U WITH TILDE BELOW (U+1E74)
  (0x1E75, "u"), # LATIN SMALL LETTER U WITH TILDE BELOW (U+1E75)
  (0x1E76, "U"), # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW (U+1E76)
  (0x1E77, "u"), # LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW (U+1E77)
  (0x1E78, "U"), # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE (U+1E78)
  (0x1E79, "u"), # LATIN SMALL LETTER U WITH TILDE AND ACUTE (U+1E79)
  (0x1E7A, "U"), # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS (U+1E7A)
  (0x1E7B, "u"), # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS (U+1E7B)
  (0x1E7C, "V"), # LATIN CAPITAL LETTER V WITH TILDE (U+1E7C)
  (0x1E7D, "v"), # LATIN SMALL LETTER V WITH TILDE (U+1E7D)
  (0x1E7E, "V"), # LATIN CAPITAL LETTER V WITH DOT BELOW (U+1E7E)
  (0x1E7F, "v"), # LATIN SMALL LETTER V WITH DOT BELOW (U+1E7F)
  (0x1E80, "W"), # LATIN CAPITAL LETTER W WITH GRAVE (U+1E80)
  (0x1E81, "w"), # LATIN SMALL LETTER W WITH GRAVE (U+1E81)
  (0x1E82, "W"), # LATIN CAPITAL LETTER W WITH ACUTE (U+1E82)
  (0x1E83, "w"), # LATIN SMALL LETTER W WITH ACUTE (U+1E83)
  (0x1E84, "W"), # LATIN CAPITAL LETTER W WITH DIAERESIS (U+1E84)
  (0x1E85, "w"), # LATIN SMALL LETTER W WITH DIAERESIS (U+1E85)
  (0x1E86, "W"), # LATIN CAPITAL LETTER W WITH DOT ABOVE (U+1E86)
  (0x1E87, "w"), # LATIN SMALL LETTER W WITH DOT ABOVE (U+1E87)
  (0x1E88, "W"), # LATIN CAPITAL LETTER W WITH DOT BELOW (U+1E88)
  (0x1E89, "w"), # LATIN SMALL LETTER W WITH DOT BELOW (U+1E89)
  (0x1E8A, "X"), # LATIN CAPITAL LETTER X WITH DOT ABOVE (U+1E8A)
  (0x1E8B, "x"), # LATIN SMALL LETTER X WITH DOT ABOVE (U+1E8B)
  (0x1E8C, "X"), # LATIN CAPITAL LETTER X WITH DIAERESIS (U+1E8C)
  (0x1E8D, "x"), # LATIN SMALL LETTER X WITH DIAERESIS (U+1E8D)
  (0x1E8E, "Y"), # LATIN CAPITAL LETTER Y WITH DOT ABOVE (U+1E8E)
  (0x1E8F, "y"), # LATIN SMALL LETTER Y WITH DOT ABOVE (U+1E8F)
  (0x1E90, "Z"), # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX (U+1E90)
  (0x1E91, "z"), # LATIN SMALL LETTER Z WITH CIRCUMFLEX (U+1E91)
  (0x1E92, "Z"), # LATIN CAPITAL LETTER Z WITH DOT BELOW (U+1E92)
  (0x1E93, "z"), # LATIN SMALL LETTER Z WITH DOT BELOW (U+1E93)
  (0x1E94, "Z"), # LATIN CAPITAL LETTER Z WITH LINE BELOW (U+1E94)
  (0x1E95, "z"), # LATIN SMALL LETTER Z WITH LINE BELOW (U+1E95)
  (0x1E96, "h"), # LATIN SMALL LETTER H WITH LINE BELOW (U+1E96)
  (0x1E97, "t"), # LATIN SMALL LETTER T WITH DIAERESIS (U+1E97)
  (0x1E98, "w"), # LATIN SMALL LETTER W WITH RING ABOVE (U+1E98)
  (0x1E99, "y"), # LATIN SMALL LETTER Y WITH RING ABOVE (U+1E99)
  (0x1E9A, "a"), # LATIN SMALL LETTER A WITH RIGHT HALF RING (U+1E9A)
  (0x1E9B, "s"), # LATIN SMALL LETTER LONG S WITH DOT ABOVE (U+1E9B)
  (0x1EA0, "A"), # LATIN CAPITAL LETTER A WITH DOT BELOW (U+1EA0)
  (0x1EA1, "a"), # LATIN SMALL LETTER A WITH DOT BELOW (U+1EA1)
  (0x1EA2, "A"), # LATIN CAPITAL LETTER A WITH HOOK ABOVE (U+1EA2)
  (0x1EA3, "a"), # LATIN SMALL LETTER A WITH HOOK ABOVE (U+1EA3)
  (0x1EA4, "A"), # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE (U+1EA4)
  (0x1EA5, "a"), # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE (U+1EA5)
  (0x1EA6, "A"), # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE (U+1EA6)
  (0x1EA7, "a"), # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE (U+1EA7)
  (0x1EA8, "A"), # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE (U+1EA8)
  (0x1EA9, "a"), # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE (U+1EA9)
  (0x1EAA, "A"), # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE (U+1EAA)
  (0x1EAB, "s"), # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE (U+1EAB)
  (0x1EAC, "A"), # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW (U+1EAC)
  (0x1EAD, "a"), # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW (U+1EAD)
  (0x1EAE, "A"), # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE (U+1EAE)
  (0x1EAF, "a"), # LATIN SMALL LETTER A WITH BREVE AND ACUTE (U+1EAF)
  (0x1EB0, "A"), # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE (U+1EB0)
  (0x1EB1, "a"), # LATIN SMALL LETTER A WITH BREVE AND GRAVE (U+1EB1)
  (0x1EB2, "A"), # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE (U+1EB2)
  (0x1EB3, "a"), # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE (U+1EB3)
  (0x1EB4, "A"), # LATIN CAPITAL LETTER A WITH BREVE AND TILDE (U+1EB4)
  (0x1EB5, "a"), # LATIN SMALL LETTER A WITH BREVE AND TILDE (U+1EB5)
  (0x1EB6, "A"), # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW (U+1EB6)
  (0x1EB7, "a"), # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW (U+1EB7)
  (0x1EB8, "E"), # LATIN CAPITAL LETTER E WITH DOT BELOW (U+1EB8)
  (0x1EB9, "e"), # LATIN SMALL LETTER E WITH DOT BELOW (U+1EB9)
  (0x1EBA, "E"), # LATIN CAPITAL LETTER E WITH HOOK ABOVE (U+1EBA)
  (0x1EBB, "e"), # LATIN SMALL LETTER E WITH HOOK ABOVE (U+1EBB)
  (0x1EBC, "E"), # LATIN CAPITAL LETTER E WITH TILDE (U+1EBC)
  (0x1EBD, "e"), # LATIN SMALL LETTER E WITH TILDE (U+1EBD)
  (0x1EBE, "E"), # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE (U+1EBE)
  (0x1EBF, "e"), # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE (U+1EBF)
  (0x1EC0, "E"), # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE (U+1EC0)
  (0x1EC1, "e"), # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE (U+1EC1)
  (0x1EC2, "E"), # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE (U+1EC2)
  (0x1EC3, "e"), # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE (U+1EC3)
  (0x1EC4, "E"), # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE (U+1EC4)
  (0x1EC5, "e"), # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE (U+1EC5)
  (0x1EC6, "E"), # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW (U+1EC6)
  (0x1EC7, "e"), # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW (U+1EC7)
  (0x1EC8, "I"), # LATIN CAPITAL LETTER I WITH HOOK ABOVE (U+1EC8)
  (0x1EC9, "i"), # LATIN SMALL LETTER I WITH HOOK ABOVE (U+1EC9)
  (0x1ECA, "I"), # LATIN CAPITAL LETTER I WITH DOT BELOW (U+1ECA)
  (0x1ECB, "i"), # LATIN SMALL LETTER I WITH DOT BELOW (U+1ECB)
  (0x1ECC, "O"), # LATIN CAPITAL LETTER O WITH DOT BELOW (U+1ECC)
  (0x1ECD, "o"), # LATIN SMALL LETTER O WITH DOT BELOW (U+1ECD)
  (0x1ECE, "O"), # LATIN CAPITAL LETTER O WITH HOOK ABOVE (U+1ECE)
  (0x1ECF, "o"), # LATIN SMALL LETTER O WITH HOOK ABOVE (U+1ECF)
  (0x1ED0, "O"), # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE (U+1ED0)
  (0x1ED1, "o"), # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE (U+1ED1)
  (0x1ED2, "O"), # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE (U+1ED2)
  (0x1ED3, "o"), # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE (U+1ED3)
  (0x1ED4, "O"), # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE (U+1ED4)
  (0x1ED5, "o"), # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE (U+1ED5)
  (0x1ED6, "O"), # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE (U+1ED6)
  (0x1ED7, "o"), # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE (U+1ED7)
  (0x1ED8, "O"), # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW (U+1ED8)
  (0x1ED9, "o"), # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW (U+1ED9)
  (0x1EDA, "O"), # LATIN CAPITAL LETTER O WITH HORN AND ACUTE (U+1EDA)
  (0x1EDB, "o"), # LATIN SMALL LETTER O WITH HORN AND ACUTE (U+1EDB)
  (0x1EDC, "O"), # LATIN CAPITAL LETTER O WITH HORN AND GRAVE (U+1EDC)
  (0x1EDD, "o"), # LATIN SMALL LETTER O WITH HORN AND GRAVE (U+1EDD)
  (0x1EDE, "O"), # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE (U+1EDE)
  (0x1EDF, "o"), # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE (U+1EDF)
  (0x1EE0, "O"), # LATIN CAPITAL LETTER O WITH HORN AND TILDE (U+1EE0)
  (0x1EE1, "o"), # LATIN SMALL LETTER O WITH HORN AND TILDE (U+1EE1)
  (0x1EE2, "O"), # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW (U+1EE2)
  (0x1EE3, "o"), # LATIN SMALL LETTER O WITH HORN AND DOT BELOW (U+1EE3)
  (0x1EE4, "U"), # LATIN CAPITAL LETTER U WITH DOT BELOW (U+1EE4)
  (0x1EE5, "u"), # LATIN SMALL LETTER U WITH DOT BELOW (U+1EE5)
  (0x1EE6, "U"), # LATIN CAPITAL LETTER U WITH HOOK ABOVE (U+1EE6)
  (0x1EE7, "u"), # LATIN SMALL LETTER U WITH HOOK ABOVE (U+1EE7)
  (0x1EE8, "U"), # LATIN CAPITAL LETTER U WITH HORN AND ACUTE (U+1EE8)
  (0x1EE9, "u"), # LATIN SMALL LETTER U WITH HORN AND ACUTE (U+1EE9)
  (0x1EEA, "U"), # LATIN CAPITAL LETTER U WITH HORN AND GRAVE (U+1EEA)
  (0x1EEB, "u"), # LATIN SMALL LETTER U WITH HORN AND GRAVE (U+1EEB)
  (0x1EEC, "U"), # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE (U+1EEC)
  (0x1EED, "u"), # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE (U+1EED)
  (0x1EEE, "U"), # LATIN CAPITAL LETTER U WITH HORN AND TILDE (U+1EEE)
  (0x1EEF, "u"), # LATIN SMALL LETTER U WITH HORN AND TILDE (U+1EEF)
  (0x1EF0, "U"), # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW (U+1EF0)
  (0x1EF1, "u"), # LATIN SMALL LETTER U WITH HORN AND DOT BELOW (U+1EF1)
  (0x1EF2, "Y"), # LATIN CAPITAL LETTER Y WITH GRAVE (U+1EF2)
  (0x1EF3, "y"), # LATIN SMALL LETTER Y WITH GRAVE (U+1EF3)
  (0x1EF4, "Y"), # LATIN CAPITAL LETTER Y WITH DOT BELOW (U+1EF4)
  (0x1EF5, "y"), # LATIN SMALL LETTER Y WITH DOT BELOW (U+1EF5)
  (0x1EF6, "Y"), # LATIN CAPITAL LETTER Y WITH HOOK ABOVE (U+1EF6)
  (0x1EF7, "y"), # LATIN SMALL LETTER Y WITH HOOK ABOVE (U+1EF7)
  (0x1EF8, "Y"), # LATIN CAPITAL LETTER Y WITH TILDE (U+1EF8)
  (0x1EF9, "y")  # LATIN SMALL LETTER Y WITH TILDE (U+1EF9)
]

def unicode_to_utf8(code):
    c = unichr(code)
    return c.encode("utf-8")

def string_to_octals(s):
    out = ""
    for c in s:
        out = out + ("\\%o" % ord(c))
    return out

avec_accents = []
sans_accents = []
for code, chopped in mappings:
    avec_accents.append(string_to_octals(unicode_to_utf8(code)))
    sans_accents.append(chopped)

print "CREATE OR REPLACE FUNCTION strip_accents(VARCHAR) RETURNS VARCHAR AS '"
print "DECLARE"
print "  src ALIAS FOR $1;"
print "  result VARCHAR;"
print "BEGIN"
print "  result := TRANSLATE(src,"
print "    ''%s''," % "".join(avec_accents)
print "    ''%s'');" % "".join(sans_accents)
print "  RETURN result;"
print "END;"
print "' LANGUAGE 'plpgsql' IMMUTABLE;"


