ICU 的文档指出
从 ICU 4.4 开始,可以设置多个数据包,每次调用此函数一个。udata_open() 将按照设置顺序在多个数据包中查找数据。
但是,我希望 udata_open() 以相反的顺序查找数据,这样只要我添加一个新的 udata_setCommonData,我就可以用我的新数据覆盖任何以前的数据。显然,如果一个使用数据的对象已经被实例化,它将使用旧集合,但任何新数据都应该使用新数据。我猜答案在 udata.cpp 中 doLoadFromCommonData 附近的某个地方,希望进行此更改不会太复杂。在那个函数中,我看到
if (!isICUData) {
return NULL;
} else if (pCommonData != NULL) {
++commonDataIndex; /* try the next data package */
} else if ((!checkedExtendedICUData) && extendICUData(subErrorCode)) {
checkedExtendedICUData = TRUE;
/* try this data package slot again: it changed from NULL to non-NULL */
} else {
return NULL;
我怀疑我想从顶部开始并使用 --commonDataIndex 代替。
更新。我发现只要指针相同,我也可以换出内容并重新运行 udata_setCommonData。也许这是一个很好的解决方案,可以避免修改 ICU 代码。只需要分配我可能遇到的最大可能大小 - 这可能会更棘手。
或者,取消设置CommonData 的方法也可能很好。
或者,将指针存储到指向数据的指针而不是指向数据的指针
for (i = 0; i < LENGTHOF(gCommonICUDataArray); ++i) {
if (gCommonICUDataArray[i] == NULL) {
gCommonICUDataArray[i] = newCommonData;
ucln_common_registerCleanup(UCLN_COMMON_UDATA, udata_cleanup);
didUpdate = TRUE;
break;
} else if (gCommonICUDataArray[i]->pHeader == pData->pHeader) {
/* The same data pointer is already in the array. */
break;
}