Данные на иврите полученные из 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);
        }

    }
    
 }
    

Вот пример входных данных :

  1. שלום עליכם 46-44;- так вижу в броузере

  2. ×©×œ×•× ×¢×œ×™×›× 46-44;-до перекодирования

  3. ?©???•?? ?????™?›?? 46-44; - После перекодировки

Цель- получить данные в C# аналогично как в п.1(из броузера)


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

Автор решения: aepot

Давайте попробуем изменить технологию получения данных

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 - не понятно, что такое, почитайте это: Асинхронное программирование.

→ Ссылка