Как изменить кодировку json файла

При заполнении данных русскими ФИО в SimpleData.json
  • Remove From My Forums
  • Вопрос

  • При заполнении данных русскими ФИО в SimpleData.json

          {
            "UniqueId": "Group-1-Item-1",
            "Title": "Иванов",
            "Subtitle": "Item Subtitle: 1",
            "ImagePath": "Assets/Иванов.jpg",
    diam cubilia aptent vestibulum auctor eget dapibus pellentesque inceptos leo egestas interdum nulla consectetuer suspendisse adipiscing pellentesque proin lobortis sollicitudin augue elit mus congue fermentum parturient fringilla euismod feugiat"
          },
    

    при компиляции VS ругается

    Исключение типа «System.ArgumentOutOfRangeException» возникло в mscorlib.dll, но не было обработано в коде пользователя

    Сведения WinRT: Символ Юникода не имеет сопоставления в конечной многобайтовой кодовой странице.

    Дополнительные сведения: Символ Юникода не имеет сопоставления в конечной многобайтовой кодовой странице.

    Как настроить приложение чтобы оно понимало русские данные? 

Ответы

  • Как всегда отвечаю сам себе :) Оказалось проблема в кодировке файла .json, т.к. студия сохраняет его по умолчанию не в Юникод, а, кто бы мог подумать — в Win1251 !

    Нужно открыть файл json, зайти в меню ФАЙЛ — Дополнительные параметры сохранения и выбрать там кодировку: Юникод (UTF-8, с сигнатурой), котд. стр. 65001.

    • Предложено в качестве ответа

      24 января 2014 г. 10:48

    • Помечено в качестве ответа
      Dmitriy Konyuhov
      24 января 2014 г. 11:16

  • дело в кириллице. используйте латинские буквы(помоему json работает только с UTF-8, если самому не придумать скрипт перекодировки) или формат xml

    в том приложении как раз изменение русских предложении на английские не выдает ошибку

    Спасибо, проверю

    • Помечено в качестве ответа
      Dmitriy Konyuhov
      29 декабря 2013 г. 14:29

edward_jonson

163 / 163 / 68

Регистрация: 23.02.2011

Сообщений: 392

1

06.03.2017, 23:00. Показов 22392. Ответов 3

Метки нет (Все метки)


Здравствуйте. Понадобилось написать скриптик, и решил в целях ознакомления с python написать его как раз на нём.
Задача в том, чтобы открыть json-файл (keys — строки на английском, values — строки на русском, английском, с переносами строк и эмодзями), сделать нужные изменения и записать обратно. В итоге все русские символы записываются как u0442 и тд. Кучу решений с интернетов перепробовал(с ensure_ascii=False и encode(x)/decode(x)).
Если dictionary с русскими символами создавать в коде — всё ок.
Благодарю за помощь.

Python
1
2
3
4
5
6
7
8
9
10
11
12
#coding=utf-8
import json
 
with open('data.json') as fp:
    dictionary = json.load(fp)
    fp.close()
 
#...
 
with open('data.json', 'w') as fp:
    json.dump(dictionary, fp, sort_keys=True, indent=4)
    fp.close()



0



Garry Galler

Эксперт Python

5403 / 3827 / 1214

Регистрация: 28.10.2013

Сообщений: 9,554

Записей в блоге: 1

07.03.2017, 00:32

2

Лучший ответ Сообщение было отмечено edward_jonson как решение

Решение

А вы файл почему в utf-8 не открываете?
…Не помню как там было c dump, но так как код у меня имел дело со здоровым словарем — я использовал итерацию по нему:

Python
1
2
3
4
5
6
7
with open(
    filepath_json, 
    'w',encoding="utf-8"
) as f:
    #s = json.dumps(data,ensure_ascii=False,indent=4)
    for chunk in json.JSONEncoder(ensure_ascii=False,indent=4).iterencode(dict_from_frame):
        f.write(chunk)

Проблем записи любых не asccii символов не было.



1



Эксперт Python

4606 / 2027 / 359

Регистрация: 17.03.2012

Сообщений: 10,081

Записей в блоге: 6

07.03.2017, 10:37

3

Цитата
Сообщение от edward_jonson
Посмотреть сообщение

В итоге все русские символы записываются как u0442

Куда записываются, в память или файл?



0



163 / 163 / 68

Регистрация: 23.02.2011

Сообщений: 392

07.03.2017, 12:09

 [ТС]

4

dondublon, в файл

Garry Galler, спасибо большое, encoding=»utf-8″ решил проблему. Интуитивно казалось, что #coding=utf-8 так делает по умолчанию.



0



Веб-разработчик клиента пожаловался, что json-файл, который я передаю ему на FTP Bitrix-сайта, приходит в кодировке UTF с BOM.

Я проверил, действительно Notepad++ определяет его в такой кодировке:

Это легко проверить если открыть файл в двоичном виде (в Total Commander):

Как видно, в начале файла содержится 3 байта EF BB BF. Это и есть BOM-кодировка.

Нашел решение на инфостарте поиском.

В решении используется функция ЗаписьТекста:

Заменил ТекстовыйДокумент на ЗаписьТекста:

    Лок_ИмяФайла = КаталогВременныхФайлов() + Строка(Новый УникальныйИдентификатор);ТекстСопутствующих = Обработки.дор_РассчетСопутствующихДляСайта.РассчитатьВФайл();УдалитьФайлы(Лок_ИмяФайла); //Не обязательно, у файла уникальное имя, но для общности
   
ЗаписьТекста = Новый ЗаписьТекста(Лок_ИмяФайла,КодировкаТекста.UTF8,,Ложь,Символы.ПС);
   
//Т = Новый ТекстовыйДокумент();
   
ЗаписьТекста.Записать(ТекстСопутствующих);
   
//Т.УстановитьТекст(ТекстСопутствующих);
    //Т.Записать(Лок_ИмяФайла);
   
ЗаписьТекста.Закрыть();

Посмотрел в отладчике, в какой файл сохраняется временный файл: C:UsersUserAppDataLocalTemp50cfa3b5-8cf8-481d-aaa6-d0b2498d974d

Поиском нашел этот файл в каталоге:

Но увы, независимо от значения параметра Дописывать, 1С настойчиво добавляло BOM-кодировку:

Бюджет решения не позволялся углубляться в поиски, поэтому я сделал решение через ADODB.Stream, которое было написано в той же статье:

    Лок_ИмяФайла = КаталогВременныхФайлов() + Строка(Новый УникальныйИдентификатор);
   
Лок_ИмяФайлаНач = Лок_ИмяФайла + «_Нач»;
   
ТекстСопутствующих = Обработки.дор_РассчетСопутствующихДляСайта.РассчитатьВФайл();Т = Новый ТекстовыйДокумент();
   
Т.УстановитьТекст(ТекстСопутствующих);
   
Т.Записать(Лок_ИмяФайлаНач);УбитьВОМ(Лок_ИмяФайлаНач, Лок_ИмяФайла);

Процедура

УбитьВОМ(ИсходныйФайл,РезультирующийФайл)
    Попытка
       
файл = Новый ComObject(«ADODB.Stream»);
       
файл.Mode = 3; // r/w
       
файл.Type = 1; //1-Binary, 2-Text
       
файл.Open();
       
файл.LoadFromFile(ИсходныйФайл);
       
файл.Position = 3;
       
текстБезБОМ = Новый ComObject(«ADODB.Stream»);
       
текстБезБОМ.Mode = 3; // r/w
       
текстБезБОМ.Type = 1; //1-Binary, 2-Text
       
текстБезБОМ.Open();
       
файл.CopyTo(текстБезБОМ);
       
файл.Close();
       
текстБезБОМ.SaveToFile(РезультирующийФайл,2);
       
текстБезБОМ.Close();
       
УдалитьФайлы(ИсходныйФайл);
    Исключение
       
Сообщить(ОписаниеОшибки(),СтатусСообщения.Важное);
    КонецПопытки;
КонецПроцедуры

Наконец у меня получился чистый UTF, без BOM:

Потом почитал, что метод через ЗаписьТекста работает не на всех режимах совместимости.

У меня была УТ11, релиз платформы 8.3.16.1502, режим совместимости 8.3.14.

Время факт: 0.5 час.

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Как изменить кодировку gedit
  • Как изменить кодировку exe файла
  • Как изменить кодировку docx
  • Как изменить кодировку csv файла на utf 8 python 3
  • Как изменить кодировку clion

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии