Many people want to display their string(ANSI),but always to convert string by

'toMBSz',and it can't convert to immutable char[],it's difficult to display their ANSI

string in CMD.EXE.

We can use 'chcp 65001',but for exe'consumer,it's difficult to use.

Now,I find a function,if add it in 'writeln' function,D will very be popular!

string toMBS(string 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;
                        const wchar* ws = std.utf.toUTF16z(s);
                        result.length = WideCharToMultiByte(codePage, 0, ws, 
-1, null,

0,null, null);

                        if (result.length)
                        {
                                readLen = WideCharToMultiByte(codePage, 0, ws, 
-1,

result.ptr,result.length, null, null);
                        }

                        if (!readLen || readLen != result.length)
                        {
                                throw new Exception("Couldn't convert string: " 
~

sysErrorString(GetLastError()));
                        }

                        return cast(string)result[0..$-1];
                }
        }
        return s;
}

Now ,I use it :

string toStr(string s)
{
   return toMBS(s,0);
}
writeln(toStr("中文"));

So difficult!

What do you think?

Reply via email to