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
The initial release has library version number 69.1.
Release date: 2021-04-07
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.)
Note: There may be additional commits on the maint-69 branch that are not included in the prepackaged download files.
Common Changes
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)
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
New NumberFormatter rounding modes: half-odd, half-ceiling, half-floor (ICU-21493)
By default, the Layout Extensions library is no longer built even if HarfBuzz is available. (ICU-13837)
ICU4J Specific Changes
Migration Issues
New in ICU 69
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.
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.
See also other CLDR 39 migration issues.
Other recent migration issues
ICU4C public header files no longer define and use the macros FALSE and TRUE. (ICU-21267)
This avoids collisions between these macro definitions and application code that defines enum constants with these names.
The ICU macros are no longer necessary: C 11 and C99 define false & true values.
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.
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>.
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.
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)
This is similar to issues with the char16_t adoption in ICU 59.
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)
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:
IBM AIX:
TBD
IBM z
TBD
ICU4J Platform Support
ICU4J works on Java 7 and on Android API level 21.
Download
Source and binary downloads are available on the git/GitHub tag page: https://github.com/unicode-org/icu/releases/tag/release-69-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 https://github.com/unicode-org/cldr/releases/tag/release-39-beta2 (same data as in the CLDR 39 release).
Maven dependency:
<dependency>
<groupId>com.ibm.icu</groupId>
<artifactId>icu4j</artifactId>
<version>69.1</version>
</dependency>