Данные на иврите полученные из PHP в кодировке UTF8 не читабельные в C#
Пытаюсь преобразовать данные на иврите из My Sql c помощью запроса к php - данные получаю в нормальном виде в броузере - но в C# не получается получить их в нормальном виде. Пробовал перекодировку в C# - тоже не помогает.
public partial class MainWindow : Window
{
public const string ListProjectUrl = "https://mysite.co.il/pm/Projects.php?code=1234";
public MainWindow()
{
InitializeComponent();
}
private static string[] getPhpData(string varExtUrl)
{
var res = new WebClient().DownloadString(varExtUrl);
string[] items = res.Split('\n');
return items;
}
private void lvProjects_Loaded(object sender, RoutedEventArgs e)
{
string[] projectItems = getPhpData(ListProjectUrl);
List<Project> items = new List<Project>();
foreach (string prItem in projectItems)
{
if (prItem.Length > 0)
{
string[] words = prItem.Split(';');
string str3 = "ירודגכךלחדגךדלחגיכדג";
string str3_4 = Utf8ToUtf16Short(str3);
string decodestr1 = Utf16ToUtf8Short(words[3]);
string decodestr2 = Utf8ToUtf16Short(words[3]);
items.Add(item: new Project() { Num = words[0], Name = words[1], Code = words[2], ProjectN = words[3] });
}
else
break;
}
lvProjects.ItemsSource = items;
}
static string UTF8ToWin1251(string sourceStr)
{
Encoding utf8 = Encoding.UTF8;
Encoding win1251 = Encoding.GetEncoding("Windows-1251");
byte[] utf8Bytes = utf8.GetBytes(sourceStr);
byte[] win1251Bytes = Encoding.Convert(win1251, utf8, utf8Bytes);
return win1251.GetString(win1251Bytes);
}
public static string Utf16ToUtf8Short(string utf16String)
{
byte[] utf16Bytes = Encoding.Unicode.GetBytes(utf16String);
byte[] utf8Bytes = Encoding.Convert(Encoding.Unicode, Encoding.UTF8, utf16Bytes);
return Encoding.Default.GetString(utf8Bytes);
}
public static string Utf8ToUtf16Short(string utf8String)
{
byte[] utf8Bytes = Encoding.Unicode.GetBytes(utf8String);
byte[] utf16Bytes = Encoding.Convert(Encoding.Unicode, Encoding.UTF8, utf8Bytes);
return Encoding.Default.GetString(utf16Bytes);
}
}
}
Вот пример входных данных :
שלום עליכם 46-44;- так вижу в броузере
×©×œ×•× ×¢×œ×™×›× 46-44;-до перекодирования
?©???•?? ?????™?›?? 46-44; - После перекодировки
Цель- получить данные в C# аналогично как в п.1(из броузера)
Ответы (1 шт):
Давайте попробуем изменить технологию получения данных
private static readonly HttpClient client = new HttpClient();
private async Task<string[]> GetPhpDataAsync(string varExtUrl)
{
string res = await client.GetStringAsync(varExtUrl);
return res.Split('\n');
}
private async void lvProjects_Loaded(object sender, RoutedEventArgs e)
{
try
{
string[] projectItems = await GetPhpDataAsync(ListProjectUrl);
// ваш код
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
HttpClient должен определить кодировку скачиваемых данных автоматически по заголовку Content-Type: ...;charset=...
При этом вам вообще не нужно производить какие-либо дополнительные преобразования.
Если async/await - не понятно, что такое, почитайте это: Асинхронное программирование.