Arno Garrels wrote:
> My sample above as two Unicode code points:
> 
> UStr := #$FF5E#$FF5E;
> 
> Try to convert this string with WideCharToMultiByte() to ansi code
> page 50220, the result is two question marks "??". Both MLang's
> ConvertINetUnicodeToMultybyte() and iconv give the correct result.

If someone wants to give it a trial, here's the MLang header .pas:

{code}

{*_* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

Author:       Arno Garrels <arno.garr...@gmx.de>
Description:  A few header translations from MS mlang.h.
              Windows system API like MultiByteToWideChar or CharNext are
              buggy or do not support some commonly used Ansi charsets.
              Especially when it comes to stream encoding on-the-fly
              the mlang API provides more options than the system API.
              Requires Internet Explorer 5 or better, all functions fail
              with HRESULT E_NOTIMPL if the library isn't loaded.
Creation:     March 19, 2010
Version:      1.00
EMail:        http://www.overbyte.be       francois.pie...@overbyte.be
Support:      Use the mailing list twsocket@elists.org
              Follow "support" link at http://www.overbyte.be for subscription.
Legal issues: Copyright (C) Microsoft Corporation.  All Rights Reserved.
              Translator Arno Garrels <arno.garr...@gmx.de>

History:

 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}

unit OverbyteIcsMLang;

// Requires Internet Explorer 5 or better //

{$WEAKPACKAGEUNIT}

interface

uses
  Windows;

function ConvertInetString(
        lpdwMode: LPDWORD;
        dwSrcEncoding: DWORD;
        dwDstEncoding: DWORD;
        lpSrcStr: LPCSTR;
        lpnSrcSize: PInteger;
        lpDstStr: PBYTE;
        lpnDstSize: PInteger
    ): HRESULT;

function ConvertInetMultibyteToUnicode(
        lpdwMode: LPDWORD;
        dwSrcEncoding: DWORD;
        lpSrcStr: LPCSTR;
        lpnMultiCharCount: PInteger;
        lpDstStr: LPWSTR;
        lpnWideCharCount: PInteger
    ): HRESULT;

function ConvertInetUnicodeToMultibyte(
        lpdwMode: LPDWORD;
        dwEncoding: DWORD;
        lpSrcStr: LPCWSTR;
        lpnWideCharCount: PInteger;
        lpDstStr: LPSTR;
        lpnMultiCharCount: PInteger
    ): HRESULT;

function IsConvertInetStringAvailable(
      dwSrcEncoding: DWORD;
      dwDstEncoding: DWORD
    ): HRESULT;

function Load_MLang: Boolean;    

implementation

type
    TConvertInetString = function(
        lpdwMode: LPDWORD;
        dwSrcEncoding: DWORD;
        dwDstEncoding: DWORD;
        lpSrcStr: LPCSTR;
        lpnSrcSize: PInteger;
        lpDstStr: PBYTE;
        lpnDstSize: PInteger
    ): HRESULT; stdcall;

    TConvertInetMultibyteToUnicode = function(
        lpdwMode: LPDWORD;
        dwSrcEncoding: DWORD;
        lpSrcStr: LPCSTR;
        lpnMultiCharCount: PInteger;
        lpDstStr: LPWSTR;
        lpnWideCharCount: PInteger
    ): HRESULT; stdcall;

    TConvertInetUnicodeToMultibyte = function(
        lpdwMode: LPDWORD;
        dwEncoding: DWORD;
        lpSrcStr: LPCWSTR;
        lpnWideCharCount: PInteger;
        lpDstStr: LPSTR;
        lpnMultiCharCount: PInteger
    ): HRESULT; stdcall;
    
    TIsConvertInetStringAvailable = function(
      dwSrcEncoding: DWORD;
      dwDstEncoding: DWORD
    ): HRESULT; stdcall;

var
    fptrConvertInetString             : TConvertInetString = nil;
    fptrConvertInetMultibyteToUnicode : TConvertInetMultibyteToUnicode = nil;
    fptrConvertInetUnicodeToMultibyte : TConvertInetUnicodeToMultibyte = nil;
    fptrIsConvertInetStringAvailable  : TIsConvertInetStringAvailable = nil;

{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function Load_MLang: Boolean;
var
    h : HMODULE;
begin
    if Assigned(fptrConvertINetString) then
        Result := TRUE
    else begin
        h := LoadLibrary('mlang.dll');
        if h = 0 then
            Result := FALSE
        else begin
            fptrConvertINetString := GetProcAddress(h, 'ConvertINetString');
            fptrConvertINetMultiByteToUnicode := GetProcAddress(h, 
'ConvertINetMultiByteToUnicode');
            fptrConvertINetUnicodeToMultiByte := GetProcAddress(h, 
'ConvertINetUnicodeToMultiByte');
            fptrIsConvertINetStringAvailable := GetProcAddress(h, 
'IsConvertINetStringAvailable');
            Result := TRUE;
        end;
    end;
end;


{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
{ S_OK    Performed the conversion successfully.                        }
{ S_FALSE The specified conversion is not supported on the system.      }
{ E_FAIL  An error has occurred.                                        }
function ConvertInetString(
        lpdwMode: LPDWORD;
        dwSrcEncoding: DWORD;
        dwDstEncoding: DWORD;
        lpSrcStr: LPCSTR;
        lpnSrcSize: PInteger;
        lpDstStr: PBYTE;
        lpnDstSize: PInteger
    ): HRESULT;
begin
    if Assigned(fptrConvertINetString) or Load_MLang then
        Result := fptrConvertINetString(lpdwMode, dwSrcEncoding, dwDstEncoding,
                                    lpSrcStr, lpnSrcSize, lpDstStr, lpnDstSize)
    else
        Result := E_NOTIMPL;
end;


{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
{ S_OK    Performed the conversion successfully.                        }
{ S_FALSE The specified conversion is not supported on the system.      }
{ E_FAIL  An error has occurred.                                        }
function ConvertInetMultibyteToUnicode(
        lpdwMode: LPDWORD;
        dwSrcEncoding: DWORD;
        lpSrcStr: LPCSTR;
        lpnMultiCharCount: PInteger;
        lpDstStr: LPWSTR;
        lpnWideCharCount: PInteger
    ): HRESULT;
begin
    if Assigned(fptrConvertINetString) or Load_MLang then
        Result := fptrConvertInetMultibyteToUnicode(lpdwMode, dwSrcEncoding,
                     lpSrcStr, lpnMultiCharCount, lpDstStr, lpnWideCharCount)
    else
        Result := E_NOTIMPL;
end;


{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
{ S_OK    Performed the conversion successfully.                        }
{ S_FALSE The specified conversion is not supported on the system.      }
{ E_FAIL  An error has occurred.                                        }
function ConvertInetUnicodeToMultibyte(
        lpdwMode: LPDWORD;
        dwEncoding: DWORD;
        lpSrcStr: LPCWSTR;
        lpnWideCharCount: PInteger;
        lpDstStr: LPSTR;
        lpnMultiCharCount: PInteger
    ): HRESULT;
begin
    if Assigned(fptrConvertINetString) or Load_MLang then
        Result := fptrConvertInetUnicodeToMultibyte(lpdwMode, dwEncoding,
                 lpSrcStr, lpnWideCharCount, lpDstStr, lpnMultiCharCount)
    else
        Result := E_NOTIMPL;
end;


{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
{ S_OK          The function can perform the conversion.                }
{ S_FALSE       The conversion is not supported on the system.          }
{ E_INVALIDARG  One or more arguments are invalid.                      }
function IsConvertInetStringAvailable(
      dwSrcEncoding: DWORD;
      dwDstEncoding: DWORD
    ): HRESULT;
begin
    if Assigned(fptrConvertINetString) or Load_MLang then
        Result := fptrIsConvertInetStringAvailable(dwSrcEncoding, dwDstEncoding)
    else
        Result := E_NOTIMPL;
end;


{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
end.

{code}
--
To unsubscribe or change your settings for TWSocket mailing list
please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be

Reply via email to