none
CGI-скрипт RRS feed

  • Вопрос

  • Здравствуйте. Пишу простенький CGI-скрипт. Возникла проблема с отображением русских букв(знаки вопроса "????").

    В комментированном коде пытался перекодировать символы. Я не пойму, в какой кодировки программа получает символы из веб-формы после использования функции UrlDecode.

    using System;
    using System.IO;
    using String;
    using System.Web;
    using System.Text;
    
    
    namespace CGI_C_SHARP
    {
        class Program
        {
           
                [STAThread]
                static void Main(string[] args)
                {
    
                    Console.Write("Content-Type: text/html; charset=utf-8\n\n");
                    string PostedData = "";
                    string name = "";
                    string msg = "";
                    
    
                    if (System.Environment.GetEnvironmentVariable("REQUEST_METHOD")=="POST")
                    {
                        
                        int PostedDataLength = Convert.ToInt32(System.Environment.GetEnvironmentVariable("CONTENT_LENGTH"));
                        if (PostedDataLength > 2048) PostedDataLength = 2048;   // Max length for POST data
                        for (int i = 0; i < PostedDataLength; i++)
                            PostedData += Convert.ToChar(Console.Read()).ToString();
                        PostedData += "&";
                        PostedData= System.Web.HttpUtility.UrlDecode(PostedData);
                        int equl=0;
                    
                        for (int i = 0; i < PostedData.Length; i++)
                        {
                            if (PostedData[i] == '=') equl++;
                        }
                        int[] eq = new int[equl];
                        int eq_c=0;
                        int[] um = new int[equl];
                        int um_c=0;
                        //PostedData = PostedData.Replace('+', ' ');
                           for (int i = 0; i < PostedData.Length; i++)
                        {
                            if (PostedData[i] == '=') { eq[eq_c] = i; eq_c++; }
                            if (PostedData[i] == '&') { um[um_c] = i; um_c++; }
                        }
                            name = PostedData.SubstringNew(eq[0]+1, um[0]);
                            msg = PostedData.SubstringNew(eq[1] + 1, um[1]);
    
                           name = HttpUtility.UrlDecode(name);
                           msg = HttpUtility.UrlDecode(msg);
    
                        /*
                           Encoding ascii = Encoding.ASCII;
                           Encoding unicode = Encoding.UTF8;
                           byte[] asciiBytes = ascii.GetBytes(name);
                           byte[] unicodeBytes = Encoding.Convert(ascii, unicode, asciiBytes);
                           char[] uniChars = new char[unicode.GetCharCount(unicodeBytes, 0, unicodeBytes.Length)];
                           unicode.GetChars(asciiBytes, 0, asciiBytes.Length, uniChars, 0);
                           string uniString = new string(uniChars);
                           dat = uniString;
    
                           StreamWriter sw;
                           FileInfo file = new FileInfo("cgi.txt");
                           sw = file.AppendText();
                           sw.WriteLine("Имя: " + name);
                           sw.WriteLine("Сообщение: " + msg);
                           sw.Close();
                         */ 
                    }
                 
    
                    //Console.Write("<html><head><title></title><meta http-equiv=\"refresh\" content=\"0;URL=index.html\" charset=utf-8></head><body>");
                    Console.Write("<html><head><title></title><meta content=\"charset=utf-8>\"</head><body>");
                    Console.Write("<br>"+ name +"</body></html>");
       
      }
    }
    
            }


    14 октября 2012 г. 10:39

Ответы

  • Добавил такие строчки:

    Console.Write("Content-Type: text/html; charset=cp-1251\n\n");
    
     PostedData= System.Web.HttpUtility.UrlDecode(PostedData,Encoding.GetEncoding(1251));

    и все заработало как надо.

    • Помечено в качестве ответа Kirill_Khalitov 14 октября 2012 г. 14:12
    14 октября 2012 г. 14:12

Все ответы