CharUnicodeInfo Class
Updated: August 2010
Retrieves information about a Unicode character. This class cannot be inherited.
Assembly: mscorlib (in mscorlib.dll)
The Unicode Standard defines a number of Unicode character categories. For example, a character might be categorized as an uppercase letter, a lowercase letter, a decimal digit number, a letter number, a connector punctuation, a math symbol, or a currency symbol. Your application can use the character category to govern string-based operations, such as parsing. The UnicodeCategory enumeration defines the possible character categories.
Your application uses the CharUnicodeInfo class to obtain the UnicodeCategory value for a specific character. The CharUnicodeInfo class defines methods that return the following Unicode character values:
-
Numeric value. Applies only to numeric characters, including fractions, subscripts, superscripts, Roman numerals, currency numerators, encircled numbers, and script-specific digits.
-
Digit value. Applies to numeric characters that can be combined with other numeric characters to represent a whole number in a numbering system.
-
Decimal digit value. Applies only to decimal digits in the decimal (base-10) system. A decimal digit can be one of ten digits, from 0 through 9.
When using this class in your applications, keep in mind the following programming considerations for using the "char" type. The type can be difficult to use and strings are generally preferable for representing linguistic content.
-
A Char object does not always correspond to a single character. Although the Char type represents a single 16-bit value, some Unicode characters (such as surrogate characters) consist of two or more UTF-16 code points.
-
The notion of a "character" is also flexible. A character is often thought of as a glyph, but many glyphs require multiple code points. For example, ä can be represented either by two code points ("a" plus U+0308, which is the combining diaeresis), or by a single code point ("ä" or U+00A4). Some languages have many letters, characters, and glyphs that require multiple code points, which can cause confusion in linguistic content representation. For example, there is a ΰ (U+03B0, Greek small letter upsilon with dialytika and tonos), but there is no equivalent capital letter. Uppercasing such a value simply retrieves the original value.
The following code example shows the values returned by each method for different types of characters.
using System; using System.Globalization; public class SamplesCharUnicodeInfo { public static void Main() { Console.WriteLine( " c Num Dig Dec UnicodeCategory" ); Console.Write( "U+0061 LATIN SMALL LETTER A " ); PrintProperties( 'a' ); Console.Write( "U+0393 GREEK CAPITAL LETTER GAMMA " ); PrintProperties( '\u0393' ); Console.Write( "U+0039 DIGIT NINE " ); PrintProperties( '9' ); Console.Write( "U+00B2 SUPERSCRIPT TWO " ); PrintProperties( '\u00B2' ); Console.Write( "U+00BC VULGAR FRACTION ONE QUARTER " ); PrintProperties( '\u00BC' ); Console.Write( "U+0BEF TAMIL DIGIT NINE " ); PrintProperties( '\u0BEF' ); Console.Write( "U+0BF0 TAMIL NUMBER TEN " ); PrintProperties( '\u0BF0' ); Console.Write( "U+0F33 TIBETAN DIGIT HALF ZERO " ); PrintProperties( '\u0F33' ); Console.Write( "U+2788 CIRCLED SANS-SERIF DIGIT NINE " ); PrintProperties( '\u2788' ); } public static void PrintProperties( char c ) { Console.Write( " {0,-3}", c ); Console.Write( " {0,-5}", CharUnicodeInfo.GetNumericValue( c ) ); Console.Write( " {0,-5}", CharUnicodeInfo.GetDigitValue( c ) ); Console.Write( " {0,-5}", CharUnicodeInfo.GetDecimalDigitValue( c ) ); Console.WriteLine( "{0}", CharUnicodeInfo.GetUnicodeCategory( c ) ); } } /* This code produces the following output. Some characters might not display at the console. c Num Dig Dec UnicodeCategory U+0061 LATIN SMALL LETTER A a -1 -1 -1 LowercaseLetter U+0393 GREEK CAPITAL LETTER GAMMA \u0393 -1 -1 -1 UppercaseLetter U+0039 DIGIT NINE 9 9 9 9 DecimalDigitNumber U+00B2 SUPERSCRIPT TWO \u00B2 2 2 2 OtherNumber U+00BC VULGAR FRACTION ONE QUARTER \u00BC 0.25 -1 -1 OtherNumber U+0BEF TAMIL DIGIT NINE \u0BEF 9 9 9 DecimalDigitNumber U+0BF0 TAMIL NUMBER TEN \u0BF0 10 -1 -1 OtherNumber U+0F33 TIBETAN DIGIT HALF ZERO \u0F33 -0.5 -1 -1 OtherNumber U+2788 CIRCLED SANS-SERIF DIGIT NINE \u2788 9 9 -1 OtherNumber */
Windows 7, Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2008 R2, Windows Server 2008, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile for Smartphone, Windows Mobile for Pocket PC, Xbox 360, Zune
The .NET Framework and .NET Compact Framework do not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.
It is worth mentioning that the "char" type represents a single 16 bit value. In Unicode some characters consist of 2 UTF-16 code points, so in that case a "char" cannot represent a complete "character". This doesn't happen to English, but many Chinese and other characters exist outside of the BMP (ie: require 2 chars to represent the Unicode code point).
Also note that the notion of a "character" is also flexible. Many people think of them as "glyphs", but many "glyphs" require multiple code points. For example ä can be "a" + U+0308 (combining diaresis) or "ä" (U+00A4). In some languages all "letters/characters/glyphs" cannot be represented correctly by a single Unicode code point and instead require multiple code points.
Additionally some concepts get confused by this behavior. For example, There is a ΰ (U+03B0 greek small letter Upsilon with Dialytika and Tonos), however there's no equivilent capital letter. Trying to do ToUpper() ends up returning the same value, although you could perhaps argue for Ϋ́ (U+03AB + U+0301, greeke capital letter upsilon with dialytika, and then a combining tonos) Some other operating systems/environments choose that as the ToUpper() value for U+03B0, so then a single "char" ends up with a 2 "char" upper case form.
Another example is when combinations of characters cause their form to change. This isn't common in the "latin" characters, but its kind of like æ (U+00E6) looking like a and e crammed together, or, in German ß being the equivilent of ss. In some scripts the form changes a lot depending on the subsequent letters. An oversimplification would be to describe it as kind of like a hyperactive cursive where the letters connect in different ways depending on the following letters.
There are many other examples of cases when the "character" concept breaks down, so use caution. Strings are generally preferrable to better represent linguistic content.
- 1/28/2008
- Shawn Steele [MSFT]