Pregunta

Estoy tratando de imitar un script php que haga lo siguiente:

  1. reemplace un espacio variable GET en cada espacio con un signo + ($ var = preg_replace (" / \ s / ", " + ", $ _ GET ['var']);)
  2. decodificación a base64: base64_decode ($ var);

Primero, agregué un método para realizar una decodificación base64:

        public string base64Decode(string data)
    {
        try
        {
            System.Text.UTF8Encoding encoder = new System.Text.UTF8Encoding();

            System.Text.Decoder utf8Decode = encoder.GetDecoder();

            byte[] todecode_byte = Convert.FromBase64String(data);
            int charCount = utf8Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length);
            char[] decoded_char = new char[charCount];
            utf8Decode.GetChars(todecode_byte, 0, todecode_byte.Length, decoded_char, 0);
            string result = new String(decoded_char);
            return result;
        }
        catch (Exception e)
        {
            throw new Exception("Error in base64Decode" + e.Message);
        }
    }

pero parece que UTF-8 no está haciendo el trabajo, así que probé el mismo método pero con un UTF-7

        public string base64Decode(string data)
    {
        try
        {
            System.Text.UTF7Encoding encoder = new System.Text.UTF7Encoding();

            System.Text.Decoder utf7Decode = encoder.GetDecoder();

            byte[] todecode_byte = Convert.FromBase64String(data);
            int charCount = utf7Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length);
            char[] decoded_char = new char[charCount];
            utf7Decode.GetChars(todecode_byte, 0, todecode_byte.Length, decoded_char, 0);
            string result = new String(decoded_char);
            return result;
        }
        catch (Exception e)
        {
            throw new Exception("Error in base64Decode" + e.Message);
        }
    }

una última cosa que decir, la decodificación php exitosa contiene signos especiales, como el signo registrado y el signo de marca registrada, ¡pero la versión C # no lo tiene!

también, ¿php base64_decode se ve afectado por el idioma del servidor?

¿Fue útil?

Solución

UTF-7 es muy poco probable que sea lo que quiere. Realmente necesita saber qué codificación está usando PHP. puede estar usando la codificación predeterminada para su sistema. Afortunadamente, es mucho más fácil decodificar que lo que está haciendo:

public static string base64Decode(string data)
{
    byte[] binary = Convert.FromBaseString(data);
    return Encoding.Default.GetString(binary);
}

No hay necesidad de jugar explícitamente con Encoder :)

Otra posibilidad es que PHP esté utilizando ISO Latin 1, que es la página de códigos 28591:

public static string base64Decode(string data)
{
    byte[] binary = Convert.FromBaseString(data);
    return Encoding.GetEncoding(28591).GetString(binary);
}

El manual PHP inútilmente dice: "Antes de PHP 6, un carácter es lo mismo que un byte. Es decir, hay exactamente 256 caracteres diferentes posibles ". Es una pena que no diga qué significa cada byte en realidad ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top