VB6与.NET编码问题(阿拉伯字符)

时间:2018-10-28 06:54:10

标签: c# vb6

我正在将现有的VB 6应用程序移植到.NET(C#7)。当前正在为其创建问题的VB 6功能很简单,

Private Function VB6Function(Name As String) As String
Dim I As Integer
Dim str_len As Integer
Dim search_str As String
Dim Search As String
Dim search_asc As Integer

For I = 1 To Len(Name)
    search_str = Mid$(Name, I, 1)
    search_asc = Asc(search_str)
      Select Case search_asc
        Case 200, 202, 203 To 214, 216, 217, 218, 219, 221 To 223, 225, 227, 228, 230
           Search = Search & search_str
      End Select
Next

GetSearchName = Search
End Function

当我转换为快速 C#版本时,

    public static string CSharpMethod(string str)
    {            
        if (string.IsNullOrWhiteSpace(str))
        {
            return str;
        }
        var validAsciiCharecters = new List<int> { 200, 202, 216, 217, 218, 219, 221, 222, 223, 225, 227, 228, 230 };
        for (int i = 203; i <= 214; i++)
        {
            validAsciiCharecters.Add(i);
        }
        var newStr = "";
        foreach (var ch in str)
        {
            if (validAsciiCharecters.Contains((int)ch))
            {
                newStr += ch.ToString();
            }
        }
        return newStr;
    }

VB6输入م سلطانة和输出مسلطن。深入研究VB6之后,我发现了,

enter image description here

当我将这些值复制粘贴到记事本中时,发现

enter image description here

在C#(int)'Ê'中等于202,在VB 6中Asc("ت")是202。但是问题是,如果我用输入م سلطانة调用C#函数,则会得到错误的结果。

1 个答案:

答案 0 :(得分:2)

经过大量研究,我发现了这个Decoding an UTF-8 string to Windows-1256,可以通过稍作调整来解决我的问题,

    public static string CSharpMethod(string str)
    {            
        if (string.IsNullOrWhiteSpace(str))
        {
            return str;
        }
        var validAsciiCharecters = new List<int> { 200, 202, 216, 217, 218, 219, 221, 222, 223, 225, 227, 228, 230 };
        for (int i = 203; i <= 214; i++)
        {
            validAsciiCharecters.Add(i);
        }
        var win1256Bytes = Encoding.GetEncoding(1256).GetBytes(str);
        var newBytes = new List<byte>();
        foreach (var b in win1256Bytes)
        {
            if (validAsciiCharecters.Contains((int)b))
            {
                newBytes.Add(b);
            }
        }
        return Encoding.GetEncoding(1256).GetString(newBytes.ToArray());
    }