Пропали русские буквы

Месяц назад написал

        public static int DownloadString(string url, out string responce)
        {
            WebClient client = new WebClient();
            int result = DownloadString(client, url, out responce);
            client.Dispose();
            return result;
        }

        public static int DownloadString(WebClient webClient, string url, out string responce)
        {
            int errorCode;
            try
            {
                responce = webClient.DownloadString(url);
                errorCode = 200;
            }
            catch (WebException e)
            {
                if (e.Status == WebExceptionStatus.ProtocolError)
                {
                    HttpWebResponse httpWebResponse = (HttpWebResponse)e.Response;
                    responce = httpWebResponse.StatusDescription;
                    errorCode = (int)httpWebResponse.StatusCode;
                }
                else
                {
                    errorCode = 400;
                    responce = "Client error";
                }
            }
            return errorCode;
        }

        public static WebClient GetYouTubeWebClient()
        {
            WebClient wc = new WebClient();
            wc.Headers.Add("Accept", YOUTUBE_ACCEPT_STRING);
            wc.Encoding = Encoding.UTF8;
            return wc;
        }

        public static int GetYouTubeVideoWebPage(string videoId, out string resultPage)
        {
            string videoUrl = string.Format(YOUTUBE_VIDEO_URL, videoId);
            int res = DownloadString(videoUrl, out resultPage);
            return res;
        }

        public static int GetYouTubeVideoInfoEx(string videoId, out string resInfo)
        {
            int res = GetYouTubeVideoWebPage(videoId, out string page);
            if (res == 200)
            {
                Clipboard.SetDataObject(page, true, 10, 100);
                int n = page.IndexOf("var ytInitialPlayerResponse");
                if (n > 0)
                {
                    int n2 = page.IndexOf(";</script><div");
                    if (n2 > 0)
                    {
                        resInfo = page.Substring(n + 30, n2 - n - 30);
                        return res;
                    }
                }
            }
            resInfo = "Client error";
            return 400;
        }

Давно не запускал. Сейчас запускаю, а там вместо русских букв получается месиво:

"shortDescription": "Нарезаем салаты, встречаем 2021.\nhttps://patreon.com/bocha\nhttps://16-bits.ru\nКраткое оглавление некоторых вопросов (уточнения принимаются):\n0:00 Приветствие\n0:50 Распаковка серебряной кнопки YouTube\n7:23 Про пандемию\n23:04 Про Apple Silicon M1 ARM\n35:00 Про PS5 и Xbox Series X/S\n36:27 Про IPv6\n37:39 Intel vs AMD\n47:06 Про бас-гитару на чипе Commodore SID\n57:17 Про печать в RDP (RosaOS)\n1:19:19 Про планшеты на Linux\n1:24:57 Про Nintendo Switch\n1:36:15 Итоги по GeForce GTX680\n1:46:21 Про китайские материнские платы под старые Intel Xeon\n3:25:40 Псевдотитаны про Cisco\n3:52:57 Про Hackintosh\n4:47:15 Про чат 16bit\n4:50:15 Про смысл жизни :-)\n5:16:06 Про тяжелую музыку\n5:18:43 Про заработок на YouTube\n5:22:50 Про первый ноутбук\n5:51:24 Про \"Нашу Машу и Волшебный Орех\"\n6:06:58 Про Color Maximite 2\n7:44:32 Про самый эпичный костыль\n8:56:37 Про казино и порно на 16-bits.ru и allunix.ru\n9:04:03 Почему плохо быть сисадмином\n9:50:19 Про Thinkpad на Pentium II",
        "isCrawlable": true,

Раньше работало. А теперь что опять случилось и как это декодировать?

Почему-то у клиента не стояла кодировка. Надо так:

        public static int DownloadString(string url, out string responce)
        {
            WebClient client = GetYouTubeWebClient();
            int result = DownloadString(client, url, out responce);
            client.Dispose();
            return result;
        }

Но раньше же и так работало! :thinking:

Проще так:

using (var client = GetYouTubeWebClient())
{
    return DownloadString(client, url, out responce);
}

response

Опять этот ваш try-finally :slight_smile: Нет уж, спасибо. Мне вылет при любом чихе не нужен :slight_smile: Лучше try-catch.

упс :open_mouth: Это я поторописька.

Так оно не меняет ничего тут про “вылет”, тут нет catch и так. Только Dispose сейчас не вызовется если тут выпадет исключение.

Я только начал писать и пишу по 2 строчки в день. catch там будет.

Вообще обычно catch (особенно всего подряд) делают снаружи таких функций, иначе как узнать, что у неё что-то не получилось.

Но в любом случае catch и using/finally никак не мешают друг другу.

У меня еще пока архитектура не продумана. Не умею заранее продумывать архитектуру.

У меня сейчас возвращается код ошибки. На текущем этапе этого достаточно.

Я про то, что там теоретически могут и другие исключения выпасть, кроме WebException.

ну а если так пока?

            catch (WebException e)
            {
                if (e.Status == WebExceptionStatus.ProtocolError)
                {
                    HttpWebResponse httpWebResponse = (HttpWebResponse)e.Response;
                    response = httpWebResponse.StatusDescription;
                    errorCode = (int)httpWebResponse.StatusCode;
                }
                else
                {
                    errorCode = 400;
                    response = "Client error";
                }
            }
            catch (Exception ex)
            {
                response = ex.Message;
                return 400;
            }