将任何字符串转换为ASCII,删除反斜杠

时间:2017-12-22 19:23:27

标签: c# .net string utf-8 ascii

这个问题可能揭示了我对字符编码的无知,所以如果确实如此,我会非常感谢您纠正这些信息。

我正在将字符串从新应用程序转发到旧应用程序。旧应用程序只接受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字符集合?

2 个答案:

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