С# - код Visual Studio - проблема с кодировкой

У меня есть папка внутри файла XML, например:

<?xml version = "1.0" encoding = "UTF-8"?>
<cities>
   <result>
      <city_id>-3870534</city_id>
      <country>mx</country>
      <name>Santa Bárbara</name>
      <nr_hotels>0</nr_hotels>
      <translations>
         <language>en-gb</language>
         <name>Santa Bárbara</name>
      </translations>
      <translations>
         <language>ru</language>
         <name>Санта-Барбара</name>
      </translations>
   </result>
</cities>
<!-- RUID: [UmFuZG9tSVYkc2RlIyh9YcxtmfhRwqry58sgWYNIgEV1AjdsVswrKUorBoUlR6ylFgiaj5XJ0w0DP0lL/htWqOKtE33w1EhBbLABKokIfEo=] -->

Файл выглядит хорошо отформатированным, в utf8, содержит русские термины и символы типа "б" в Санта-Барбаре.
Я должен прочитать этот файл и создать запись в базе данных MySql (через С#), но у меня возникают проблемы с кодировкой.

PS: таблица БД имеет несколько столбцов (для хранения идентификатора города, перевода страны и города), все текстовые поля, utf8_general_ci.

Я пытаюсь использовать следующий код для чтения файлов (в данном случае только одного) в папке

foreach (string file in Directory.EnumerateFiles("C:\xml_folder\"" + sub_folder, "*.xml")) {
    Console.WriteLine(file);

    string response = File.ReadAllText(file, Encoding.GetEncoding("Windows-1252"));

    Console.WriteLine(response);

    var document = XDocument.Parse(response);

    foreach (var child in document.Root.Elements("result")) {
         //... code here
 
        String name_it = "";
        String name_en = "";
        String name_es = "";
        String name_fr = "";
        String name_de = "";
        String name_ru = "";

        foreach (var translationsChild in child.Elements("translations"))
        {
            switch (translationsChild.Element("language").Value)
            {
                case "it":
                    bytes = Encoding.Default.GetBytes(translationsChild.Element("name").Value);
                    name_it = Encoding.UTF8.GetString(bytes);
                    break;
                case "en-gb":
                    bytes = Encoding.Default.GetBytes(translationsChild.Element("name").Value);
                    name_en = Encoding.UTF8.GetString(bytes);
                    break;
                case "es":
                    bytes = Encoding.Default.GetBytes(translationsChild.Element("name").Value);
                    name_es = Encoding.UTF8.GetString(bytes);
                    break;
                case "fr":
                    bytes = Encoding.Default.GetBytes(translationsChild.Element("name").Value);
                    name_fr = Encoding.UTF8.GetString(bytes);
                    break;
                case "de":
                    bytes = Encoding.Default.GetBytes(translationsChild.Element("name").Value);
                    name_de = Encoding.UTF8.GetString(bytes);
                    break;
                case "ru":
                    bytes = Encoding.Default.GetBytes(translationsChild.Element("name").Value);
                    name_ru = Encoding.UTF8.GetString(bytes);
                    Console.WriteLine(name_ru);
                    break;
            }
        }

В двух словах, я получаю файл, затем конвертирую его в XML, чтобы прочитать все дочерние элементы и сохранить его в БД.

Кажется, проблема связана с тем, как (кодирование) я получаю строку из файла, я пробовал конвертировать в Windows-1252.

string response = File.ReadAllText(file, Encoding.GetEncoding("Windows-1252"));

Я даже пробовал конвертировать в utf8

string response = File.ReadAllText(file, System.Text.Encoding.UTF8);

но каждый раз, когда я получаю (в консоли отладки и в БД), это:

Santa Bárbara -\> Santa B?rbara
Санта-Барбара -\> ?????-??????

Похоже, проблема связана с тем, как работает File.ReadAllText(...), кодировка вообще не работает.

PS: для хранения данных в БД я использую DML следующим образом:

cmd.CommandText = "INSERT INTO cities (city_id,country,name,nr_hotels,name_it,name_en,name_es,name_fr,name_de,name_ru,last_modified_date) VALUES(@city_id,@country,@name,@nr_hotels,@name_it,@name_en,@name_es,@name_fr,@name_de,@name_ru,@last_modified_date) on duplicate key update city_id=@city_id,country=@country,name=@name,nr_hotels=@nr_hotels,name_it=@name_it,name_en=@name_en,name_es=@name_es,name_fr=@name_fr,name_de=@name_de,name_ru=@name_ru,last_modified_date=@last_modified_date";

Пожалуйста, вы можете мне помочь?
заранее спасибо

Найдите минутку, чтобы прочитать справку по редактированию в справочном центре. Форматирование на Stack Overflow отличается от форматирования на других сайтах. Чем лучше выглядит ваш пост, тем легче его прочитать и понять другим.

gunr2171 10.04.2023 20:16

Также перечитайте минимальный воспроизводимый пример руководство по размещению кода — там размещено слишком много кода. Обратите внимание, что код читает файл utf-8 как «Windows-1252», что не имеет смысла. Минимизируя количество кода, убедитесь, что используемые кодировки имеют смысл.

Alexei Levenkov 10.04.2023 20:19
File.ReadAllText(file, Encoding.GetEncoding("Windows-1252")) не "конвертирует" текст в Windows-1252, а читает текст из файла, предполагая, что он закодирован в Windows-1252.
Klaus Gütter 10.04.2023 20:19

Привет, я попробовал "File.ReadAllText" с Windows-1252 и utf8, но в обоих случаях я получил: Санта-Барбара -> ?????-?????? (хотя исходный файл выглядит нормально, в utf8 может быть проблема с mysql? Я использовал utf8_general_ci)

user21611183 10.04.2023 20:29
I get (in the debug console - вы настроили консоль на вывод Unicode? and in the DB) - вы настроили свою кодировку в mysql? Вы должны удалить все свои GetBytes/GetString (они ничего не делают, кроме как уничтожить строку еще больше) и указать в File.ReadAllText кодировку, в которой фактически сохранен ваш XML-файл (надеюсь, но не обязательно, UTF-8).
GSerg 10.04.2023 20:29

кодировка БД, которую я использую, — general_utf8_ci, надеясь, что это правильно. Я удалил все getBytes/GetString, оставив начальный: string response = File.ReadAllText(file, System.Text.Encoding.UTF8); Ничего не изменилось к сожалению

user21611183 10.04.2023 20:43

да!! Теперь проблема исправлена, всем спасибо!! Я супер счастлив :)

user21611183 10.04.2023 21:50
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не вижу смысла конвертировать в байтовый массив и обратно. Это работает правильно для меня

    string response = File.ReadAllText(file, Encoding.UTF8);
    var document = XDocument.Parse(response);

    foreach (var child in document.Root.Elements("result"))
    {
        //... code here

        String name_en = "";
        String name_ru = "";


        foreach (var translationsChild in child.Elements("translations"))
        {
            var name = translationsChild.Element("name").Value;
            Console.WriteLine(name);
            switch (translationsChild.Element("language").Value)
            {
                case "en-gb":
                    name_en = name;
                    break;

                case "ru":
                    name_ru = name;
                    break;
            }
        }
    }

выход

Santa Bárbara
Санта-Барбара

Я вижу, что "Санта-Барбара" хорошо написано сейчас, но "Санта-Барбара" все еще "?????-???????" в консоли отладки и в БД

user21611183 10.04.2023 21:22

@user21611183 user21611183 Для меня это вообще не имеет смысла. Если вы видите их нормально в XML, вы, безусловно, увидите их нормально после синтаксического анализа. Ваш визуализатор имеет неправильный шрифт, который не поддерживает русские буквы, попробуйте изменить шрифт.

Serge 10.04.2023 21:35

Теперь это работает! Я добавил кодировку в строку подключения к БД --> "Server=myServerAddress;Database=myDataBase;Uid=myUsername‌​e;Pwd=myPassword; CharSet=utf8;" Спасибо за вашу помощь :)

user21611183 10.04.2023 21:49

Другие вопросы по теме