簡體   English   中英

編組字符串時如何覆蓋默認編碼?

[英]How can I override default encoding when marshalling strings?

我有一個 Delphi 2007 DLL 這個出口:

function TestSignString(s, Sign: PChar): LongBool; stdcall;

我使用此導入在 .NET Core v7 C# 中調用它:

[DllImport(@"LibraryName.dll")]
[return:MarshalAs(UnmanagedType.Bool)]
internal static extern bool TestSignString(string s, string sign);

我正在傳遞ssign參數,當運行時系統具有默認編碼(預期)WIN1250 時一切正常).

所以我的問題是,在 C# 中封送字符串時如何覆蓋默認編碼? 我的意思是兩種方式 - 作為輸入參數和 output 也請。

我嘗試將導入更改為:

[DllImport(@"LockBoxLibrary.dll", CharSet = CharSet.Ansi)]

但運氣不好,我缺少代碼頁 (1250) 規范。

我有一個“臟”解決方案,因為它可能正在泄漏 memory。 如果您知道更好的方法,請告訴我。 我有兩種將字符串轉換為 nint 的擴展方法,反之亦然。

private static string FromAnsiPtrToUtf8Str(this nint n)
{
    var length = 0;

    while (Marshal.ReadByte(n + length) != 0)
    {
        length++;
    }

    var strbuf = new byte[length];
    Marshal.Copy(n, strbuf, 0, length);
    
    return Encoding.GetEncoding(1250).GetString(strbuf);
}

private static nint FromUtf8StrToAnsiPtr(this string s) => GCHandle.Alloc(Encoding.GetEncoding(1250).GetBytes(s), GCHandleType.Pinned).AddrOfPinnedObject();

導入更改為: private static extern bool TestSignString(nint s, nint sign);

方法調用: TestSignString(s.FromUtf8StrToAnsiPtr(), sign.FromUtf8StrToAnsiPtr());

嘗試將TestSignString更改為 UTF-16 字符串,或引入寬字符串 (W) 版本,它是 2023:-)

function TestSignStringW(s, Sign: PWideChar): LongBool; stdcall;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM