## Appendix B - Calculation of font (FTC) and language (LID)

Certain Unicode characters are shared between Far East and non-Far East scripts requiring the calculation of font and language based on the Unicode character code and the chp.idctHint property.

Characters are classified into one of four groups, ASCII, Far East, floating, and non-Far East. Properties are calculated as follows:

Character type | Font (ftc) | Language (lid)
ASCII | sprmCRgftc0 | sprmCRglid0
non-Far East | sprmCRgftc2 | sprmCRglid0
Far East | sprmCRgftc1 | sprmCRglid1
shared character | sprmCRgftc2 if chp.idctHint is 0 sprmCRgftc1 if chp.idctHint is 1 | sprmCRglid0 if chp.idctHint is 0 sprmCRglid1 if chp.idctHint is 1

The table below defines the classification of various ranges of Unicode characters:

Unicode subrange | character range | Classification
usrBasicLatin | 0x20->0x7f | ASCII
usrLatin1 | 0xa0->0xff | some shared (see notes below)
usrLatinXA | 0x100->0x17f | some shared (see notes below)
usrLatinXB | 0x180->0x24f | some shared (see notes below)
usrIPAExtensions | 0x250->0x2af | some shared (see notes below)
usrSpacingModLetters | 0x2b0->0x2ff | shared
usrCombDiacritical | 0x300->0x36f | shared
usrBasicGreek | 0x370->0x3cf | shared
usrGreekSymbolsCop | 0x3d0->0x3ff | non-Far East
usrCyrillic | 0x400->0x4ff | shared
usrArmenian | 0x500->0x58f | non-Far East
usrBasicHebrew | 0x5d0->0x5ff | non-Far East
usrHebrewXA | 0x590->0x5cf | non-Far East
usrBasicArabic | 0x600->0x652 | non-Far East
usrArabicX | 0x653->0x6ff | non-Far East
usrDevangari | 0x900->0x97f | non-Far East
usrBengali | 0x980->0x9ff | non-Far East
usrGurmukhi | 0xa00->0xa7f | non-Far East
usrGujarati | 0xa80->0xaff | non-Far East
usrOriya | 0xb00->0xb7f | non-Far East
usrTamil | 0x0b80->0x0bff | non-Far East
usrTelugu | 0x0c00->0x0c7f | non-Far East
usrKannada | 0x0c80->0x0cff | non-Far East
usrMalayalam | 0x0d00->0x0d7f | non-Far East
usrThai | 0x0e00->0x0e7f | non-Far East
usrLao | 0x0e80->0x0eff | non-Far East
usrBasicGeorgian | 0x10d0->0x10ff | non-Far East
usrGeorgianExtended | 0x10a0->0x10cf | non-Far East
usrHangulJamo | 0x1100->0x11ff | non-Far East
usrLatinExtendedAdd | 0x1e00->0x1eff | shared
usrGreekExtended | 0x1f00->0x1fff | non-Far East
usrGeneralPunct | 0x2000->0x206f | shared
usrSuperAndSubscript | 0x2070->0x209f | shared
usrCurrencySymbols | 0x20a0->0x20cf | shared
usrCombDiacriticsS | 0x20d0->0x20ff | shared
usrLetterlikeSymbols | 0x2100->0x214f | shared
usrNumberForms | 0x2150->0x218f | shared
usrArrows | 0x2190->0x21ff | shared
usrMathematicalOps | 0x2200->0x22ff | shared
usrMiscTechnical | 0x2300->0x23ff | shared
usrControlPictures | 0x2400->0x243f | shared
usrOpticalCharRecog | 0x2440->0x245f | shared
usrEnclosedAlphanum | 0x2460->0x24ff | shared
usrBoxDrawing | 0x2500->0x257f | shared
usrBlockElements | 0x2580->0x259f | shared
usrGeometricShapes | 0x25a0->0x25ff | shared
usrMiscDingbats | 0x2600->0x26ff | shared
usrDingbats | 0x2700->0x27bf | shared
usrCJKSymAndPunct | 0x3000->0x303f | Far East
usrHiragana | 0x3040->0x309f | Far East
usrKatakana | 0x30a0->0x30ff | Far East
usrBopomofo | 0x3100->0x312f | Far East
usrHangulCompatJamo | 0x3130->0x318f | Far East
usrCJKMisc | 0x3190->0x319f | Far East
usrEnclosedCJKLtMnth | 0x3200->0x32ff | Far East
usrCJKCompatibility | 0x3300->0x33ff | Far East
usrHangul | 0xac00->0xd7a3 | Far East
usrReserved1 |  |
usrReserved2 |  |
usrCJKUnifiedIdeo | 0x4e00->0x9fff | Far East
usrPrivateUseArea | 0xe000->0xf8ff | shared
usrCJKCompatibilityIdeographs | 0xf900->0xfaff | Far East
usrAlphaPresentationForms | 0xfb00->0xfb4f | shared
usrArabicPresentationFormsA | 0xfb50->0xfdff | shared
usrCombiningHalfMarks | 0xfe20->0xfe2f | Far East
usrCJKCompatForms | 0xfe30->0xfe4f | Far East
usrSmallFormVariants | 0xfe50->0xfe6f | Far East
usrArabicPresentationFormsB | 0xfe70->0xfefe | shared
usrHFWidthForms | 0xff00->0xffef | Far East
usrSpecials | 0xfff0->0xfffd | non-Far East

The table below describes the behavior of the unicode subrange usrLatin1. Shared characters are marked in this table with a 1, while characters marked with a 0 are considered "non-Far East". All other characters in this unicode subrange are considered "non-Far East".

       // 0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
          0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, // 0x00a0-0x00af
          1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, // 0x00b0-0x00bf
          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x00c0-0x00cf
          0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, // 0x00d0-0x00df
          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x00e0-0x00ef
          0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, // 0x00f0-0x00ff
          };

The table below describes the behavior of the unicode range usrLatinXA. Shared characters are marked in this table with a 1, while characters marked with a 0 are considered "non-Far East". All other characters in this unicode subrange are considered "non-Far East".

       // 0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
          1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x0100-0x010f
          0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, // 0x0110-0x011f
          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, // 0x0120-0x012f
          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x0130-0x013f
          0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, // 0x0140-0x014f
          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x0150-0x015f
          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, // 0x0160-0x016f

In usrLatinXB shared characters are 0x192, 0x1FA, 0x1FB, 0x1FC, 0x1FD, 0x1FE and 0x1FF. All other characters in this unicode subrange are considered "non-Far East".

In usrIPAExtensions shared characters are 0x251, and 0x261.

An optimization is available. If the Far East font chp.ftcFE is 0 and chp.idctHint is 0 and chp.ftcAscii is equal to chp.ftcOther, the font is chp.ftcAscii and the language is chp.lidDefault.

© 1998 Microsoft Corporation. All rights reserved. Terms of use