簡體   English   中英

將VB6編碼應用程序轉換為C#

[英]Converting VB6 encoding application into C#

我正在將codepage 1252編碼的文件導入SQL Server 2008數據庫。

一些數據包含的逗號不是傳統的逗號( keycode 44 ),而是8218

包含此值的列通過VB6中的算法加密。 當我在C#中實現相同的算法時,我得到的值130將與8218不匹配。

我想念什么?

編輯以為我會分享解決方案...。感謝上帝為Reflector。 就這么簡單...

130是字符U+201A (十進制8218),“單個低9引號”的windows-1252編碼。 如果正確解碼,則生成的char將具有數值8218,因為.NET在內部使用UTF-16(“ Unicode”)。

聽起來您好像將Windows-1252字節序列解碼為ISO-8859-1,將0x82 (十進制130)映射到數字值為130的控制字符。如果是這種情況,真正的解決方案是返回並首先更改將其解碼錯誤的部分。

與以往一樣,關鍵是要分離出過程的每一部分,並在每個階段檢查字符串。

因此,首先編寫一個程序,該程序僅讀取文件並根據Unicode值轉儲字符串的詳細信息。 我的字符串頁面上有一些代碼可以對此有所幫助。 讀取文件時,請明確指定編碼。

然后編寫一個帶有硬編碼文字的單獨程序(必要時使用\\uxxxx )以上載到數據庫中。 然后,盡可能准確地檢查數據庫中的字符串。 我希望實際的上傳位能夠正常工作,只要數據庫具有適當的設置即可。

我的“調試unicode問題”頁面上有關於此常規過程的更多內容。

經過一番擺弄之后,我想到了這個:

/// <summary>
/// Some charcodes produced by unicode character handling
/// does not map correctly to codepage 1252. This function
/// translates every char to codepage 1252, unless the char
/// takes more than one byte. Then it gets encoded using Unicode.
/// </summary>
/// <param name="chars"></param>
/// <returns></returns>
private string GetStringAfterFixingEncoding(IEnumerable<char> chars)
{
    var result = new StringBuilder();

    foreach (var c in chars)
    {
        var unicodeBytesForChar = Encoding.Unicode.GetBytes(new[] { c });

        if (unicodeBytesForChar.Length > 1 && unicodeBytesForChar[1] != 0)
            result.Append(Encoding.Unicode.GetChars(unicodeBytesForChar)[0]);
        else
            result.Append(_encoding.GetChars(unicodeBytesForChar)[0]);
    }

    return result.ToString();
}

暫無
暫無

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

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