/* * PosixStringUtils.cpp * * Copyright (C) 2009-12 by RStudio, Inc. * * Unless you have received this program directly from RStudio pursuant * to the terms of a commercial license agreement with RStudio, then * this program is licensed to you under the terms of version 3 of the * GNU Affero General Public License. This program is distributed WITHOUT * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT, * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details. * */ #include #include #include #include #include #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Woverloaded-virtual" #endif #include #include #ifdef __clang__ #pragma clang diagnostic pop #endif namespace rstudio { namespace core { namespace string_utils { std::string wideToUtf8(const std::wstring& value) { try { boost::program_options::detail::utf8_codecvt_facet utf8_facet; return boost::to_8_bit(value, utf8_facet); } catch(const std::exception& e) { // this should NEVER happen! LOG_ERROR_MESSAGE(e.what()); return std::string(); } } std::wstring utf8ToWide(const std::string& value, const std::string& context) { try { boost::program_options::detail::utf8_codecvt_facet utf8_facet; return boost::from_8_bit(value, utf8_facet); } catch(const std::exception&) { // could happen if the inbound data isn't correctly utf8 encoded, // in this case just use the system default encoding static const std::size_t ERR = -1; std::vector wide(value.length() + 1); std::size_t len = ::mbstowcs(&(wide[0]), value.c_str(), wide.size()); if (len != ERR) { return std::wstring(&(wide[0]), len); } else { std::string message = "Invalid multibyte character"; if (!context.empty()) message += " " + context; LOG_ERROR_MESSAGE(message); return std::wstring(); } } } } // namespace string_utils } // namespace core } // namespace rstudio