[英]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.