none
Перекодировать из utf-8 в windows-1251 RRS feed

  • Вопрос

  • Здравствуйте. У меня такой вопрос. Я с помощью webclient получаю страницу в utf-8 и достаю оттуда строку - она будет именем директории которую я создам с помощью Directory.CreateDirectory(). Но когда папка создана, то она нечитаема - бессмысленный набор символов (на консоль выводится то же самое). Я так понимаю, что мне нужно поменять эту строку в windows-1251 чтобы символы отображались нормально? Спасибо.
    8 октября 2015 г. 20:20

Ответы

  • Добрый день,

    укажите явно кодировку в веб-клиенте:

    WebClient wc = new WebClient() { Encoding = Encoding.UTF8 };

    • Предложено в качестве ответа Maxim Shusharin 9 октября 2015 г. 8:02
    • Помечено в качестве ответа freelsd 9 октября 2015 г. 16:39
    9 октября 2015 г. 7:25

Все ответы

  • Опишите на чем написана ваша программа, какие технологии использованы. Проблемы могут быть разными и возникнуть в разных местах.

    Например все строки в .Net языках всегда в одной и то же кодировке (вариант UTF-16) и поменять ее нельзя (и не нужно).

    Проблемы обычно происходит на этапе создания строки (скажем, из потока) или же при ее передаче куда либо (скажем, в поток) с использованием неверной кодировка. Например в вашем случае кодировка веб страницы может быть вовсе не UTF-8.

    В случае C++ ситуация осложняется. Новые программы обычно используют 16 битные строки (WCHAR*, ect.), тогда ситуация та же что и выше.

    Более старые программы (или новые но созданные разработчиками не знакомыми с проблемой которых в России на удивление очень много) могут использовать 8 битные строки. Эти строки в общем случае могут быть в произвольной кодировке которая в добавок ко всему зависит от настроек компьютера. В этом случае шансы на ошибку резко возрастают.

    Рекомендую так же почитать это прежде чем что нибудь делать:

    http://www.joelonsoftware.com/articles/Unicode.html


    This posting is provided "AS IS" with no warranties, and confers no rights.

    8 октября 2015 г. 21:11
    Модератор
  • Программа написана на с#. Сейчас приведу листинг. Кодировка страницы в utf-8.

     static void Main(string[] args)
            {
                string url = "url";
                WebClient wc = new WebClient();
                string data = wc.DownloadString(url);
                //Console.WriteLine(data);
                Match match = Regex.Match(data, @"regexp1: '(.+?)'");
                //Console.WriteLine(match.Groups[1].Value);
                string title = match.Groups[1].Value;
    
                Console.WriteLine(title);
                match = Regex.Match(data, @",regexp2: '(.+?)'");
                //Console.WriteLine(match.Groups[1].Value);
                string root_url = match.Groups[1].Value;
                Directory.CreateDirectory(title);
                Console.ReadKey();
                
            }

    9 октября 2015 г. 6:55
  • Да, вот ситуация как на рисунке где из utf8 нужно в win-1251 сконвертировать. Но у меня почему-то не получилось такого сделать, хотя пробовал различными методами. В том числе использовал уже готовые функции, которые в интернете нашел.
    9 октября 2015 г. 6:57
  • Добрый день,

    укажите явно кодировку в веб-клиенте:

    WebClient wc = new WebClient() { Encoding = Encoding.UTF8 };

    • Предложено в качестве ответа Maxim Shusharin 9 октября 2015 г. 8:02
    • Помечено в качестве ответа freelsd 9 октября 2015 г. 16:39
    9 октября 2015 г. 7:25
  • Да, это помогло, спасибо большое. Странно. Тогда я совсем запутался. В какой кодировке получает данные webclient по-умолчанию? И почему мне не нужно конвертировать строку в windows-1251 для нормального отображения? Ведь именно эта кодировка используется в windows.
    9 октября 2015 г. 7:53
  • Для отладки таких моментов надо устанавливать Fiddler и через него прогонять запрос/ответ.
    9 октября 2015 г. 8:36
  • У меня стоит фиддлер, я смотрел запросы, только это особо не помогло. И все-таки что по поводу моего предыдущего поста?
    9 октября 2015 г. 9:26
  • Да, это помогло, спасибо большое. Странно. Тогда я совсем запутался. В какой кодировке получает данные webclient по-умолчанию? И почему мне не нужно конвертировать строку в windows-1251 для нормального отображения? Ведь именно эта кодировка используется в windows.

    Windows работает вовсе не в 1251. Это всего лишь одна из многих 8 битных кодировок семейства ANSI которые используются для старых наследственных программ с 8 битными строками. Конкретчно 1251 будет включена если Русский установлен как язык по умолчанию для программ без поддержки Unicode.

    Сама ОС и все новые приложения (включая .Net) всегда работают с 16 битными строками в Юникоде (UTF-16). Данные из любых источников как то файлы, сеть и т.п. в процессе считывания перекодируется из той кодировки в которой они фактически представлены в 16 битный Юникод после чего проблема кодировки исчезат, во всяком случае до пересыкли данных обратно.

    В вашем случае кодировка для такого перекодирования была установлена неверно (использовался Encoding.Default), поэтому строки исказились еще на этапе получения их из сети. Это было бы очевидно если бы вы посмотрели на полученый текст в отладчике.

    Так же кодировка Encoding.Default и является текущей ANSI кодировкой, на вашей машине она оказалась 1251. На других компьютерах она конечно будет другой. Скажем где нибудь в Германии скорее всего будет уствановлена 1252. А в Израиле наверное 1255. Таким образом данные будут искажаться каждый раз по разному. 

    Что делать:

    0. Почитать статью выше.

    1. Всегда использовать 16 битные строки UTF-16. В .Net это уже сделано, в C++ надо приложить некоторые усилия.

    2. Правильно перекодировать текст при получении из внешнего источника (файл, сеть) и при передаче во внешний источник. Это делается установкой верной кодировки.

    3. Не использовать кодировку по умолчанию (например Encoding.Default).


    This posting is provided "AS IS" with no warranties, and confers no rights.

    9 октября 2015 г. 16:37
    Модератор
  • Спасибо, действительно я перекодировал данные в строке из windows1251 в UTF8 и получил читаемые символы.
    9 октября 2015 г. 16:40