我正在将现有的VB 6应用程序移植到.NET (C# 7)。一个VB 6函数,目前正在为is创建问题,
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内部挖掘后,
在我找到的记事本中复制粘贴这些值时,
在C#中,(int)'Ê'
等于202,在VB 6中,Asc("ت")
是202。但问题是,如果我用输入C#调用م سلطانة
函数,就会得到错误的结果。
发布于 2018-10-27 23:15:41
在做了大量的研究之后,我发现了这个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());
}
https://stackoverflow.com/questions/53029081
复制