0

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;
    }
4

1 回答 1

0

唯一安全(或理智)的方法是打电话u_cleanup()并重新开始。否则,这根本不是 ICU 的好用法,并且非常不推荐。对不起。

如果您想动态更新数据,请提出功能请求,或者更好地为其提供代码。

于 2013-09-09T23:01:37.480 回答