1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/sys_string_conversions.h" 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <windows.h> 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/string_piece.h" 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace base { 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Do not assert in this function since it is used by the asssertion code! 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::string SysWideToUTF8(const std::wstring& wide) { 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return SysWideToMultiByte(wide, CP_UTF8); 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Do not assert in this function since it is used by the asssertion code! 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::wstring SysUTF8ToWide(const StringPiece& utf8) { 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return SysMultiByteToWide(utf8, CP_UTF8); 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::string SysWideToNativeMB(const std::wstring& wide) { 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return SysWideToMultiByte(wide, CP_ACP); 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::wstring SysNativeMBToWide(const StringPiece& native_mb) { 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return SysMultiByteToWide(native_mb, CP_ACP); 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Do not assert in this function since it is used by the asssertion code! 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::wstring SysMultiByteToWide(const StringPiece& mb, uint32 code_page) { 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (mb.empty()) 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return std::wstring(); 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int mb_length = static_cast<int>(mb.length()); 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Compute the length of the buffer. 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int charcount = MultiByteToWideChar(code_page, 0, 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mb.data(), mb_length, NULL, 0); 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (charcount == 0) 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return std::wstring(); 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::wstring wide; 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott wide.resize(charcount); 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott MultiByteToWideChar(code_page, 0, mb.data(), mb_length, &wide[0], charcount); 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return wide; 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Do not assert in this function since it is used by the asssertion code! 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::string SysWideToMultiByte(const std::wstring& wide, uint32 code_page) { 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int wide_length = static_cast<int>(wide.length()); 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (wide_length == 0) 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return std::string(); 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Compute the length of the buffer we'll need. 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int charcount = WideCharToMultiByte(code_page, 0, wide.data(), wide_length, 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott NULL, 0, NULL, NULL); 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (charcount == 0) 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return std::string(); 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string mb; 63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mb.resize(charcount); 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott WideCharToMultiByte(code_page, 0, wide.data(), wide_length, 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott &mb[0], charcount, NULL, NULL); 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return mb; 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace base 71