1/* 2 * Copyright (c) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#include "StringHelper.h" 17#include <windows.h> 18#include "securec.h" 19#include "PreviewerEngineLog.h" 20 21std::string StringHelper::StringToUtf8(const std::string& str) 22{ 23 int doubles = 2; 24 int nwLen = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0); 25 if (nwLen < 1) { 26 ELOG("MultiByteToWideChar failed."); 27 return str; 28 } 29 wchar_t* pwBuf = new(std::nothrow) wchar_t[nwLen + 1]; 30 if (!pwBuf) { 31 ELOG("Memory allocation failed : pwBuf."); 32 return str; 33 } 34 ZeroMemory(pwBuf, (nwLen + 1) * doubles); 35 ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), pwBuf, nwLen); 36 int nLen = ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, NULL, NULL, NULL); 37 if (nLen < 1) { 38 delete[] pwBuf; 39 ELOG("WideCharToMultiByte failed."); 40 return str; 41 } 42 char* pBuf = new(std::nothrow) char[nLen + 1]; 43 if (!pBuf) { 44 ELOG("Memory allocation failed : pBuf."); 45 return str; 46 } 47 ZeroMemory(pBuf, nLen + 1); 48 ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL); 49 std::string retStr(pBuf); 50 delete[] pwBuf; 51 delete[] pBuf; 52 pwBuf = NULL; 53 pBuf = NULL; 54 return retStr; 55} 56 57std::string StringHelper::Utf8ToString(const std::string& str) 58{ 59 int doubles = 2; 60 int nwLen = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, NULL, 0); 61 int wLenAdd = nwLen + 1; 62 if (wLenAdd <= 1) { 63 return str; 64 } 65 wchar_t* pwBuf = new(std::nothrow) wchar_t[wLenAdd]; 66 if (!pwBuf) { 67 ELOG("Memory allocation failed : pwBuf."); 68 return str; 69 } 70 int doubleLen = wLenAdd * doubles; 71 if (EOK != memset_s(pwBuf, sizeof(*pwBuf) * doubles, 0, doubleLen)) { 72 delete []pwBuf; 73 ELOG("pwBuf memset_s failed."); 74 return str; 75 } 76 MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.length(), pwBuf, nwLen); 77 int nLen = WideCharToMultiByte(CP_ACP, 0, pwBuf, -1, NULL, NULL, NULL, NULL); 78 int lenAdd = nLen + 1; 79 if (lenAdd <= 1) { 80 delete []pwBuf; 81 return str; 82 } 83 char* pBuf = new(std::nothrow) char[lenAdd]; 84 if (!pBuf) { 85 ELOG("Memory allocation failed : pBuf."); 86 return str; 87 } 88 if (EOK != memset_s(pBuf, lenAdd, 0, lenAdd)) { 89 delete []pBuf; 90 ELOG("pBuf memset_s failed."); 91 return str; 92 } 93 WideCharToMultiByte(CP_ACP, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL); 94 std::string retStr = pBuf; 95 delete []pBuf; 96 delete []pwBuf; 97 pBuf = NULL; 98 pwBuf = NULL; 99 return retStr; 100}