ICU是软件国际化首选库,由使用 广泛的公司和组织.
ICU 59升级到emoji 5.0数据,以及Unicode 10 beta的分段和bidi更新。为了可靠性和性能,用于数字格式的Java代码已被完全重写。还有一个新的用于样式化文本的案例映射API,以及增强语言匹配的技术预览。
重新组织了源代码存储库,创建了一个包含icu4c和icu4j(以及工具)文件夹的组合主干。(#12800)
ICU4C有重大变化,需要改变使用ICU的项目。详见下文。
请使用 icu支持邮件列表和/或 重症监护室-气管用于错误报告。
ICU固定门票清单59
CLDR 31.0.1级
包括表情符号5.0的更新,例如英格兰、苏格兰和威尔士的本地名称。
GMT和UTC不再统一,CLDR提供不同的UTC显示名称,避免与英国的标准(冬季)时间混淆。
有关CLDR v31中的其他CLDR功能和迁移问题,请参阅CLDR下载页。
对数字格式的更改可能会导致某些边缘情况的行为更改,这可能会影响某些测试的“黄金数据”。
如果可能的话,请“#包括你使用的内容”。有时会从ICU标题中删除不必要的#include。这可能会破坏依赖间接#include的代码编译。请参见https://include-what-you-use.org网站/
以下列出的问题。
随着迁移到C++11,ICU4C也迁移到了char16_t,作为UTF-16代码单元和字符串指针的类型。
这是一个突破性的变化。
我们为什么要破坏你的代码?
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机器。小时.
在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。
在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。
重载和指针包装器类的效果是,调用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。
日本新纪元Reiwa(令和) 支持
IANA tzdata2019a公司
最新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 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