This is an archive of the original site, preserved as a historical reference. Some of the content is outdated. Please consult our other sites for more current information:, ScriptSource, FDBP, and silfontdev


Contact Us


Initiative B@bel

WSI Guidelines


















Type Design


Design Tools



Font Downloads










Font FAQ



Computers & Writing Systems


You are here: Encoding > Unicode > Tutorials
Short URL:

TECkit mapping language conversion

David Rowe and Lorna A. Priest, 2009-02-17

Return to Unicode Transition Tutorial Links.


This page is currently being updated. Come back in a day or two.


The object of this tutorial is to go through the process of creating and using a conversion mapping in the TECkit mapping language. The SIL IPA93 legacy font will be used in this example.

The example files are worked using the TECkit language approach.

Before beginning you will need to follow the document: Computer setup for encoding conversion.

Making a copy of the font in your work area

  • Open the Windows Explorer program.
  • Navigate to the C:WindowsFonts folder and locate the file ipa93dr.ttf.
  • Click on this file, then select Edit / Copy to make a copy of the file.
  • Navigate to the folder C:UTTutorial3-TECkit IPA93.
  • Select Edit / Paste to place a copy of the “SILDoulos IPA93” font file in your work area.


Note that it is also possible to make a copy of the font by clicking and dragging, but doing so increases the chance of mistakenly moving the font rather than copying it.

It is also possible to work directly with the font file in the Fonts folder, but then the files you generate will end up in this folder as well.

Generating a draft mapping using Encore2Unicode

  • Right-click on ipa93dr.ttf in the C:UTTutorial3-TECkit IPA93 folder and select Copy from the context menu.
  • Go to the “E2U TECkit” shortcut on the desktop (you may need to minimize the Windows Explorer program) and right-click on it, then select Paste from the context menu.


This Copy / Paste function accomplishes the same result as dragging the font file and dropping it onto the shortcut, but reduces the chance of “dropping” the file in the wrong place.

The Encore2Unicode program will put up a window on the screen. This window will remain empty while the program is working. When the draft mapping file has been created, the program will display “Encore2Unicode finished: press Return to exit...”.


If the program detects a problem, the window will display information to help you find what is wrong. This can occur if you mistakenly give it the wrong type of file.

If you launch the program by double-clicking on it, it will give you information on how to run the program from the command line.

  • Press  Enter  at this point and the program will close, leaving two new files - ipa93dr.rtf and - in the folder with the font file. The former contains a report of the generated mapping and the latter contains the draft mapping itself.


Note that the content of any .map file must be considered a draft. The Encore2Unicode program has perhaps done eighty or ninety percent of the work, but you must review and correct this draft.

Editing the draft mapping using TECkit Unicode Mapping Editor

  • Right-click on in the C:UTTutorial3-TECkit IPA93 folder and select Open With and the TECkit Mapping Unicode Editor.
  • At the Select Conversion Type dialog box, make sure Legacy to Unicode and Bidirectional are selected.
  • Click on  OK .
  • Where it says Select the font for the left-hand side encoding click on  OK .
  • Select "SILDoulos IPA93" for the font and click on  OK .
  • Where it says Select the font for the right-hand side encoding click on  OK .
  • Select "Doulos SIL" for the font and click on  OK .
  • The TECKit Mapping Editor program will start with the file loaded.


  • Comments can be inserted in the file to document what you or someone else did. They begin with a semi-colon (;) and continue to the end of the line. A comment may appear on a line by itself, or at the end of the line. The compiler ignores them.
  • The draft mapping you just created starts off with the following comment:
; Draft TECkit mapping file generated by Encore2Unicode from 
     C:UTTutorial3-TECkit IPA93Ipa93dr.ttf
  • Add a comment with the date and your name to document the work you are about to do.


  • The mapping file includes a header. Encore2Unicode has filled in the font name (“SILDoulos_IPA93” for our example), but often the same encoding is used for several different fonts, so it will likely need to be changed.
EncodingName            "(REG_ID)-SILDoulos_IPA93-(VERSION)"
DescriptiveName         ""
Version                 "0"
Contact                 "mailto:(YOUR_ADDRESS_HERE)"
RegistrationAuthority   "(REG_NAME)"
RegistrationName        "SILDoulos IPA93-(VERSION)"

;*** Replace "(REG_ID)" with "SIL" or other organization identifier
;*** Replace "(REG_NAME)" with "SIL International" or other organization name
;*** Replace "(VERSION)" with year the encoding was introduced
;*** Replace "(YOUR_ADDRESS_HERE)" with your email address
;*** Replace font name with other encoding identifier if appropriate
  • Make the following changes to the header:
    • In the EncodingName field, replace “(REG_ID)” with “SIL”, change the font name from “SILDoulos_IPA93” to “IPA93”, and replace “(VERSION)” with “2002”.
    • Enter the DescriptiveName: “SIL IPA93 as supported by SIL IPA93 font package”.
    • Replace “(YOUR_ADDRESS_HERE)” with your e-mail address.
    • Replace “(REG_NAME)” with “SIL International”.
    • Change the RegistrationName field to “SILIPA93-2002”.

Normalization flags and control code classes

We’ll leave the normalization flags alone for now.


Note the syntax for defining a class of characters, either byte or Unicode. This is used to map the byte control codes (hex 00 through 1F) to the Unicode ones (hex 0000 through 001F). Later in this exercise, we will be defining classes for use in describing the context in which a mapping should occur.

Check character assignments - PUA character notes


Since this is a tutorial, we'll be providing a lot of the information. For your mapping, you'll need to do the research.

  • The Encore2Unicode program has made its best guess as to what Unicode character is represented by the glyph chosen for each code point in the legacy font. Where there are several Unicode characters that might be possibilities, Encore2Unicode adds an asterisk to the end of the line. See, for example, the entry for 0x22:
0x22    <>    U+0069    ; latin_small_letter_i  --  SILID 1411*

and consult the entry at the bottom of the file for SILID 1411:

;* SILID 1411: Typically SILID 1411 is used with diacritics and so should map 
     to U+0069 [Basic Latin]. If the orthography distinguishes dotted and
     dotless 'i' characters, then U+0131 [Latin Extended-A] may be

In this case, we do want the U+0069 entry, since the "dotless i" is used when diacritics must be placed over the letter "i". We'll be looking at this entry later, but for now leave it as it is.


TECkit also supports referencing Unicode characters by their names ("latin_small_letter_i", for example) rather than number.

  • In some cases the Encore2Unicode program has placed the notation “PUA” (for “Private Use Area”) instead of a Unicode character. This could indicate that there is no established Unicode character for the glyph from the Encore font, or that the program could not detect what character was intended.
  • Use  Ctrl  +  Home  to return to the top of the file. Then select Edit / Find/Replace, type “PUA” in the “Find:” field and click on  Find . This should take you to the entry for 0xAD. It turns out that 0xAD should map to U+0320. Make this change and update the comment to read:
0xAD    <>    U+0320    ; combining_minus_sign_below
  • Use Edit / Find Again (or the  Ctrl  +  G  keyboard shortcut) to find the next occurrence of “PUA”. This should take you to the entry for 0xC9. It turns out that this character really isn’t in Unicode (yet) and SIL’s PUA committee has assigned it a location in the PUA at U+F180. Make this change and update the comment to read:
0xC9    <>    U+F180    ; superscript m [PUA]
  • Use  Ctrl  +  G  to find the next occurrence of “PUA”. This should take you to the entry for 0xCB. This character has been assigned a location in the PUA at U+F181. Make this change and update the comment to read:
0xCB    <>    U+F181    ; superscript left-tail n [PUA]
  •  Ctrl  +  G  should take you to the entry for 0xD4, which has been assigned a location in the PUA at U+F182. Make this change and update the comment to read:
0xD4    <>    U+F182    ; superscript eng [PUA]
  •  Ctrl  +  G  again should take you to the entry for 0xDC. It turns out that the Unicode character needed here is U+0304. Make this change and update the comment to read:
0xDC    <>    U+0304    ; combining_macron
  •  Ctrl  +  G  once more should take you to 0xF2. The comment at the bottom of the file for SILID 6401 says:
;* SILID 6401: See U+0334 [Combining Diacritical Marks]. Combinations that use
     a combining overlay (U+0334 [Combining Diacritical Marks]..U+0338 
     [Combining Diacritical Marks], U+20E5 [Combining Diacritical Marks for 
     Symbols]) should probably be handled as a single, non-decomposed 
     character, and we should probably try to get that character into Unicode 
     before we consider encoding it using the combining overlay characters.

One possibility is to map this character to U+0334, however it seems better to map specific combinations, for example:

0x6c 0xF2 <> U+026B ; latin_small_letter_l_with_middle_tilde

Comment out the entry for 0xF2 by placing a “;” in front of it, then add the above specific mapping.

  •  Ctrl  +  G  again will take you down to the bottom of the file where the SILID comments are.

Check character assignments - Did E2U choose correctly?

Although the mapping file will now compile without errors (try it if you want!), it is still not correct. You’re probably sick of us telling you that Encore2Unicode creates a draft mapping that must be reviewed carefully, but what’s needed next is careful review.
Look at the entry for 0x27

0x27    <>    U+0027    ; apostrophe  --  quoteright = SILID 9038* (mapped as 
     codepage 1252 character)

The asterisk (*) after the SILID indicates that there is a note at the bottom of the file:

;* SILID 9038: The appropriate mapping of Encore glyph SILID 9038 depends upon 
     how it is used. The following are preferred: for apostrophe (in 
     contractions), U+2019 [General Punctuation]; for quotation, U+2018 
     [General Punctuation] and U+2019 [General Punctuation] (may use U+201A 
     [General Punctuation] or U+201B [General Punctuation] depending upon 
     locale conventions); for indicating primary stress in IPA transcription, 
     U+02C8 [Spacing Modifier Letters] (U+02B9 [Spacing Modifier Letters] or 
     U+02CA [Spacing Modifier Letters] may be preferred typographically in 
     some dictionaries); for glottalization, ejective consonants or 
     orthographic glottal stop, U+02BC [Spacing Modifier Letters]; for minutes 
     or feet...

In this case, the correct choice is U+02BC, since this font was designed for IPA and this character is the glottal stop. Make the change in the mapping file.

0x27    <> U+02BC    ; modifier_letter_apostrophe


The most important thing for you to consider in developing your mapping is how the apostrophe character is used. If it is used as an apostrophe in contractions, most likely you will want to use U+2019.

  • Look at the entry for 0x47:
0x47    <>    U+0047    ; latin_capital_letter_g  --  SILID 3009* 
     (mapped as codepage 1252 character)

and at the corresponding note at the bottom of the file:

;* SILID 3009: If the small cap attribute is not being used for a character 
     distinction, Encore glyph SILID 3009 should be mapped to U+0047 
     [Basic Latin].

In this case, the correct choice is U+0262, an IPA character. Make this change in the mapping file.
Similarly, change the entry for 0x49 to use U+026A, for 0x59 to use U+028F, and for 0x67 to use U+0261.

0x47    <> U+0262    ; latin_letter_small_capital_g
0x49    <> U+026A    ; latin_letter_small_capital_i
0x59    <> U+028F    ; latin_letter_small_capital_y
0x67    <> U+0261    ; latin_letter_small_script_g


Remember to check whether the characters that Encore2Unicode generated are what you really want. Don’t judge by the shape of the glyph, but by the description of how the character is used. Check the notes at the bottom of the file.

  • Look at the entry for 0x7C:
0x7C    <> U+0020 U+031A   ; space combining_left_angle_above  --  SILID 9086

Remove the “U+0020”. It turns out that this extra space character which Encore2Unicode generated is in error. (This will likely be corrected in a later version of the program.)

  • Look at the entry for 0x3D:
0x3D    <>    U+0331    ; combining_macron_below  --  SILID 0130 
     (space glyph ignored) + SILID 6609*


First of all note that the “SILID 0130 (space glyph ignored)” message is included when Encore2Unicode encounters an overstriking diacritic. You may want to make a global replacement to change “SILID 0130 (space glyph ignored) + “ to nothing to eliminate this part of the comment.

As it turns out, E2U chose the wrong character for 0x3D. It turns out that this is the same character in the entry for 0xAD which you corrected previously. Both refer to the same combining diacritic, U+0320, and the entry for 0x3D should read:

0x3D    <>    U+0320    ; combining_minus_sign_below

Make this change in your file. Later we’ll be adding constraints to these (and other) diacritics so that the correct choice will be made when mapping from Unicode back to the legacy font encoding.

  • The following entries are very similar and it turns out that Encore2Unicode chose the wrong Unicode character for two of them:
0x8E    <>     U+007C    ; vertical_line  --  SILID 9090*
0x92    <>     U+007C U+007C    ; vertical_line vertical_line — SILID 9090* + SILID 9090*
0x96    <>    U+007C    ; vertical_line  --  bar = SILID 9055*

The correct characters for the first two entries are U+01C0 (latin letter dental click) and U+01C1 (latin letter lateral click). Correct these entries in your file to read.

0x8E    <>    U+01C0    ; latin_letter_dental_click
0x92    <>    U+01C1    ; latin_letter_lateral_click
  • Look at the entry for 0x84:
0x84    <>    U+2225    ; parallel_to  --  SILID 9078*

The note at the end of the file (referenced by the SILID 9078*) says:

;* SILID 9078: See also U+01C1 [Latin Extended-B] and U+2016 
     [General Punctuation].

The character that Encore2Unicode chose was the mathematical symbol for “is parallel to”. The better choice here is U+2016 (double vertical line). Make this correction in your file:

0x84    <>    U+2016    ; double_vertical_line
  • Here’s another entry for which Encore2Unicode chose the wrong character:
0x97    <>    U+0021    ; exclamation_mark  --  exclam = SILID 9016*

Correct this entry to use U+01C3 (latin letter retroflex click):

0x97    <>    U+01C3    ; latin_letter_retroflex_click
  • For the following entries, Encore2Unicode chose the right character, but entered it twice. (This will likely be corrected in a later version of the program.)
0x8A    <>    U+02E5 U+02E5    ; modifier_letter_extra_high_tone_bar 
     modifier_letter_extra_high_tone_bar  --  SILID 0655
0x91    <>    U+02E6 U+02E6    ; modifier_letter_high_tone_bar 
     modifier_letter_high_tone_bar  --  SILID 0644
0x95    <>    U+02E7 U+02E7    ; modifier_letter_mid_tone_bar 
     modifier_letter_mid_tone_bar  --  SILID 0633
0x9A    <>    U+02E8 U+02E8    ; modifier_letter_low_tone_bar 
     modifier_letter_low_tone_bar  --  SILID 0622
0x9F    <>    U+02E9 U+02E9    ; modifier_letter_extra_low_tone_bar 
     modifier_letter_extra_low_tone_bar  --  SILID 0611

Correct these five entries by deleting the extra Unicode character. (Correct the comment as well.)

  • Look at the entry for 0xCA and the corresponding note at the bottom of the file.
0xCA    <>    U+2002    ; en_space  --  composite: SILID 0130*

;* SILID 0130: Possible mappings include space U+0020 [Basic Latin]; no-break 
     space U+00A0 [Latin-1 Supplement]; en space U+2002 [General Punctuation]; 
     three-per-em space U+2004 [General Punctuation]; four-per-em space U+2005 
     [General Punctuation]; six-per-em space U+2006 [General Punctuation]; 
     figure space U+2007 [General Punctuation]; punctuation space U+2008 
     [General Punctuation]; thin space U+2009 [General Punctuation]; hair 
     space U+200A [General Punctuation]; zero width space U+200B 
     [General Punctuation]; ideographic space U+3000 [CJK Symbols and 
     Punctuation] and zero width no-break space U+FEFF [Arabic Presentation 

There are lots of spaces from which to choose and Encore2Unicode doesn’t have enough information so it made its best guess. It turns out that this character should be the “hair space” U+200A. Make this change in the file.

Adding context to constrain mappings


Since this tutorial was written, the TECkit mapping language has been enhanced to allow contexts to be defined once and then referenced in each entry which needs them.


In the following steps, the “(*)” indicates a step (or part of a step) that can be omitted if time is short. The resulting mapping file will be able to handle the specific test data, but not be a general solution. The goal of the tutorial is to show you this process rather than to reproduce this specific mapping.

  • Look at the entries for 0x22 and 0x69. The first is the one you saw in an earlier step.
0x22    <>    U+0069    ; latin_small_letter_i
0x69    <>    U+0069    ; latin_small_letter_i

The first is a “dotless i” used when diacritics are placed over an “i”. The second is the normal “dotted i”. When converting from legacy byte encodings to Unicode, both map to the Unicode character U+0069. This is fine since the Unicode font is smart enough to remove the dot when putting on an accent. However, in order to convert from Unicode back to the legacy byte encoding, we need to supply a context to constrain one of these mappings. (We could constrain both, but it is easier to pick one as the default case.)

When converting from Unicode to bytes, we want to pick the “dotless i” (0x22) when it is followed by a diacritic that is rendered above it. Rather than list all the possible combinations, we’ll make use of the “class” construct we saw earlier under “Normalization flags and control code classes”. We also need to allow for the possibility of a diacritic that is rendered under the “i” coming between the “i” and the diacritic over it.

For your reference, the diacritics that appear in the SIL IPA93 legacy font are listed in the table in Appendix I.
Go to the top of the file and after the

[CTL]     <>     [CTL]

statement, create a Unicode class called “uDia” and assign to it all the diacritics that are in the “Above” section of the table in Appendix I. Then create another Unicode class called “lDia” and assign to it all the diacritics that are in the “Below” section of the table. You should end up with something like this:

; diacritics which appear above a base character
UniClass [uDia] = (U+0300 U+0301 U+0302 U+0303 U+0304 U+0306 
     U+0308 U+030A U+030B U+030C U+030F U+033D U+0361)

; diacritics which appear below a base character
UniClass [lDia] = (U+0318 U+0319 U+031C U+031D U+031E U+031F 
     U+0320 U+0324 U+0325 U+0329 U+032A U+032C 
     U+032F U+0330 U+0339 U+033A U+033B U+033C)


Note that if you want to break a long line you will need to place a “” character at the end of the line.

Armed with these class definitions, we can write the mapping for the “dotless i”. Since the constraint applies when mapping from Unicode to bytes, the context is added to the Unicode side of the mapping. Change the entry for 0x22 to be:

0x22     <>     U+0069 / _ [lDia]? [uDia]

The “_” indicates the character (U+0069 in this case). The “[lDia]?” indicates zero or one occurrences of a member of the “lDia” class. The “[uDia]” indicates one occurrence of a member of the “uDia” class.

(*) Now add a similar context to the entries for 0xAE (dotless i with stroke) and 0xBE (dotless j).

  • We now need to add constraints to the diacritics in Appendix I. In the design of the IPA font, some of the overstriking diacritics were included at multiple code points with different horizontal or vertical spacings, so that they would appear in the correct position over base characters. For example, there are four possibilities for the grave accent (`): 0x24 for use with “o-width” characters, 0xDD for use with “i-width” characters, 0x98 for use with “o width” characters that also have ascenders, and 0x99 for use with “i-width” characters with ascenders. When mapping from byte encoding to Unicode, all four map to U+0300. When mapping from Unicode back to the legacy encoding, constraints must be added to the Unicode side of the expression in order to specify the context in which the rule applies.
  • Rather than list all the possible combinations of all base characters with all diacritics, we will use classes to group the base characters. Of the four classes: “o-width”, “i-width”, “o width high” and “i-width high”, it turns out that most of the characters fall into the “o width” group, so we will use this group as the default and leave entries associated with “o width” base characters unconstrained.
    • Make a Unicode class called “iWid” and assign the following character to it: U+0069, U+006A, U+0072, U+0268, U+026A, U+0279, U+027A, U+027B, U+027D, U+027E, U+029D. These are narrow base characters, such as the letter “i”.
    • (*) Make another Unicode class called “oWidHigh” and assign the following characters to it: U+0062, U+0064, U+0068, U+006B, U+00F0, U+0127, U+01C3, U+0253, U+0256, U+0257, U+0260, U+0266, U+0267, U+026C, U+0278, U+028E, U+0294, U+0295, U+02A1, U+02A2, U+02BE, U+03B2, U+03B8. These are tall base characters, such as the letter “b”.
    • (*) Make another Unicode class called “iWidHigh” and assign the following characters to it: U+0066, U+006C, U+0074, U+026D, U+0283, U+0284, U+0288. These are tall and narrow base characters, such as the letter “l”.
    • (*) In addition, add a comment indicating that the “oWid” class is the default.
  • For all the entries (* or as a minimum, the ones for U+0300 and U+0301) in the “i-width” column of the “above” section of the table in Appendix I, add a constraint indicating that an “i-width” base character and an optional diacritic under this base character precede the diacritic. Change the comment to indicate that this diacritic is used with “i-width” characters. For example, the entry for 0xDD would change from:
0xDD    <>    U+0300    ; combining_grave_accent


0xDD    <>    U+0300    / [iWid] [lDia]? _; i-width combining_grave_accent
  • (*) For all the entries in the “below” section of the “i-width” column of the table in Appendix I, add a constraint indicating that an “i-width” base character precedes the diacritic. Change the comment to indicate that this diacritic is used with “i-width” characters. For example, the entry for 0xBC would change from:
0xBC    <>    U+0330    ; combining_tilde_below


0xBC    <>    U+0330    / [iWid] _ ; i-width combining_tilde_below
  • (*) Using the appropriate class, add constraints on the entries found in the "i-width raised" column.
  • (*) Using the appropriate class, add constraints on the entries found in the “o-width raised” column.
  • (*) Now, change the comment for each of the entries in the “o-width” column to include the notation “o-width”.


Note that the constraints used in the actual .map file are more complex than those used in this tutorial and allow combinations such as “i/tilde/acute” to be mapped correctly from Unicode to the legacy IPA font (where the acute accent must be “i-width high” because of the tilde).

  • Select File / Compile. If there are errors, a box appears with a list of the error(s) and the relevant line number. Double-clicking on the line number will highlight the line in question in your document so that you can easily see which line is in error.
  • A successful compile is indicated by the lack of any error messages. In this case, the compiled .tec file will have been created in your work folder.
  • Close the TECkit Mapping Editor, saving the changes to your file.
  • In Explorer, verify that the ipa93dr.tec file has been created.

Using DropTEC

  • Double-click on the DropTEC shortcut on your desktop. The DropTEC program will open.
  • Drag the ipa93dr.tec file from your work folder to the “Mapping file:” box at the top.
  • Drag the ipatest.txt file from the C:UTTutorial3-TECkit IPA93 folder to “Legacy text file:” box on the left. A dialog box will open allowing you to choose the output file name. Accept the default ipatest-U.txt that is offered.
  • Drag the newly created ipatest-U.txt to the “Unicode text file:” box on the right. Accept the default ipatest-U-B.txt that is offered. Is this file identical to ipatest.txt?

Appendix I - Diacritics in SIL IPA93 font

UnicodeDescriptiono-widthi-widtho-width raisedi-width raised
U+0300 combining_grave_accent 0x24 0xDD 0x98 0x99
U+0301 combining_acute_accent 0x40 0xDB 0x8F 0x90
U+0302 combining_circumflex_accent 0x5E 0xDF 0xE9 0xE6
U+0303 combining_tilde 0x29 0xE2    
U+0304 combining_macron 0x23 0xDC 0x93 0x94
U+0306 combining_breve 0x28 0xE1    
U+030A combining_ring_above 0x2A 0xA1    
U+030B combining_double_acute_accent 0x21 0xDA 0x88 0x89
U+030C combining_caron 0x26 0xE0 0xF4 0xF3
U+030F combining_double_grave_accent 0x25 0xDE 0x9D 0x9E
U+0308 combining_diaeresis 0x5F      
U+033D combining_x_above 0x7E      
U+0361 combining_double_inverted_breve 0x83      

Diacritics occurring above the base character

U+0318 combining_left_tack_below 0x31 0xC1
U+0319 combining_right_tack_below 0x32 0xAA
U+031D combining_up_tack_below 0x33 0xA3
U+031E combining_down_tack_below 0x34 0xA2
U+031F combining_plus_sign_below 0x2B 0xB1
U+0320 combining_minus_sign_below 0x3D 0xAD
U+0324 combining_diaeresis_below 0x2D 0xD0
U+0325 combining_ring_below 0x38 0xA5
U+032F combining_inverted_breve_below 0x39 0xBB
U+0330 combining_tilde_below 0x30 0xBC
U+031C combining_left_half_ring_below 0x37  
U+0329 combining_vertical_line_below 0x60  
U+032A combining_bridge_below 0x35  
U+032C combining_caron_below 0xA4  
U+0339 combining_right_half_ring_below 0xA6  
U+033A combining_inverted_bridge_below 0xB0  
U+033B combining_square_below 0x36  
U+033C combining_seagull_below 0xD1  

Diacritics occurring below the base character

© 2003-2024 SIL International, all rights reserved, unless otherwise noted elsewhere on this page.
Provided by SIL's Writing Systems Technology team (formerly known as NRSI). Read our Privacy Policy. Contact us here.