| // Written in the D programming language. | |
| /** | |
| * Support UTF-8 on Windows 95, 98 and ME systems. | |
| * | |
| * Copyright: Copyright The D Language Foundation" 2005 - 2009. | |
| * License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0). | |
| * Authors: $(HTTP digitalmars.com, Walter Bright) | |
| */ | |
| /* Copyright The D Language Foundation" 2005 - 2009. | |
| * Distributed under the Boost Software License, Version 1.0. | |
| * (See accompanying file LICENSE_1_0.txt or copy at | |
| * http://www.boost.org/LICENSE_1_0.txt) | |
| */ | |
| module std.windows.charset; | |
| version (StdDdoc) | |
| { | |
| /****************************************** | |
| * Converts the UTF-8 string s into a null-terminated string in a Windows | |
| * 8-bit character set. | |
| * | |
| * Params: | |
| * s = UTF-8 string to convert. | |
| * codePage = is the number of the target codepage, or | |
| * 0 - ANSI, | |
| * 1 - OEM, | |
| * 2 - Mac | |
| * | |
| * Authors: | |
| * yaneurao, Walter Bright, Stewart Gordon | |
| */ | |
| const(char)* toMBSz(scope const(char)[] s, uint codePage = 0); | |
| /********************************************** | |
| * Converts the null-terminated string s from a Windows 8-bit character set | |
| * into a UTF-8 char array. | |
| * | |
| * Params: | |
| * s = UTF-8 string to convert. | |
| * codePage = is the number of the source codepage, or | |
| * 0 - ANSI, | |
| * 1 - OEM, | |
| * 2 - Mac | |
| * Authors: Stewart Gordon, Walter Bright | |
| */ | |
| string fromMBSz(immutable(char)* s, int codePage = 0); | |
| } | |
| else: | |
| version (Windows): | |
| import core.sys.windows.winbase, core.sys.windows.winnls; | |
| import std.conv; | |
| import std.string; | |
| import std.windows.syserror; | |
| import std.internal.cstring; | |
| const(char)* toMBSz(scope const(char)[] s, uint codePage = 0) | |
| { | |
| // Only need to do this if any chars have the high bit set | |
| foreach (char c; s) | |
| { | |
| if (c >= 0x80) | |
| { | |
| char[] result; | |
| int readLen; | |
| auto wsTmp = s.tempCStringW(); | |
| result.length = WideCharToMultiByte(codePage, 0, wsTmp, -1, null, 0, | |
| null, null); | |
| if (result.length) | |
| { | |
| readLen = WideCharToMultiByte(codePage, 0, wsTmp, -1, result.ptr, | |
| to!int(result.length), null, null); | |
| } | |
| wenforce(readLen && readLen == result.length, "Couldn't convert string"); | |
| return result.ptr; | |
| } | |
| } | |
| return std.string.toStringz(s); | |
| } | |
| string fromMBSz(return scope immutable(char)* s, int codePage = 0) | |
| { | |
| const(char)* c; | |
| for (c = s; *c != 0; c++) | |
| { | |
| if (*c >= 0x80) | |
| { | |
| wchar[] result; | |
| int readLen; | |
| result.length = MultiByteToWideChar(codePage, 0, s, -1, null, 0); | |
| if (result.length) | |
| { | |
| readLen = MultiByteToWideChar(codePage, 0, s, -1, result.ptr, | |
| to!int(result.length)); | |
| } | |
| wenforce(readLen && readLen == result.length, "Couldn't convert string"); | |
| return result[0 .. result.length-1].to!string; // omit trailing null | |
| } | |
| } | |
| return s[0 .. c-s]; // string is ASCII, no conversion necessary | |
| } |