phobos/tango on win32: please drop ANSI "support"

Lionello Lunesu lio at lunesu.remove.com
Wed Feb 14 22:57:27 PST 2007


Walter Bright wrote:
> Lionello Lunesu wrote:
>> Both Phobos and Tango pretend utf8 is valid for calling ANSI methods 
>> from the Windows' API. Obviously, it's not. The correct way is to 
>> convert the utf8 string to the code-page expected by the call, or 
>> convert them to unicode.
>>
>> I'd like to suggest the latter. Let's drop the ANSI support for Win32 
>> altogether. Unicode is supported since Windows 95 OSR-2 (if I'm not 
>> mistaken) and converting utf8 to ANSI is more expensive than 
>> converting it utf8 to utf16 (which is what Windows 2000 and up convert 
>> to internally anyway). No more "bool UseWFuncs". And converting utf8 
>> to utf16 using MultiByteToWideChar would also take care of the 
>> 0-terminator.
> 
> The "useWfuncs" only happens for Windows 9x (including Me). All Windows 
> 9x systems are 8 bit internally, and even if you use the W interface, 
> they are internally converted to 8 bits anyway.

Yes, they will be converted to "8 bits", but not to utf8. They will be 
converted to whatever code-page the thread's currently using, which is 
what's supposed to be done. That's my point: both Phobos and Tango pass 
utf8 to ANSI (..A) versions of Windows' functions, which is not correct.

You should either convert the utf8 to the correct code-page for passing 
to WhatEverA(..), or convert it to utf16 and pass it to WhatEverW(..). 
The last one is much easier: a fixed, straightforward conversion (no 
need to know about code-pages) that also happens to be efficient for 
Windows 2000 and up.

As for UseWFuncs: I don't like it because the check is done at run-time. 
It's allover the place, practically doubles all Win32 code, not to 
mention the imports / obj-size. More importantly, for the reasons 
mentioned above, I don't think it's necessary.

L.



More information about the Digitalmars-d mailing list