Unicode Tutorials - Herong's Tutorial Examples - v5.32, by Herong Yang
String.length() Is Not Number of Characters
This section provides tutorial example on showing the difference between length() and codePointCount() methods. The difference between charAt(int index) and codePointAt(int index) is also demonstrated.
Because Unicode characters are stored in "String" objects as a mixed of single "char" elements and surrogate "char" element pairs, the "char" element index and Unicode character location are difficult to calculate.
Here is a tutorial example to show you this problem:
/* UnicodeStringIndex.java * Copyright (c) 2019 HerongYang.com. All Rights Reserved. */ import java.io.*; class UnicodeStringIndex { static int[] unicodeList = {0x43, 0x2103, 0x1F132, 0x1F1A0, 0x37, 0x0667, 0x2166, 0x3286, 0x4E03, 0x1F108}; public static void main(String[] arg) { try { // Constructing a String from a list of code points int num = unicodeList.length; String str = new String(unicodeList, 0, num); // String length and code point count System.out.print("\n # of Unicode characters: "+num); System.out.print("\n codePointCount(): " +str.codePointCount(0,str.length())); System.out.print("\n length(): " +str.length()); // String element at a BMP position System.out.print("\n charAt(1): " +Integer.toHexString(str.charAt(1))); System.out.print("\n codePointAt(1): " +Integer.toHexString(str.codePointAt(1))); // String element at a high surrogate position char high = str.charAt(2); System.out.print("\n charAt(2): " +Integer.toHexString(high)); System.out.print("\n codePointAt(2): " +Integer.toHexString(str.codePointAt(2))); // String element at a low surrogate position char low = str.charAt(3); System.out.print("\n charAt(3): " +Integer.toHexString(low)); System.out.print("\n codePointAt(3): " +Integer.toHexString(str.codePointAt(3))); // validating the surrogate char pair int code = Character.toCodePoint(high, low); System.out.print("\n Character.toCodePoint(): " +Integer.toHexString(Character.toCodePoint(high, low))); } catch (Exception e) { System.out.print("\n"+e.toString()); } } }
Compile and run it with Java 11:
C:\herong>javac UnicodeStringIndex.java C:\herong>java UnicodeStringIndex # of Unicode characters: 10 codePointCount(): 10 length(): 13 charAt(1): 2103 codePointAt(1): 2103 charAt(2): d83c codePointAt(2): 1f132 charAt(3): dd32 codePointAt(3): dd32 Character.toCodePoint(): 1f132
The output confirms that:
Table of Contents
ASCII Character Set and Encoding
GB2312 Character Set and Encoding
GB18030 Character Set and Encoding
JIS X0208 Character Set and Encodings
UTF-8 (Unicode Transformation Format - 8-Bit)
UTF-16, UTF-16BE and UTF-16LE Encodings
UTF-32, UTF-32BE and UTF-32LE Encodings
Python Language and Unicode Characters
►Java Language and Unicode Characters
Unicode Versions Supported in Java History
'int' and 'String' - Basic Data Types for Unicode
"Character" Class with Unicode Utility Methods
Character.toChars() - "char" Sequence of Code Point
Character.getNumericValue() - Numeric Value of Code Point
"String" Class with Unicode Utility Methods
►String.length() Is Not Number of Characters
String.toCharArray() Returns the UTF-16BE Sequence
String Literals and Source Code Encoding
Encoding Conversion Programs for Encoded Text Files
Using Notepad as a Unicode Text Editor
Using Microsoft Word as a Unicode Text Editor