/* ***************************************************************************************** * * * COPYRIGHT: * * (C) Copyright Taligent, Inc., 1996, 1997 * * (C) Copyright International Business Machines Corporation, 1996, 1997 * * Licensed Material - Program-Property of IBM - All Rights Reserved. * * US Government Users Restricted Rights - Use, duplication, or disclosure * * restricted by GSA ADP Schedule Contract with IBM Corp. * * * ***************************************************************************************** */ // Copyright (C) 1996-1997 Taligent, Inc. All rights reserved. // // FILE NAME : unicode.h // // CREATED // Wednesday, December 11, 1996 // // CREATED BY // Helena Shih // // //******************************************************************************************** #ifndef _UNICODE #define _UNICODE #include "ptypes.h" class CompactByteArray; class CompactShortArray; #ifdef NLS_MAC #pragma export on #endif /** * The Unicode class allows you to query the properties associated with individual * Unicode character values. *
* The Unicode character information, provided implicitly by the * Unicode character encoding standard, includes information about the sript * (for example, symbols or control characters) to which the character belongs, * as well as semantic information such as whether a character is a digit or * uppercase, lowercase, or uncased. *
* @subclassing Do not subclass. */ class T_UTILITY_API Unicode { public: /** * The minimum value a UniChar can have. The lowest value a * UniChar can have is 0x0000. */ static const UniChar MIN_VALUE; /** * The maximum value a UniChar can have. The greatest value a * UniChar can have is 0xffff. */ static const UniChar MAX_VALUE; /** * Public data for enumerated Unicode general category types */ enum EUnicodeGeneralTypes { UNASSIGNED = 0, UPPERCASE_LETTER = 1, LOWERCASE_LETTER = 2, TITLECASE_LETTER = 3, MODIFIER_LETTER = 4, OTHER_LETTER = 5, NON_SPACING_MARK = 6, ENCLOSING_MARK = 7, COMBINING_SPACING_MARK = 8, DECIMAL_DIGIT_NUMBER = 9, LETTER_NUMBER = 10, OTHER_NUMBER = 11, SPACE_SEPARATOR = 12, LINE_SEPARATOR = 13, PARAGRAPH_SEPARATOR = 14, CONTROL = 15, FORMAT = 16, PRIVATE_USE = 17, SURROGATE = 18, DASH_PUNCTUATION = 19, START_PUNCTUATION = 20, END_PUNCTUATION = 21, CONNECTOR_PUNCTUATION = 22, OTHER_PUNCTUATION = 23, MATH_SYMBOL = 24, CURRENCY_SYMBOL = 25, MODIFIER_SYMBOL = 26, OTHER_SYMBOL = 27, GENERAL_TYPES_COUNT = 28 }; /** * This specifies the language directional property of a character set. */ enum EDirectionProperty { LEFT_TO_RIGHT = 0, RIGHT_TO_LEFT = 1, EUROPEAN_NUMBER = 2, EUROPEAN_NUMBER_SEPARATOR = 3, EUROPEAN_NUMBER_TERMINATOR = 4, ARABIC_NUMBER = 5, COMMON_NUMBER_SEPARATOR = 6, BLOCK_SEPARATOR = 7, SEGMENT_SEPARATOR = 8, WHITE_SPACE_NEUTRAL = 9, OTHER_NEUTRAL = 10 }; /** * Values returned by the getCellWidth() function. * @see Unicode#getCellWidth */ enum ECellWidths { ZERO_WIDTH = 0, HALF_WIDTH = 1, FULL_WIDTH = 2, NEUTRAL = 3 }; /** * Determines whether the specified UniChar is a lowercase character * according to Unicode 2.0.14. * * @param ch the character to be tested * @return true if the character is lowercase; false otherwise. * * @see Unicode#isUpperCase * @see Unicode#isTitleCase * @see Unicode#toLowerCase */ static t_bool isLowerCase( UniChar ch); /** * Determines whether the specified character is an uppercase character * according to Unicode 2.0.14. * * @param ch the character to be tested * @return true if the character is uppercase; false otherwise. * @see Unicode#isLowerCase * @see Unicode#isTitleCase * @see Unicode#toUpperCase */ static t_bool isUpperCase( UniChar ch); /** * Determines whether the specified character is a titlecase character * according to Unicode 2.0.14. * * @param ch the character to be tested * @return true if the character is titlecase; false otherwise. * @see Unicode#isUpperCase * @see Unicode#isLowerCase * @see Unicode#toTitleCase */ static t_bool isTitleCase( UniChar ch); /** * Determines whether the specified character is a digit according to Unicode * 2.0.14. * * @param ch the character to be tested * @return true if the character is a digit; false otherwise. */ static t_bool isDigit( UniChar ch) ; /** * Determines whether the specified numeric value is actually a defined character * according to Unicode 2.0.14. * * @param ch the character to be tested * @return true if the character has a defined Unicode meaning; false otherwise. * * @see Unicode#isDigit * @see Unicode#isLetter * @see Unicode#isLetterOrDigit * @see Unicode#isUpperCase * @see Unicode#isLowerCase * @see Unicode#isTitleCase */ static t_bool isDefined(UniChar ch); /** * Determines whether the specified character is a control character according * to Unicode 2.0.14. * * @param ch the character to be tested * @return true if the Unicode character is a control character; false otherwise. * * @see Unicode#isPrintable */ static t_bool isControl(UniChar ch); /** * Determines whether the specified character is a printable character according * to Unicode 2.0.14. * * @param ch the character to be tested * @return true if the Unicode character is a printable character; false otherwise. * * @see Unicode#isControl */ static t_bool isPrintable(UniChar ch); /** * Determines whether the specified character is of the base form according * to Unicode 2.0.14. * * @param ch the character to be tested * @return true if the Unicode character is of the base form; false otherwise. * * @see Unicode#isLetter * @see Unicode#isDigit */ static t_bool isBaseForm(UniChar ch); /** * Determines whether the specified character is a letter * according to Unicode 2.0.14. * * @param ch the character to be tested * @return true if the character is a letter; false otherwise. * * * @see Unicode#isDigit * @see Unicode#isLetterOrDigit * @see Unicode#isUpperCase * @see Unicode#isLowerCase * @see Unicode#isTitleCase */ static t_bool isLetter(UniChar ch); /** * A convenience method for determining if a Unicode character * is allowed as the first character in a Java identifier. *
* A character may start a Java identifier if and only if * it is one of the following: *
* A character may be part of a Java identifier if and only if * it is one of the following: *
* A character may be part of a Unicode identifier if and only if * it is one of the following: *
* The following Unicode characters are ignorable in a Java identifier * or a Unicode identifier: *
0x0000 through 0x0008, | *ISO control characters that |
0x000E through 0x001B, | are not whitespace |
and 0x007F through 0x009F | |
0x200C through 0x200F | join controls |
0x200A through 0x200E | bidirectional controls |
0x206A through 0x206F | format controls |
0xFEFF | zero-width no-break space |
* A character has a lowercase equivalent if and only if a lowercase mapping * is specified for the character in the Unicode 2.0 attribute table. *
* Unicode::toLowerCase() only deals with the general letter case conversion. * For language specific case conversion behavior, use UnicodeString::toLower(). * For example, the case conversion for dot-less i and dotted I in Turkish, * or for final sigma in Greek. * * @param ch the character to be converted * @return the lowercase equivalent of the character, if any; * otherwise the character itself. * * @see UnicodeString#toLower * @see Unicode#isLowerCase * @see Unicode#isUpperCase * @see Unicode#toUpperCase * @see Unicode#toTitleCase */ static UniChar toLowerCase(UniChar ch); /** * The given character is mapped to its uppercase equivalent according to Unicode * 2.0.14; if the character has no uppercase equivalent, the character itself is * returned. *
* Unicode::toUpperCase() only deals with the general letter case conversion. * For language specific case conversion behavior, use UnicodeString::toUpper(). * For example, the case conversion for dot-less i and dotted I in Turkish, * or ess-zed (i.e., "sharp S") in German. * * @param ch the character to be converted * @return the uppercase equivalent of the character, if any; * otherwise the character itself. * * @see UnicodeString#toUpper * @see Unicode#isUpperCase * @see Unicode#isLowerCase * @see Unicode#toLowerCase * @see Unicode#toTitleCase */ static UniChar toUpperCase(UniChar ch); /** * The given character is mapped to its titlecase equivalent according to Unicode * 2.0.14. There are only four Unicode characters that are truly titlecase forms * that are distinct from uppercase forms. As a rule, if a character has no * true titlecase equivalent, its uppercase equivalent is returned. *
* A character has a titlecase equivalent if and only if a titlecase mapping * is specified for the character in the Unicode 2.0.14 data. * * @param ch the character to be converted * @return the titlecase equivalent of the character, if any; * otherwise the character itself. * @see Unicode#isTitleCase * @see Unicode#toUpperCase * @see Unicode#toLowerCase */ static UniChar toTitleCase(UniChar ch); /** * Determines if the specified character is a Unicode space character * according to Unicode 2.0.14. * * @param ch the character to be tested * @return true if the character is a space character; false otherwise. */ static t_bool isSpaceChar(UniChar ch); /** * Returns a value indicating a character category according to Unicode * 2.0.14. * @param ch the character to be tested * @return a value of type int, the character category. * @see Unicode#UNASSIGNED * @see Unicode#UPPERCASE_LETTER * @see Unicode#LOWERCASE_LETTER * @see Unicode#TITLECASE_LETTER * @see Unicode#MODIFIER_LETTER * @see Unicode#OTHER_LETTER * @see Unicode#NON_SPACING_MARK * @see Unicode#ENCLOSING_MARK * @see Unicode#COMBINING_SPACING_MARK * @see Unicode#DECIMAL_DIGIT_NUMBER * @see Unicode#OTHER_NUMBER * @see Unicode#SPACE_SEPARATOR * @see Unicode#LINE_SEPARATOR * @see Unicode#PARAGRAPH_SEPARATOR * @see Unicode#CONTROL * @see Unicode#PRIVATE_USE * @see Unicode#SURROGATE * @see Unicode#DASH_PUNCTUATION * @see Unicode#OPEN_PUNCTUATION * @see Unicode#CLOSE_PUNCTUATION * @see Unicode#CONNECTOR_PUNCTUATION * @see Unicode#OTHER_PUNCTUATION * @see Unicode#LETTER_NUMBER * @see Unicode#MATH_SYMBOL * @see Unicode#CURRENCY_SYMBOL * @see Unicode#MODIFIER_SYMBOL * @see Unicode#OTHER_SYMBOL */ static t_int8 getType(UniChar ch); /** * Returns the linguistic direction property of a character. *
* Returns the linguistic direction property of a character. * For example, 0x0041 (letter A) has the LEFT_TO_RIGHT directional * property. * @see #EDirectionProperty */ static EDirectionProperty characterDirection(UniChar ch); /** * Returns a value indicating the display-cell width of the character * when used in Asian text, according to the Unicode standard (see p. 6-130 * of The Unicode Standard, Version 2.0). The results for various characters * are as follows: *
* ZERO_WIDTH: Characters which are considered to take up no display-cell space: * control characters * format characters * line and paragraph separators * non-spacing marks * combining Hangul jungseong * combining Hangul jongseong * unassigned Unicode values *
* HALF_WIDTH: Characters which take up half a cell in standard Asian text: * all characters in the General Scripts Area except combining Hangul choseong * and the characters called out specifically above as ZERO_WIDTH * alphabetic and Arabic presentation forms * halfwidth CJK punctuation * halfwidth Katakana * halfwidth Hangul Jamo * halfwidth forms, arrows, and shapes *
* FULL_WIDTH: Characters which take up a full cell in standard Asian text: * combining Hangul choseong * all characters in the CJK Phonetics and Symbols Area * all characters in the CJK Ideographs Area * all characters in the Hangul Syllables Area * CJK compatibility ideographs * CJK compatibility forms * small form variants * fullwidth ASCII * fullwidth punctuation and currency signs *
* NEUTRAL: Characters whose cell width is context-dependent: * all characters in the Symbols Area, except those specifically called out above * all characters in the Surrogates Area * all charcaters in the Private Use Area *
* For Korean text, this algorithm should work properly with properly normalized Korean * text. Precomposed Hangul syllables and non-combining jamo are all considered full- * width characters. For combining jamo, we treat we treat choseong (initial consonants) * as double-width characters and junseong (vowels) and jongseong (final consonants) * as non-spacing marks. This will work right in text that uses the precomposed * choseong characters instead of teo choseong characters in a row, and which uses the * choseong filler character at the beginning of syllables that don't have an initial * consonant. The results may be slightly off with Korean text following different * conventions. */ static t_uint16 getCellWidth(UniChar ch); static UniChar* toLowerCase(UniChar* ch, t_int32 size); static UniChar* toUpperCase(UniChar* ch, t_int32 size); static int compare(const UniChar* ch, t_int32 size, const UniChar* ch1, t_int32 size1); static int compareIgnoreCase(const UniChar* ch, t_int32 size, const UniChar* ch1, t_int32 size1); static TextOffset indexOf(const UniChar* ch, t_int32 size, const UniChar* character, t_int32 length, TextOffset fromOffset = 0); static TextOffset lastIndexOf(const UniChar* ch, t_int32 size, const UniChar* character, t_int32 length, TextOffset fromOffset = 0); static size_t length(const UniChar* str); static UniChar* copy(const UniChar* str); // // Netscape Added Methods // /** * Releases a UniChar array allocated by one of the Unicode methods. */ static void release(UniChar* buffer); /** * Returns a pointer to the first instance of ch in the * Unicode string. * @param str string to search * @param strLength length of str in UniChars * @param ch UniChar to search for */ static const UniChar* strchr(const UniChar* str, size_t strLength, UniChar ch); /** * Returns a pointer to the last instance of ch in the * Unicode string. * @param str string to search * @param strLength length of str in UniChars * @param ch UniChar to search for */ static const UniChar* strrchr(const UniChar* str, size_t strLength, UniChar ch); /** * Compares two UniChar arrays based on the underlying file system * mode of comparison. * @param source array to be compared * @param sourceLength length of source in UniChars * @param target array to be compared * @param targetLength length of target in UniChars */ static int fileNameCompare(const UniChar* source, size_t sourceLength, const UniChar* target, size_t targetLength); /** * Concatenates two UniChar arrays and returns the result in a new buffer * @param str1 first string * @param sourceLength length of str1 in UniChars * @param str2 second string * @param str2Length length of second string */ static UniChar* appendString(const UniChar* str1,size_t str1Length, const UniChar* str2,size_t str2Length); /** * Regular Expression-like search through a UniChar string. * @param string string to search * @param stringLength length of string in UniChars * @param expression regular expression (as a C-string) */ static TextOffset regularExpressionSearch(const UniChar* string, size_t stringLength, const char* expression); /** * Regular Expression-like search through a UniChar string. * @param source string to search * @param sourceLength length of source in UniChars * @param expression regular expression (as a UniChar) * @param expressionLength length of regular expression in UniChars */ static TextOffset regularExpressionSearch(const UniChar* string, size_t stringLength, const UniChar* expression, size_t expressionLength); protected: // These constructors, destructor, and assignment operator must // be protected (not private, as they semantically are) to make // various UNIX compilers happy. [LIU] Unicode(); Unicode( const Unicode& other); ~Unicode(); const Unicode& operator=( const Unicode& other); private: static const t_int8 isLetterMask; static const t_uint16 indicies[]; static const t_int8 values[]; static const t_int32 offsetCount; static const t_uint16 caseIndex[]; static const t_int16 caseValues[]; static const t_int32 caseCount; static const t_uint16 fCharDirIndices[]; static const t_int8 fCharDirValues[]; static const t_int32 fCharDirCount; static CompactByteArray *tables; static CompactShortArray *ulTables; static CompactByteArray *dirTables; static t_bool tablesCreated; static t_bool ulTablesCreated; static t_bool dirTablesCreated; static void createTables(); static void createUlTables(); static void createDirTables(); }; #ifdef NLS_MAC #pragma export off #endif #endif