ICU のドキュメントには、次のように記載されています。
ICU 4.4 以降では、この関数の呼び出しごとに 1 つずつ、複数のデータ パッケージを設定できます。udata_open() は、設定された順序で複数のデータ パッケージ内のデータを検索します。
ただし、新しい udata_setCommonData を追加するとすぐに、以前のデータを新しいデータで上書きできるように、udata_open() に逆の順序でデータを検索させたいと考えています。データを使用するオブジェクトがインスタンス化されている場合、明らかに古いセットが使用されますが、新しいデータは新しいデータを使用する必要があります。答えは doLoadFromCommonData の近くの udata.cpp のどこかにあると思います。うまくいけば、この変更を行うのはそれほど複雑ではありません。その機能では、私は見る
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 を unsetCommonData にする方法も良いかもしれません。
または、データへのポインターではなく、データへのポインターへのポインターを格納するようにします
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;
}