1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
// 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
}
|