Windows 1251 is not a supported encoding name

I am writing WinPhone 8.1 app. Code is very simple and works in most cases: string htmlContent; using (var client = new HttpClient()) { htmlContent = await client.GetStringAsync(GenerateUri()...

I am writing WinPhone 8.1 app.
Code is very simple and works in most cases:

string htmlContent;
using (var client = new HttpClient())
{
    htmlContent = await client.GetStringAsync(GenerateUri());
}
_htmlDocument.LoadHtml(htmlContent);

But sometimes exception is thrown at

htmlContent = await client.GetStringAsync(GenerateUri());

InnerException {System.ArgumentException: ‘windows-1251’ is not a
supported encoding name. Parameter name: name at
System.Globalization.EncodingTable.internalGetCodePageFromName(String
name) at
System.Globalization.EncodingTable.GetCodePageFromName(String name)
at
System.Net.Http.HttpContent.<>c__DisplayClass1.b__0(Task
task)} System.Exception {System.ArgumentException}

Does HttpClient support 1251 encoding? And if it doesn’t, how can I avoid this problem? Or is it target page problem? Or am I wrong in something?

tukaef's user avatar

tukaef

8,9344 gold badges29 silver badges45 bronze badges

asked Jul 26, 2015 at 14:22

Kirill Lappo's user avatar

0

Get response as IBuffer and then convert using .NET encoding classes:

HttpClient client = new HttpClient();
HttpResponseMessage response = await client.GetAsync(uri);
IBuffer buffer = await response.Content.ReadAsBufferAsync();
byte[] bytes = buffer.ToArray();

Encoding encoding = Encoding.GetEncoding("windows-1251");
string responseString = encoding.GetString(bytes, 0, bytes.Length);

answered Jul 26, 2015 at 17:54

kiewic's user avatar

kiewickiewic

15.5k13 gold badges75 silver badges98 bronze badges

2

@zrhyvr

In universal windows app, calling Encoding.GetEncoding(«windows-1251») will throw an exception

An exception of type ‘System.ArgumentException’ occurred in mscorlib.ni.dll but was not handled in user code

Additional information: ‘windows-1251’ is not a supported encoding name. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method.

same for euc-kr charset.

@ellismg

You will likely need to reference the System.Text.Encoding.CodePages package and then use Encoding.RegisterProvider.

This Stack Overflow answer addresses a similar problem. I expect the answer will work for you as well.

The reason this is done was to remove the need to carry encoding data with ever UWP app, even if the apps did not use them.

@zrhyvr

@msftgits
msftgits

transferred this issue from dotnet/corefx

Jan 31, 2020

@msftbot
msftbot
bot

locked as resolved and limited conversation to collaborators

Jan 1, 2021

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace Cito 
{
    class Program
    {
        static void Main(string[] args)
        {
 
           string a = File.ReadAllText("1.txt", Encoding.GetEncoding(1251));
           string b = File.ReadAllText("2.txt", Encoding.GetEncoding(1251));
 
            int nom;
        int smehenie;
        string rezyltat;
        int per,per2 ;
        int nym = 0;
        char[] massage = a.ToCharArray();
        char[] key = b.ToCharArray();
 
            char[] alfavit = { 'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я' };
 
            // Перебираем каждый символ сообщения
            for (int i = 0; i < massage.Length; i++)
            {
                // Ищем индекс буквы
                for (per = 0; per < alfavit.Length; per++)
                {
                    if (massage[i] == alfavit[per])
                    {
                        break;
                    }
                }
 
                if (per != 33) // Если j равно 33, значит символ не из алфавита
                {
                    nom = per; // Индекс буквы
 
                    // Ключ закончился - начинаем сначала.
                    if (nym > key.Length - 1) { nym = 0; }
 
                    // Ищем индекс буквы ключа
                    for (per2 = 0; per2 < alfavit.Length; per2++)
                    {
                        if (key[nym] == alfavit[per2])
                        {
                            break;
                        }
                    }
 
                    nym++;
 
                    if (per2 != 33) // Если f равно 33, значит символ не из алфавита
                    {
                        smehenie = nom + per2;
                    }
                    else
                    {
                        smehenie = nom;
                    }
 
                    // Проверяем, чтобы не вышли за пределы алфавита
                    if (smehenie > 32)
                    {
                        smehenie = smehenie - 33;
                    }
 
                    massage[i] = alfavit[smehenie]; // Меняем букву
                }
            }
 
            rezyltat = new string(massage); // Собираем символы обратно в строку.
            File.WriteAllText("3.txt", rezyltat); // Записываем результат в файл.
 
        }
 
    }
}

RRS feed

  • Remove From My Forums
  • Question

  • Just wondering if this will be added in the release, given that Russian is now a supported language…

All replies

  • i had issues trying various encoding types. I used the encoding generator to get ascii equivalent custom encoding classes for central european languages. Didn’t try russian as i already had issues with Nordic languages. Try it below.

    A Custom Text Encoding Generator For Silverlight

    I eventually started using utf-8 and it works fine with support for russian / ukrainian / chinese and all european languages.

  • Just tried with the RC, the same exception — «‘windows-1251’ is not a supported encoding name.» Of course, I have my own encoder but I also think that if a locale is supported by the system, the encoding should also be supported.

    P.S. From the Philip’s blog post linked above, I understand that this is actually a Silverlight limitation. But considering that
    this Silverlight is bound to the platform, Microsoft could just wire up system-supported encodings…

  • Hi, I’m facing this problem with my xml reader application. Xml that has encoding=»Windows-1251″ cannot be handled with XmlReader because it throws exception with message «System does not support ‘Windows-1251’ encoding.» Is it still so that this encoding
    is not supported by 7.1? How should this case be handled? Can I override the XmlReader Decoder with my own hardcoded implementation or what?

Raymond
Raymond

Raymond

articleArticles 549

imageDiagrams 49

codeCode 3

chat_bubble_outlineThreads 8

commentComments 265

loyaltyKontext Points 6055

account_circle Profile


visibility 5,447

event 2018-07-02
access_time 3 years ago
language English

more_vert

After upgrading to ASP.NET Core 2.1 (.NET Core SDK 2.1.301), you may encounter the following error about encoding:

System.ArgumentException
   HResult=0x80070057
   Message='Cyrillic' is not a supported encoding name. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method.
   Source=System.Private.CoreLib
   StackTrace:
    at System.Text.EncodingTable.internalGetCodePageFromName(String name)
    at System.Text.EncodingTable.GetCodePageFromName(String name)
    at System.Text.Encoding.GetEncoding(String name)

The error message itself already provides the solution.

To resolve the issue, add package reference System.Text.Encoding.CodePages.

And then register code page encoding provider via Encoding.RegisterProvider method.

public void ConfigureServices(IServiceCollection services)
 {
// …
// Register code Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
}

Выдает ошибку:

System.Xml.XmlException: «System does not support ‘windows-1251’ encoding.

Как раскодировать?

string URLXml = "http://сайт.ru/file.xml";

XmlReaderSettings settings = new XmlReaderSettings();
XmlReader reader = XmlReader.Create(URLXml);

while (reader.Read())
{}

Ответы (3 шт):

Encoding encoding = Encoding.GetEncoding("windows-1251");

→ Ссылка

Автор решения: Yitzhak Khabinsky

Вы можете попробовать LINQ to XML API.

c#

void Main()
{
    const string Url = @"http://сайт.ru/file.xml";

    XDocument doc = XDocument.Load(Url);
}

→ Ссылка

Автор решения: Alexander Petrov

В отличие от обычного .NET Framework, в котором изначально поддерживается большое количество кодировок, в .NET Core по умолчанию доступны лишь несколько базовых.

Вся информация описана в документации: CodePagesEncodingProvider.

  • Добавьте в проект ссылку на сборку System.Text.Encoding.CodePages.dll.

  • Получите объект CodePagesEncodingProvider из статического свойства CodePagesEncodingProvider.Instance.

  • Передайте объект CodePagesEncodingProvider методу Encoding.RegisterProvider.

Фактически, в код нужно добавить одну строку:

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

→ Ссылка

Формулировка задачи:

using System.IO;
using System.Net;
using System.Text;
 
namespace Testparser
{
    class HtmlDownloadHelper
    {
        /// <summary>
        /// Скачать страницу
        /// </summary>
        /// <param name="uri">страница сайта</param>
        /// <returns>исходный код</returns>
        public static string DownloadHtml(string uri)
        {
            var req = (HttpWebRequest)WebRequest.Create(uri);
            var resp = (HttpWebResponse)req.GetResponse();
           
            //if (resp.CharacterSet == "cp1251")
            //    resp.CharacterSet = "windows-1251";
 
            using (var stream = new StreamReader(stream: resp.GetResponseStream(), encoding: Encoding.GetEncoding(resp.CharacterSet)))
            {
                var html = stream.ReadToEnd();
                return html;
            }
        }
    }
}

Есть сайт «http://www.iitrust.ru/region/uc/tarif.php»

с него приходит resp.CharacterSet = «cp1251»
и вылетает исключение как это грамотно обойти у этого свойства только геттер
или как допилить что бы всю возможную запись в чартерсет он воспринимал
это же я думаю ни один такой случай

Код к задаче: «Additional information: ‘cp1251’ is not a supported encoding name»

textual

using (var resp = req.GetResponse())
{
            var encoding = resp.CharacterSet == "cp1251" ? Encoding.GetEncoding(1251) : Encoding.UTF8;
            using (var stream = new StreamReader(resp.GetResponseStream(), encoding))
            {
                return stream.ReadToEnd();
            }
}

Полезно ли:

6   голосов , оценка 3.833 из 5

Всем здрасьте.
это программка WinForms. на форме одна кнопка и два label
то есть всё очень скромно.

подскажите, почему вижел студия не может перекодировать строку в windows-1251
где там надо зарегистрировать Encoding.RegisterProvider method

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
...
...
        string string_Data = "123456 трпр и т.д.";
        //  byte[] data = UTF8Encoding.UTF8.GetBytes( string_Data );  //  РАБОТАЕТ
        //  byte[] data = Encoding.ASCII.GetBytes( string_Data );     //  РАБОТАЕТ

        //  Encoding win1251 = Encoding.GetEncoding(1251);           // ОШИБКА
            Encoding win1251 = Encoding.GetEncoding("windows-1251"); // так тоже ОШИБКА
            byte[] data = win1251.GetBytes( string_Data );

            foreach (byte ch in data)
            {
...
...

VS 2019 пишет:
System.NotSupportedException: «No data is available for encoding 1251.
For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method.»

в реестре есть строка codepage 1251 и других nls полно.
большое спасибо.

Здравствуйте, klen_, Вы писали:

_>System.NotSupportedException: «No data is available for encoding 1251.

Это не студия пишет, а компилятор. а установить надо пакет с кодировками, я так полагаю у вас проект коровый.

To do this, you need to register the CodePagesEncodingProvider instance from the System.Text.Encoding.CodePages package.

To do that, install the System.Text.Encoding.CodePages package:

dotnet add package System.Text.Encoding.CodePages

Then (after implicitly or explicitly running dotnet restore) you can call:

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
var enc1252 = Encoding.GetEncoding(1252);

Alternatively, if you only need that one code page, you can get it directly, without registration:

var enc1252 = CodePagesEncodingProvider.Instance.GetEncoding(1252);

Здравствуйте, klen_, Вы писали:

_>Всем здрасьте.


_>это программка WinForms. на форме одна кнопка и два label
_>то есть всё очень скромно.

_>подскажите, почему вижел студия не может перекодировать строку в windows-1251

_>где там надо зарегистрировать Encoding.RegisterProvider method

_>в реестре есть строка codepage 1251 и других nls полно.

_>большое спасибо.

В NET Core нет кодировок из реестра. В том числе и 1251.

NET Core или Framework?

varenikAA

            var win1251 = CodePagesEncodingProvider.Instance.GetEncoding(1251);
            byte[] data = win1251.GetBytes( string_Data );

Спасибо, это работает!

в свойствах проекта:
«Целевая рабочая среда» .NET 5.0
«Тип выходных данных» приложение Windows

Всех благодарю за совет и участие.

Понравилась статья? Поделить с друзьями:
  • Windows 12 lite скачать торрент на русском
  • Windows 12 download iso 32 bit 64 bit versions
  • Windows 12 concept by ar 4789 торрент
  • Windows 11se скачать с официального сайта
  • Windows 11 языковая панель закреплена в панели задач неактивно