下载ICU 59

ICU是软件国际化首选库,由使用 广泛的公司和组织.

发布概述

ICU 59升级到emoji 5.0数据,以及Unicode 10 beta的分段和bidi更新。为了可靠性和性能,用于数字格式的Java代码已被完全重写。还有一个新的用于样式化文本的案例映射API,以及增强语言匹配的技术预览。

重新组织了源代码存储库,创建了一个包含icu4c和icu4j(以及工具)文件夹的组合主干。(#12800)

ICU4C有重大变化,需要改变使用ICU的项目。详见下文。

请使用 icu支持邮件列表和/或 重症监护室-气管用于错误报告。

ICU固定门票清单59

常见更改

    • 表情包5.0数据(门票#12900&#13058)

      • 包括Unicode 10 beta版的bidi数据文件。

      • 包括Unicode 10 beta和CLDR 31.0.1中的分段数据文件和规则。

      • 尚未包含Emoji_Component属性。

      • 否则ICU 59将继续使用Unicode 9数据。

  • CLDR 31.0.1级

      • 包括表情符号5.0的更新,例如英格兰、苏格兰和威尔士的本地名称。

      • GMT和UTC不再统一,CLDR提供不同的UTC显示名称,避免与英国的标准(冬季)时间混淆。

      • 有关CLDR v31中的其他CLDR功能和迁移问题,请参阅CLDR下载页。

    • 新的案例映射API(C++和Java类CaseMap)支持样式文本(#12410& #12988)

ICU4C特定变化

    • ICU4C现在使用并需要C++11语言功能和库。

    • ICU4C也已移至char16_t作为UTF-16的类型。这是一个突破性的变化。请参阅下面的详细部分。

    • ICU4C源代码文件现在是UTF-8格式,并使用非ASCII字符,如ICU4J。

      • 对于Microsoft Visual Studio/utf-8选项在ICU的.vcxproj文件中设置。

      • 对于大多数其他平台,构建时环境必须设置为UTF-8语言环境。

      • 对于无法处理UTF-8源代码的编译器,转义符会将非ASCII字符替换为\uhhhh和\U00hhhhh-h序列。

      • 如前所述,运行时字符集不必是UTF-8。

      • 在本机字符集不是UTF-8的平台上(包括Windows),在使用源代码之前,请检查编辑器的设置。

ICU4J特定变化

    • 用于数字格式化的Java代码(DecimalFormat等)已被重写,以修复许多错误,提高性能,添加新功能(仍在技术预览中),并使代码更具结构化和可维护性。(#7467)

    • 有增强语言匹配的技术预览(票证#12812).

已知问题

    • ICU4C型

      • ICU未在UCONFIG_NO_NORMALIZATION打开的情况下构建;UCONFIG_NO_FILE_IO打开时生成但测试未通过(#13069个).

      • 平台问题:

        • IBM z:测试失败(#13095个)

        • Solaris:

          • 某些测试文件的Unicode问题(#13096)(测试无法生成)

          • 时区检测错误(13097)

        • 窗户:

        • 使用“@compat=host”时,6个区域设置存在日期和数字格式问题(#13119).

          • UWP版本的ICU将始终回退到“en_US”语言环境(#13217).

          • 函数uprv_convertToPosix有一个指向已破坏作用域中本地堆栈的指针(#13263).

          • 具有非英语UI的Windows 7上的时区检测问题(#13826). 固定在“maint-59”分支中。

      • 使用ICC编译器的Windows:

        • 汇编问题。众所周知,工作区取得了成功。(#13190)

        • 源文件编码。ICC编译器无法识别 /utf-8型选项。(#13251)

        • MinGW:编译和测试问题。已在主干中修复,版本59有补丁(#13164).

    • .zip文件比需要的大。这是因为新的makedata_uwp目标没有使用预构建的数据进行构建。(#13126)

    • .tgz文件不能用于使用Cygwin/MSVC生成(#13139)

迁移问题

数字格式(ICU4J)

对数字格式的更改可能会导致某些边缘情况的行为更改,这可能会影响某些测试的“黄金数据”。

“#包括您使用的内容”(ICU4C)

如果可能的话,请“#包括你使用的内容”。有时会从ICU标题中删除不必要的#include。这可能会破坏依赖间接#include的代码编译。请参见https://include-what-you-use.org网站/

ICU4C字符16_t

以下列出的问题。

ICU4C字符16_t

随着迁移到C++11,ICU4C也迁移到了char16_t,作为UTF-16代码单元和字符串指针的类型。

这是一个突破性的变化。

我们为什么要破坏你的代码?

    • 随着所有ICU平台最终支持C++11,这是首次为UTF-16提供C++标准类型,以及u“syntax for string literals”(类型为const char16_t*)。

    • ICU的使命是成为首要的Unicode和i18n库,我们希望ICU能“发挥好”新的标准C++UTF-16类型和字符串。

UChar类型定义

ICU4C过去一直使用UChar typedef。它是一个无符号16位整数类型。

UChar typedef是编译时可配置的,其默认定义取决于平台。例如,在Linux和macOS X上,它通常被定义为uint16_t,但在Windows上,wchar_t=wchar(便于与Windows API和库一起使用)。

换句话说,可移植代码不能依赖于UChar的固定定义。

ICU4C库和C++测试代码现在总是使用UChar=char16_t。

对于ICU的调用者,UChar现在是所有平台上默认的char16_t的typedef,但它仍然是可编译时配置的。

为了方便过渡,还有一个新的typedef OldUChar,它具有与ICU 58 UChar相同的默认平台相关类型定义。OldUChar不可在编译时配置。(为此,请继续配置和使用UChar。)

有关详细信息,请参阅中有关UChar和OldUChar的文档unicode/u机器。小时.

char16_t(C)

在C中,char16_t和uint16_t是相同的类型。wchart是一种独特的类型,即使它是16位类型(因此是位兼容的)。char16_t*和uint16_t*之间不需要进行类型转换,但这两者都需要与16位wchar_t*进行类型转换。

保留了C API的二进制兼容性,因为char16_t、uint16_t和16位wchar_t是位兼容的,并且精确的类型不会影响导出的链接器符号。(与C++函数名篡改不同。)

ICU C API继续使用UChar进行申报。如有必要,可以使用UChar=wchar_t编译调用ICU C API的代码,例如对于Windows。

char16_t(C)++

在C++中,三种类型char16_t、uint16_t和wchar_t(如果16位宽)是位兼容的,但“不同”。它们的指针不会隐式地相互转换。

ICU C++API从一个版本到另一个版本从来都不是二进制兼容的。我们努力保持C++API源代码的兼容性,但对于这种更改,这在所有情况下都是不可能的。

大多数ICU C++API函数采用并返回UnicodeString值。没有变化。

过去使用[const]UChar*的UnicodeString构造函数现在有char16_t*、uint16_t*和16位wchar_t*的重载。

在一些C++函数(UnicodeString和其他函数)中,UChar指针被新的指针包装类Char16Ptr或ConstChar16Ptr的值所取代,这些指针包装类具有从位兼容的原始指针类型的隐式转换,并且通常是可复制/可移动的。

在某些情况下,无法将UChar指针更改为[Const]Char16Ptr。

    • 未更改虚拟函数,以免中断子类化。

    • 在一些已经重载的函数中,更改包装类的原始指针会导致调用位置不明确,从而破坏编译。

公共ICU C++标头中剩余的所有UChar都将替换为char16_t。

    • 这确保了即使UChar配置为其他类型,C++API也会与库代码链接。

    • 由于UChar配置,ICU库不需要重新编译。

重载和指针包装器类的效果是,调用ICU C++函数的许多C++源代码应该继续编译并在没有更改的情况下工作。

然而,在某些情况下,呼叫站点需要进行调整。

指针转换

如果将UChar配置为与char16_t不同的类型,则需要在ICU C和C++API之间,以及在ICU API和ICU使用代码之间进行char16_t*及其同级类型之间的显式转换,直到后者也迁移到char16_t。

在新的头文件中定义了以下类和函数 unicode/字符16ptr。小时.

使用新unicode/char16ptr.h头文件的后向ICU-58版本为了使ICU呼叫代码适用于ICU 58和ICU 59。

要转换为[const]char16_t*,请使用的临时实例ICU的新指针包装类 ConstChar16Ptr公司字符16Ptr:

UnicodeString;

const UChar*reorderStart=…;//或const uint16_t*等。

const UChar*limit=。。。;

s.setTo(ConstChar16Ptr(重新排序开始),(int32_t)(limit-reorderStart));

转换为[const]UChar*调用到UCharPtr() 指针转换函数:(仅当配置UChar≠char16_t时)

const char16_t*srcChars=。。。;

int32_t srcLength=u_strlen(到UCharPtr(srcChars));

如果您使用与ICU 58 UChar兼容的typedef,请致电至旧U卡Ptr():

UnicodeString;

char16*p=toOldUCharPtr(s.getBuffer());//char16定义为OldUChar=ICU 58 UChar

例如,在Windows上:

UnicodeString文件名;

const UChar*p=filename.getBuffer();//现在默认情况下,UChar=char16_t

HANDLE文件=CreateFile2(p,//指针类型不匹配

GENERIC_READ、FILE_SHARE_READ,OPEN_EXISTING,NULL);

UnicodeString文件名;

const WCHAR*p=toOldUCharPtr(文件名.getBuffer());//显式转换为wchart*

HANDLE文件=CreateFile2(p,

GENERIC_READ、FILE_SHARE_READ,OPEN_EXISTING,NULL);

修复呼叫站点

我们希望越来越多的C++代码能够迁移到C++11及其新的UTF-16类型和文字.

如果可能,请使用类UnicodeString,尤其是其 只读别名构造函数、可写别名构造函数如有必要,将getBuffer()、getTerminatedBuffer)等与toUCharPtr()或toOldUCharPcr()一起使用。

编译失败的原因是无效的现在不明确,请将其更改为空指针:NULL宏依赖于编译器。它可以是nullptr,也可以是简单的0(int常量),或者是与指针具有相同位数的零整数(如clang/gcc NULL=__NULL)。当新重载函数时,其中一些会变得模棱两可。

依赖特定定义的代码UChar≠char16_t供自己使用将UChar配置为该类型。这不会影响现在显式使用char16_t的ICU C++API。但是,在ICU C和C++API之间传递指针需要显式指针转换。

依赖特定定义的代码UChar≠char16_t供自己使用将UChar替换为该类型并根据需要添加显式转换。

例如,铬源更改为“为ICU准备铬和闪烁59“,使该代码适用于ICU 58和ICU 59。

ICU4C平台支持

ICU更新59.2

    • 日本新纪元Reiwa(令和) 支持

    • IANA tzdata2019a公司

ICU4C下载

最新ICU4C 59版本

版本: 59.2

发布日期: 2019-04-11

可在git/GitHub标签页上下载源代码和二进制文件:https://github.com/unicode-org/icu/releases/tag/release-59-2

以前的ICU4C 59版本

版本: 59.1

发布日期:2017-04-14

ICU4J下载

最新的ICU4J 59版本

版本: 59.2

发布日期: 2019-04-11

git/GitHub标签页上提供了源代码和二进制下载:https://github.com/unicode-org/icu/releases/tag/release-59-2

Maven依赖项:

<依赖关系>

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

<artifactId>icu4j</artifactId>

<版本>59.2</版本>

</依赖性>

以前的ICU4J 59版本

版本: 59.1

发布日期:2017-04-14