Проблема кодировки VB6 и .NET (арабские символы) - PullRequest
0 голосов
/ 28 октября 2018

Я портирую существующее приложение 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 input م سلطانةи вывод مسلطن.После копания внутри VB6 я нашел,

enter image description here

Когда я скопировал и вставил эти значения в блокнот, я нашел,

enter image description here

В C # (int)'Ê' равно 202, а в VB 6 Asc("ت") равно 202. Но проблема в том, что если я вызываю функцию C # с входом م سلطانة, я получаю неправильный результат.

1 Ответ

0 голосов
/ 28 октября 2018

После долгих исследований я обнаружил, что Декодирование строки UTF-8 в 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());
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...