ICU 69

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

Release Overview

ICU 69 updates to CLDR 39 locale data with many additions and corrections. ICU 69 also includes significant improvements for measurement unit formatting and number formatting in general, as well as many other bug fixes and enhancements.

For more details, including migration issues, see below.

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

Version Number

  1. The initial release has library version number 69.1.

    1. If there are maintenance releases, they will be 69.2, 69.3, etc. (During ICU 69 development, the library version number was 69.0.x.)

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

Common Changes

  • CLDR 39

    • For Norwegian, "no" is back to being the canonical code, with "nb" treated as equivalent. This aligns handling of Norwegian with other macro language codes.

      • No new locales, but many improvements and bug fixes; see the CLDR release page

  • Number and measurement unit formatting:

    • Measurement unit case and gender (technology preview) (ICU-21123)

        • unitDisplayCase() setter on NumberFormatter to set grammatical case

        • FormattedNumber::getGender() to return the grammatical gender of the output unit

        • These APIs currently deal in strings: this will change in a future release

    • Binary prefixes in measurement units (KiB, MiB, etc.) (ICU-21357)

      • Formatting of custom compound units (ICU-20941)

      • New option to remove fraction digits on whole numbers ($1.99, $2, $2.01) (ICU-20886)

      • New sign display option "negative" (not on negative zero) (ICU-21484)

      • New resolution for fraction-significant rounding (ICU-20019)

    • NumberRangeFormatter supports span fields (ICU-20421)

    • Time zone offsets from local time: New APIs BasicTimeZone::getOffsetFromLocal() (C++ & Java) and ucal_getTimeZoneOffsetFromLocal() (ICU-21372 & ICU-21490)

  • Time zone data (tzdata) version 2021a (2021-jan)

ICU4C Specific Changes

ICU4J Specific Changes

Migration Issues

New in ICU 69

    1. CLDR 39 changes the relationship of language codes for the Norwegian language. Formerly, "nb" was the main locale, and "no" was an alias to it. With this change, "no" is now the main locale, and both "nb" and "nn" inherit from "no". This will be visible in locale canonicalization and in APIs that return lists of available locales. Code that assumes that a locale with only a language subtag has no parent other than root may need to change.

    2. For the LocaleMatcher: Simplified Chinese (zh=zh-Hans=zh-CN) vs. traditional Chinese (zh-Hant=zh-TW) are no longer a match. This will be visible in product behavior.

    3. See also other CLDR 39 migration issues.

Other recent migration issues

    1. ICU4C public header files no longer define and use the macros FALSE and TRUE. (ICU-21267)

      1. This avoids collisions between these macro definitions and application code that defines enum constants with these names.

      2. The ICU macros are no longer necessary: C++11 and C99 define false & true values.

      3. ICU API continues to use the ICU-specific type UBool for now; the standard values can be assigned to UBool variables and arguments without warnings.

      4. Please change call sites to use the standard false & true values where necessary. For C (as opposed to C++), these are also macros, defined in <stdbool.h>.

      5. You may transitionally define U_DEFINE_FALSE_AND_TRUE=1 if you need time to migrate code, for example in application code before including any ICU header file, or by patching unicode/umachine.h and changing # define U_DEFINE_FALSE_AND_TRUE 0 to assign value 1 instead.

  1. Constructing a StringPiece from NULL may be ambiguous, depending on the platform. Where this is a problem, please adjust call sites from using NULL to using nullptr. (ICU-20984 PR #1044)

    1. This is similar to issues with the char16_t adoption in ICU 59.

  2. If you rebuild the ICU locale data from (possibly patched) CLDR data, note that there is a new CLDR-to-ICU converter tool in the ICU repo now, replacing the old one in the CLDR repo. (ICU-20693) See icu4c/source/data/cldr-icu-readme.txt

ICU4C Platform Support

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

    • Some platforms (such as IBM AIX, IBM z and Solaris) may no longer be able to build ICU until an improved compiler is available.

  • ICU 69 cannot be built with a C++20 compiler. This version of the standard makes incompatible changes that will require ICU API changes. (ICU-20973)

      • Note that ICU 67 already fixed uses of u8"literals" broken by the C++20 introduction of the incompatible char8_t type (ICU-20972),

      • and added a few API overloads to reduce the need for reinterpret_cast (ICU-20984).

  • 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 (or VS2019) 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).

    • The pre-built binaries now use Visual Studio 2019 [MSVC2019], instead of Visual Studio 2017 [MSVC2017] (ICU-21108).

    • 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 AIX:

      • TBD

  • IBM z

      • TBD

ICU4J Platform Support

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


Source and binary downloads are available on the git/GitHub tag page:

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 (same data as in the CLDR 39 release).

Maven dependency: