У меня есть папка внутри файла 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";
Пожалуйста, вы можете мне помочь?
заранее спасибо
Также перечитайте минимальный воспроизводимый пример руководство по размещению кода — там размещено слишком много кода. Обратите внимание, что код читает файл utf-8 как «Windows-1252», что не имеет смысла. Минимизируя количество кода, убедитесь, что используемые кодировки имеют смысл.
File.ReadAllText(file, Encoding.GetEncoding("Windows-1252"))
не "конвертирует" текст в Windows-1252, а читает текст из файла, предполагая, что он закодирован в Windows-1252.
Привет, я попробовал "File.ReadAllText" с Windows-1252 и utf8, но в обоих случаях я получил: Санта-Барбара -> ?????-?????? (хотя исходный файл выглядит нормально, в utf8 может быть проблема с mysql? Я использовал utf8_general_ci)
I get (in the debug console
- вы настроили консоль на вывод Unicode? and in the DB)
- вы настроили свою кодировку в mysql? Вы должны удалить все свои GetBytes
/GetString
(они ничего не делают, кроме как уничтожить строку еще больше) и указать в File.ReadAllText
кодировку, в которой фактически сохранен ваш XML-файл (надеюсь, но не обязательно, UTF-8).
кодировка БД, которую я использую, — general_utf8_ci, надеясь, что это правильно. Я удалил все getBytes/GetString, оставив начальный: string response = File.ReadAllText(file, System.Text.Encoding.UTF8); Ничего не изменилось к сожалению
да!! Теперь проблема исправлена, всем спасибо!! Я супер счастлив :)
Не вижу смысла конвертировать в байтовый массив и обратно. Это работает правильно для меня
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 user21611183 Для меня это вообще не имеет смысла. Если вы видите их нормально в XML, вы, безусловно, увидите их нормально после синтаксического анализа. Ваш визуализатор имеет неправильный шрифт, который не поддерживает русские буквы, попробуйте изменить шрифт.
Теперь это работает! Я добавил кодировку в строку подключения к БД --> "Server=myServerAddress;Database=myDataBase;Uid=myUsernamee;Pwd=myPassword; CharSet=utf8;" Спасибо за вашу помощь :)
Найдите минутку, чтобы прочитать справку по редактированию в справочном центре. Форматирование на Stack Overflow отличается от форматирования на других сайтах. Чем лучше выглядит ваш пост, тем легче его прочитать и понять другим.