ICU 65

ICU is the premier library for software internationalization, used by a wide array of companies and organizations.

Release Overview

ICU 65 updates to CLDR 36 locale data with many additions and corrections, and some new measurement units. The Java LocaleMatcher API is improved, and ported to C++. For building ICU data, there are new filtering options, and new tracing support for data loading in ICU4C.

For more details, including migration issues, see below.

Please use the icu-support mailing list and/or find/submit error reports.

List of tickets fixed in ICU 65 (=65.1)

Version Number

The initial release has library version number 65.1.

If there are maintenance releases, they will be 65.2, 65.3, etc. (During ICU 65 development, the library version number was 65.0.x.)

Note: There may be additional commits on the maint-65 branch that are not included in the prepackaged download files.

Common Changes

  • CLDR 36

      • Significant coverage increases for several languages including ceb (Cebuano), ha (Hausa / Latin script), ig (Igbo), kok (Konkani), qu (Quechua), to (Tongan), yo (Yoruba)

      • Measurement units: Support for more units, with translations; new pattern for compound units such as “newton-meter”

      • Data for LocaleMatcher now includes fallbacks for related (“encompassed”) languages. (e.g., Cantonese→Chinese [Mandarin])

  • LocaleMatcher

    • Improved Java API: Builder class with additional options, Result class with additional data about a match, supports Java Locale directly. (ICU-20467)

    • Ported to C++. (ICU-9695)

    • New options in filters.json: additive strategy, disable pool bundles

    • Data tracing: ICU4C code instrumented to record what data it is using

    • Available Locales: added new API to include legacy and alias locales (ICU-20627)

ICU4C Specific Changes

  • C++ functions like clone() and freeze() now return covariant pointer types. For example, UnicodeSet::freeze() returns a pointer to UnicodeSet instead of to the base class UnicodeFunctor. (ICU-20783)

      • In rare cases, this may break subclasses. See the Migration Issues.

    • All of the public C++ headers now assume a default context of extern "C++". (ICU-20530)

    • All of the public C++ headers are guarded with the macro "U_SHOW_CPLUSPLUS_API". (ICU-20578)

    • Windows: The ICU4C UWP projects support building a data DLL. (Previously they only supported using a data .dat file.) (ICU-20712)

    • Windows: The ICU4C UWP projects have experimental support building for ARM64. (ICU-20712)

  • Windows: ICU4C has experimental build support for Desktop ARM and Desktop ARM64 (non-UWP). (ICU-20782)

    • Please note that there will likely be some issues/bugs/etc. since support is still very new for these platforms.

  • Various Out-Of-Memory (OOM) handling issues have been fixed. (ticket query)

ICU4J Specific Changes

    • None

Known Issues

Common Issues

    • None yet.

ICU4C

    • ICU4C requires C++11 support. Some platforms (such as IBM AIX, IBM z and Solaris) may no longer be able to build ICU until an improved compiler is available. See the "ICU4C Platform Support" section below.

  • ICU4C has build errors on Cygwin 3.0.0, please use the previous version of Cygwin 2.11.2 as a work-around (ICU-20435).

  • ICU4C has known issues compiling with GCC on AIX. These are still being investigated (ICU-3752)

  • ICU4C on Windows can potentially fail to build the data from source if built from a long folder path (ICU-20858).

  • ICU4C on Windows: Building for ARM64 can fail if the x64 build wasn't fully completed first (ICU-20859).

ICU4J

  • None yet.

Migration Issues

  1. Function-like ICU4C API macros (e.g., U16_NEXT_OR_FFFD()) were always intended to be used with a trailing semicolon, but some macros were usable without semicolon, and when used with one caused -Wextra-semi-stmt warnings. This has been fixed. Please adjust call sites, adding missing semicolons. If you have a lot of such call sites, then you can temporarily change the definition of UPRV_BLOCK_MACRO_BEGIN and UPRV_BLOCK_MACRO_END in unicode/umachine.h. (ICU-20601, icu/pull/759)

    1. Some C++ functions now return covariant (same-as-this) pointer types. (ICU-20783)

    2. Under the following conditions, this may break the definition of custom subclasses:

      1. You have a subclass of an ICU class that itself is a subclass of a class that defines virtual clone().

      2. For example: MyBreakIterator → RuleBasedBreakIterator → BreakIterator

        1. Note that RuleBasedBreakIterator::clone() now returns a pointer to RuleBasedBreakIterator not to BreakIterator.

      3. Your subclass (MyBreakIterator) defines clone() as returning a pointer to the base class (BreakIterator).

      4. This will no longer compile because the subclass clone returns a type that is not covariant (i.e., a type that is wider) than the type returned by clone in the immediate parent class (RuleBasedBreakIterator).

      5. To fix this, please change your subclass to return a pointer to the immediate parent (RuleBasedBreakIterator) or to itself (MyBreakIterator).

  2. All of the public C++ headers now assume a default context of extern "C++". (ICU-20530)

      1. ICU4C has both C and C++ headers, for callers using either a C or C++ compiler, or for callers using a C++ compiler who wish to have binary compatibility. The C++ headers were previously inconsistent in terms of the linkage context they assumed the caller to be using them with. In some cases the C++ headers would work in an extern "C" context and in other cases they would not. As of ICU 65, all of the public C++ headers now assume a default context of extern "C++".

    1. This means that callers including C++ headers inside an extern "C" block will need to modify their code to move the included header outside of the extern "C" block.

    2. All of the public C++ headers are guarded with the macro "U_SHOW_CPLUSPLUS_API". (ICU-20578)

    3. This macro is set to 1 by default if "__cplusplus" is defined, but it can be defined by users of ICU to be 0 before including any headers if they wish to only use the C APIs (with a C++ compiler).

    4. ICU4C on Windows no longer uses a fixed base address for the library DLLs. (ICU-20768)

ICU4C Platform Support

  • All: Compiler support for C++11 is required for building the ICU libraries.

    • GCC: version 4.8 and later has been tested.

    • IBM AIX:

      • xlC C/C++ does not currently support a sufficient subset of C++11 (#13393)

      • gcc might work

  • macOS: XCode 8.3 (LLVM clang 8.1.0) has been tested.

  • Solaris

  • Windows:

    • The minimum supported version is Windows 7. Windows XP and Windows Vista are no longer supported.

    • Building the Visual Studio UWP projects requires Visual Studio 2017 with a version of the Windows 10 SDK installed.

      • When using "@compat=host", on versions below Windows 10 version 1703, 6 locales have date and number formatting issues (#13119).

    • The LCID conversion APIs don't round-trip Kurdish (ku) and Central Kurdish (ckb) due to Windows not having a ckb locale (#20181).

    • Windows using the ICC compiler:

      • Source File Encoding. The ICC compiler does not recognize the /utf-8 option. A work-around is known and reported to succeed. (#13251)

  • IBM z

      • xlC C/C++ does not currently support a sufficient subset of C++11 (#13393)

ICU4J Platform Support

ICU4J works on Java 7 and on Android API level 21.

ICU4C Download

Library version number: 65.1

Release date: 2019-10-03

Source and binary downloads are available on the git/GitHub tag page: https://github.com/unicode-org/icu/releases/tag/release-65-1

See the Source Code Access page for how to download the ICU file tree directly from GitHub.

ICU locale data was generated from CLDR tag release-36-beta

ICU4J Download

Library version number: 65.1

Release date: 2019-10-03

Source and binary downloads are available on the git/GitHub tag page: https://github.com/unicode-org/icu/releases/tag/release-65-1

See the Source Code Access page for how to download the ICU file tree directly from GitHub.

Maven dependency: [available only after final release]

<dependency>

<groupId>com.ibm.icu</groupId>

<artifactId>icu4j</artifactId>

<version>65.1</version>

</dependency>