「MECSUtilsのUTF32ToUTF16で文字数が変わります」とDEKOの掲示板に書き込んだら、丁寧な回答をいただきました。
ありがとうございました。
質問内容は、次のコードを実行すると文字数が変わります。というもの。
UnicodeString us = "テスト";
UCS4String ucs4 = UnicodeStringToUCS4String(us);
WideString ws = Mecsutils::UTF32ToUTF16(ucs4);
cout << us.Length() << endl; //=>3
cout << ucs4.High << endl; //=>3
cout << ws.Length() << endl; //=>4
もともとの問題は何かというと、次のコードの結果がMECSUtils 1.41ではtrueにならなくなったこと。
UnicodeString s1 = L"テスト";
UnicodeString s2 = Mecsutils::MecsMappingFix_JISX0208ToUnicode(s1);
TEST_ASSERT(s1 == s2);
一致しない原因は、s2の長さがs1よりも長いため。
MECSUtils 1.41ではMecsMappingFix_JISX0208ToUnicode関数が内部でMecsMappingFix_JISX0213ToJISX0208関数を呼んでいる。
MecsMappingFix_JISX0213ToJISX0208関数はUTF32ToUTF16関数を使用している。
UTF32ToUTF16関数はSetLength関数で文字列長さを変更している。
UTF32ToUTF16関数が怪しい。
という考えに至ったわけです。
デブキャンでのお話が楽しみです。