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
8,9344 gold badges29 silver badges45 bronze badges
asked Jul 26, 2015 at 14:22
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
kiewickiewic
15.5k13 gold badges75 silver badges98 bronze badges
2
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.
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.
msftgits
transferred this issue from dotnet/corefx
Jan 31, 2020
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); // Записываем результат в файл. } } } |
- 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.
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
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
Всех благодарю за совет и участие.