这个问题可能揭示了我对字符编码的无知,所以如果确实如此,我会非常感谢您纠正这些信息。
我正在将字符串从新应用程序转发到旧应用程序。旧应用程序只接受ASCII字符(http://www.asciitable.com/)。旧应用程序也不支持某些字符,如反斜杠。新的应用程序或多或少支持任何东西。
假设我有字符串:
“随便 - 1_夜_”
我需要将其转换为只有ASCII字符的东西。例如,可能是:
“随便 - 1_ \ u001cY _ = ??? = ??? = ???”
然后我想用替换字符串替换剩余的非法字符。
理想情况下,任何编码为ASCII的字符都应该能够被解码。也就是说,任何唯一的输入字符串都将具有唯一的输出字符串(没有任意输入“abc”和“xyz”,它们产生相同的结果)。算法可以将输出字符串转换回输入字符串。
这是我尝试过的:
static string ConvertToAscii(string str)
{
var return_string = "";
foreach (var c in str)
{
if ((int)c < 128)
{
return_string += c;
}
else
{
var charBytes = BitConverter.GetBytes(c);
var ascii = Encoding.ASCII.GetString(charBytes);
return_string += ascii;
}
}
return return_string;
}
当我使用上面提到的字符串时,我得到:
“随便 - 1_ \ u001cY _ = ??? = ??? = ???”
这似乎很棒 - 但是,“\ u001cY”显然是单个字符,而不是ASCII字符的集合。所以我的目标数据库拒绝它,我无法弄清楚如何删除“\”而留下剩余的字符。
如何将任何字符串转换为ASCII字符集合?
答案 0 :(得分:0)
最简单的方法是Base64所有字节,因为您似乎并不关心字符串的表示方式:
Convert.ToBase64String( Encoding.Unicode.GetBytes("Whatever - 1_夜_"))
将产生保证为ASCII的结果(甚至是可打印的ASCII) - 因为你的字符串结果将是&#34; VwBoAGEAdABlAHYAZQByACAALQAgADEAXwAcWV8APdim3D3Yptw92Kbc&#34;。
答案 1 :(得分:0)
这里的代码类似于我最终用来将所有内容转换为Ascii的代码:
internal static string ConvertToAscii(string str)
{
var returnStringBuilder = new StringBuilder();
foreach (var c in str)
{
if (char.IsControl(c))
{
// Control character
continue;
}
if (c < 127)
{
// ASCII Character
returnStringBuilder.Append(c);
}
else
{
returnStringBuilder.Append("U+" + ((int) c).ToString("X4"));
}
}
return returnStringBuilder.ToString();
}