1/* 2 * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25#include <windows.h> 26#include <stdlib.h> 27#include <stdio.h> 28 29 30/* 31 * Convert UTF-8 to a platform string 32 */ 33int 34convertUft8ToPlatformString(char* utf8_str, int utf8_len, char* platform_str, int platform_len) { 35 LANGID langID; 36 LCID localeID; 37 TCHAR strCodePage[7]; // ANSI code page id 38 UINT codePage; 39 int wlen, plen; 40 WCHAR* wstr; 41 42 /* 43 * Get the code page for this locale 44 */ 45 langID = LANGIDFROMLCID(GetUserDefaultLCID()); 46 localeID = MAKELCID(langID, SORT_DEFAULT); 47 if (GetLocaleInfo(localeID, LOCALE_IDEFAULTANSICODEPAGE, 48 strCodePage, sizeof(strCodePage)/sizeof(TCHAR)) > 0 ) { 49 codePage = atoi(strCodePage); 50 } else { 51 codePage = GetACP(); 52 } 53 54 /* 55 * To convert the string to platform encoding we must first convert 56 * to unicode, and then convert to the platform encoding 57 */ 58 plen = -1; 59 wlen = MultiByteToWideChar(CP_UTF8, 0, utf8_str, utf8_len, NULL, 0); 60 if (wlen > 0) { 61 wstr = (WCHAR*)malloc(wlen * sizeof(WCHAR)); 62 if (wstr != NULL) { 63 if (MultiByteToWideChar(CP_UTF8, 64 0, 65 utf8_str, 66 utf8_len, 67 wstr, wlen) > 0) { 68 plen = WideCharToMultiByte(codePage, 69 0, 70 wstr, 71 wlen, 72 platform_str, 73 platform_len, 74 NULL, 75 NULL); 76 if (plen >= 0) { 77 platform_str[plen] = '\0'; 78 } 79 free(wstr); 80 } 81 } 82 } 83 return plen; 84} 85