PHP base64_decode C # эквивалент - PullRequest
2 голосов
/ 18 марта 2009

Я пытаюсь имитировать скрипт php, который делает следующее:

  1. замените все пробелы в GET-переменной каждый знак + ($ var = preg_replace ("/ \ s /", "+", $ _ GET ['var']);)
  2. декодирование в base64: base64_decode ($ var);

1-й я добавил метод, выполняющий декодирование 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);
        }
    }

но кажется, что UTF-8 не выполняет эту работу, поэтому я попробовал тот же метод, но с 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);
        }
    }

И последнее, что нужно сказать: успешное декодирование php содержит специальные знаки, такие как зарегистрированный знак и знак товарного знака, но версия C # этого не делает!

также влияет ли язык php base64_decode на язык сервера?

1 Ответ

9 голосов
/ 18 марта 2009

UTF-7 вряд ли будет тем, что вы хотите. Вам действительно нужно знать, какую кодировку использует PHP. может использовать кодировку по умолчанию для вашей системы. К счастью, декодировать намного проще, чем вы делаете:

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

Нет необходимости явно возиться с Encoder:)

Другая возможность состоит в том, что PHP использует ISO Latin 1, который является кодовой страницей 28591:

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

Руководство PHP бесполезно просто говорит: «До PHP 6 символ был таким же, как байт. То есть, возможно ровно 256 различных символов». Жаль, что это не говорит, что каждый байт на самом деле означает ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...