有后效sdk的麻烦。 基本上我循环遍历所有素材项目项目并尝试从中获取素材路径。这是我在循环中的代码。
AEGP_ItemType itemType = NULL;
ERR(suites.ItemSuite6()->AEGP_GetNextProjItem(projH, itemH, &itemH));
if (itemH == NULL) {
break;
}
ERR(suites.ItemSuite6()->AEGP_GetItemType(itemH, &itemType));
if (itemType == AEGP_ItemType_FOOTAGE) {
numFootage++;
AEGP_FootageH footageH;
ERR(suites.FootageSuite5()->AEGP_GetMainFootageFromItem(itemH, &footageH));
A_char newItemName[AEGP_MAX_ITEM_NAME_SIZE] = {""};
wchar_t footagePath[AEGP_MAX_PATH_SIZE];
ERR(suites.ItemSuite6()->AEGP_GetItemName(itemH, newItemName));
AEGP_MemHandle pathH = NULL;
ERR(suites.FootageSuite5()->AEGP_GetFootagePath(footageH, 0, AEGP_FOOTAGE_MAIN_FILE_INDEX, &pathH));
ERR(suites.MemorySuite1()->AEGP_LockMemHandle(pathH, reinterpret_cast<void**>(&footagePath)));
std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
const std::string utf8_string = converter.to_bytes(footagePath);
std::ofstream tempFile;
tempFile.open ("C:\\temp\\log1.txt");
tempFile << utf8_string;
tempFile.close();
ERR(suites.MemorySuite1()->AEGP_UnlockMemHandle(pathH));
ERR(suites.MemorySuite1()->AEGP_FreeMemHandle(pathH));
}
我正在获取视频路径
然后我将UTF-16(wchar_t)指针转换为UTF-8字符串
然后我将UTF-8字符串写入临时文件,它总是输出以下内容。
펐㛻
我可以请一点指导吗?谢谢!
答案 0 :(得分:0)
你已经将数据作为更聪明的std :: wstring,为什么要将它转换为字节数组然后强制它为简单的std :: string?通常,您应该避免通过字节数组转换字符串。我对C ++ STDLIB的了解还有几年了,但问题可能,因为std :: string类可能仍然没有任何UTF8支持。
你真的需要将它存储为utf8吗?如果它只是用于记录,请尝试使用ofwstream(宽泛的),完全删除转换和'字符串',然后直接将'wstring'写入流中。
此外,完全有可能一切都正确,只是你的文件浏览器狂热。使用hexeditor检查您的日志文件,并检查文件的开头是否包含Unicode格式标记,如0xFFFE等:
答案 1 :(得分:0)
我能够找到答案。 http://forums.adobe.com/message/5112560#5112560
这是错的。 这是因为执行代码处于循环中而我没有使用new运算符分配字符串。
这是需要一个新的线。 wchar_t footagePath [AEGP_MAX_PATH_SIZE];
另一条有用的信息是,并非所有素材项目都有路径。
如果没有路径,它将返回空字符串。 这是我最终得到的代码。
if (itemType == AEGP_ItemType_FOOTAGE) {
A_char* newItemName = new A_char[AEGP_MAX_ITEM_NAME_SIZE];
ERR(suites.ItemSuite6()->AEGP_GetItemName(newItemH, newItemName));
AEGP_MemHandle nameH = NULL;
AEGP_FootageH footageH = NULL;
char* footagePathStr = new char[AEGP_MAX_PATH_SIZE];
ERR(suites.FootageSuite5()->AEGP_GetMainFootageFromItem(newItemH, &footageH));
if (footageH) {
suites.FootageSuite5()->AEGP_ GetFootagePath(footageH, 0, AEGP_FOOTAGE_MAIN_FILE_INDEX, &nameH);
if(nameH) {
tries++;
AEGP_MemSize size = 0;
A_UTF16Char *nameP = NULL;
suites.MemorySuite1()->AEGP_GetMemHandleSize(nameH, &size);
suites.MemorySuite1()->AEGP_LockMemHandle(nameH, (void **)&nameP);
std::wstring test = L"HELLO";
std::string output;
int len = WideCharToMultiByte(CP_OEMCP, 0, (LPCWSTR)nameP, -1, NULL, 0, NULL, NULL);
if (len > 1) {
footagePathStr = new char[len];
int len2 = WideCharToMultiByte(CP_OEMCP, 0, (LPCWSTR)nameP, -1, footagePathStr, len, NULL, NULL);
ERR(suites.MemorySuite1()->AEGP_UnlockMemHandle(nameH));
suites.MemorySuite1()->AEGP_FreeMemHandle(nameH);
}
}
}
}