代码之家  ›  专栏  ›  技术社区  ›  Imran Qadir Baksh - Baloch

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

  •  2
  • Imran Qadir Baksh - Baloch  · 技术社区  · 7 年前

    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
    

    当我变成 快的

        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输入 م سلطانة 和输出 مسلطن

    enter image description here

    当我把这些值复制粘贴到记事本上时,

    enter image description here

    在C中# (int)'Ê' 等于202,在VB 6中 Asc("ت") 问题是如果我用输入调用C函数

    1 回复  |  直到 7 年前
        1
  •  2
  •   Imran Qadir Baksh - Baloch    7 年前

    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());
        }