What is the alternative to the setlocale function of c in D? Thank you.
John Chapman
johnch_atms at hotmail.com
Mon Jan 28 09:40:09 UTC 2019
On Sunday, 27 January 2019 at 16:23:42 UTC, FrankLike wrote:
> On Sunday, 27 January 2019 at 10:44:04 UTC, John Chapman wrote:
>> On Sunday, 27 January 2019 at 06:14:15 UTC, FrankLike wrote:
>>> On Saturday, 26 January 2019 at 09:33:33 UTC, John Chapman
>>> wrote:
>
>>>
>>>> What has that code got to do with setting the console's
>>>> font? So you need to add more code to accomplish that.
>>>
>>> You don't need to set the font to achieve the goal, why not?
>>
>> This should work:
>>
>> const(char)[] toCodePage(const(char)[] s, uint codePage = 0) {
>> import core.sys.windows.winnls, std.utf;
>>
>> foreach (char c; s) {
>> if (c >= 0x80) {
>> auto temp = s.toUTF16z();
>> char[] result;
>> if ((result.length = WideCharToMultiByte(codePage, 0,
>> temp, -1, null, 0, null, null)) != 0)
>> WideCharToMultiByte(codePage, 0, temp, -1, result.ptr,
>> cast(int)result.length, null, null);
>> return result;
>> }
>> }
>> return s;
>> }
>>
>> void main() {
>> import core.sys.windows.wincon, std.stdio;
>>
>> SetConsoleOutputCP(936); // Simplified Chinese codepage
>> writeln("字符".toCodePage(936));
>> }
> Yes.
> ////////////////////////////////////////
> extern(C) int setlocale(int,char*);
>
> static this()
> {
> import core.stdc.wchar_;
> import core.stdc.stdio;
> fwide(core.stdc.stdio.stdout,1);
> setlocale(0,cast(char*)"china");
> }
> ///////////////////////////////////////////
> it's simple than yours,and don't need convert every string,why
> not work after D2.0.78.1?
I've no idea, sorry. A quick scan of D's changelogs between those
versions doesn't reveal anything relevant. But I wonder how your
code ever worked - on Windows, calling setlocale with "china"
returns null, which means it's not a valid locale, so did nothing.
This does the right thing:
extern(C) int _cwprintf(const(wchar)*, ...);
void main() {
SetConsoleOutputCP(936);
_cwprintf("字符\n");
}
More information about the Digitalmars-d-learn
mailing list