Как в node js поставить кодировку геа 8 для excel

Обновлено: 02.07.2024

Недавно я добавил кнопку загрузки CSV, которая берет данные из базы данных (Postgres), массив с сервера (Ruby on Rails) и превращает их в файл CSV на стороне клиента (Javascript, HTML5). В настоящее время я тестирую файл CSV и сталкиваюсь с некоторыми проблемами кодирования.

Когда я просматриваю файл CSV через «less», файл выглядит нормально. Но когда я открываю файл в Excel или TextEdit, я начинаю видеть странные символы, такие как

Я читал, что такого рода проблемы могут возникать, если для параметра Кодировка базы данных задано неправильное значение. НО, база данных, которую я использую, настроена на использование кодировки UTF8. И когда я отлаживаю с помощью кодов JS, которые создают файл CSV, текст кажется нормальным. (Это может быть способность Chrome и меньше возможностей)

Я чувствую разочарование, потому что единственная вещь, которую я узнаю из своего онлайн-поиска, - это то, что может быть много причин, по которым не работает кодирование, я не уверен, какая часть виновата (поэтому извините меня, поскольку я изначально отмечал многочисленные вещи) и ничто из того, что я пробовал, не пролило новый свет на мою проблему.

Для справки вот фрагмент JavaScript, который создает файл CSV!

Это может быть проблемой в кодировке вашего сервера.

Вы можете попробовать (при условии, что локаль - английский, США), если вы работаете в Linux:

Excel любит Unicode в UTF-16 LE с кодировкой BOM . Выведите правильную спецификацию ( FF FE ), затем преобразуйте все свои данные из UTF-8 до UTF-16 LE.

Windows использует UTF-16 LE внутри, поэтому некоторые приложения работают лучше с UTF-16, чем с UTF-8.

Я не пытался сделать это в JS, но в Интернете есть различные сценарии для преобразования UTF-8 в UTF-16. Преобразование между вариациями UTF довольно просто и занимает всего дюжину строк.

Эти три правила должны применяться при записи многобайтового файла CSV, чтобы его можно было читать в Excel на разных платформах ОС (Windows, Linux, MacOS)

  1. Символ табуляции \t используется для разделения полей вместо запятой ( , )
  2. Содержимое должно быть закодировано в UTF-16 с прямым порядком байтов (UTF16-LE)
  3. Контент должен иметь префикс UTF16-LE, обозначающий порядок байтов (BOM), который равен 0xFEFF.

Здесь находится -on-macos / "rel =" nofollow noreferrer "> статья , в которой показано, как воспроизвести проблему с кодировкой, и рассказывается о решении. NodeJS используется для создания файла CSV.

Как примечание, спецификация UTF16-LE должна быть явно установлена при записи файла с использованием модуля NodeJS fs . Обратитесь к этой проблеме github для более подробного обсуждения.

У меня была похожая проблема с данными, которые были извлечены в Javascript из списка Sharepoint. Оказалось, что это называется "Ноль". Width Space " символ, и он отображался как . при переносе в Excel. Очевидно, Sharepoint вставляет их иногда, когда пользователь нажимает «Backspace».

Я заменил их этим исправлением:

Похоже, у вас там могут быть другие скрытые персонажи. Я нашел кодовую точку для символа нулевой ширины в моем, просмотрев строку вывода в инспекторе Chrome. Инспектор не смог отобразить персонажа, поэтому он заменил его красной точкой. Когда вы наводите указатель мыши на эту красную точку, она дает вам кодовую точку (например, \ u200B), и вы можете просто вставить в различных кодовых точках невидимые символы и удалить их таким образом.

Я столкнулся именно с этим вчера. Я разрабатывал кнопку, которая экспортирует содержимое таблицы HTML для загрузки в формате CSV. Функциональность самой кнопки практически идентична вашей - по щелчку я читаю текст из таблицы и создаю URI данных с содержимым CSV.

Когда я попытался открыть полученный файл в Excel, стало ясно, что символ "£" читается неправильно. 2-байтовое представление UTF-8 обрабатывалось как ASCII, что приводило к нежелательному символу мусора. Некоторые Googling указали, что это известная проблема с Excel.

Я попытался добавить метку порядка байтов в начале строки - Excel просто интерпретировал ее как данные ASCII. Затем я попытался различными способами преобразовать строку UTF-8 в ASCII (например, csvData.replace('\u00a3', '\xa3') ), но обнаружил, что каждый раз, когда данные приводятся к строке JavaScript, они снова становятся UTF-8. Хитрость заключается в том, чтобы преобразовать его в двоичный файл, а затем закодировать в Base64, не преобразовывая обратно в строку по пути.

У меня уже было CryptoJS в моем приложении (используется для аутентификации HMAC по API REST) и Я смог использовать это для создания последовательности байтов в кодировке ASCII из исходной строки, затем закодировать ее в Base64 и создать URI данных. Это сработало, и полученный файл при открытии в Excel не отображает никаких нежелательных символов.

Основной фрагмент кода, который выполняет преобразование:

Где csvData - ваша CSV-строка.

Вероятно, есть способы сделать то же самое без CryptoJS, если вы не хотите вносить эту библиотеку, но это по крайней мере показывает, что это возможно.

Никак не получается изменить кодировку, у меня есть парсер, выводит информацию в консоль в нормальном виде (кодировка либо CP1251, либо CP1252), но эту информацию мне надо отправлять в телеграмм по API. Мне вылазит ошибка, что кодировка должна быть UTF-8.

Если делать так:

то выводит иероглифы

35 1 1 золотой знак 2 2 серебряных знака 4 4 бронзовых знака А если сделать message = iconv.encode(message, "utf8").toString(); Если у тебя iconv-lite то думаю надо так сделать - var message = iconv.decode(message, "cp1251"); var message = iconv.encode(message, "utf8").toString(); надо смотреть что не так с телеграмом , если строка UTF8 то проблем быть не должно. Два раза потому что сначала мы как-бы преобразовываем в свой формат, а потом из него делаем ту кодировку которая нужна

Вот простой пример для iconv-lite

Создал PHP файл на своем сервере. Кодировка файла UTF-8. Направляю через request get - запрос с var message = iconv.encode(iconv.decode("Привет", "cp1251"), "utf8").toString(); Выводит %1F@825B что за PHP?, тут же js. По поводу строки "%1F@825B" надо смотреть как она передаётся. Без более полного кода сложно сказать где возникает проблема.

Ответ, отмеченный, как принятый -- полный привет логике, и полное досвидание производительности.

Проблема решается неочевидно. Помимо кодировки исходника (исходные данные на источнике), многое зависит от того, каким инструментом забираете источник: node-fetch , request , axios , unirest . В случае, если данные читаются из файла, там данное решение тоже пройдет, но. там отдельная история.

Суть проблемы в том, что Привет может прилететь и из заголовков ( headers ) ответа ( response ) и даже из содержимого ответа (в случае XML -- обязательно). Я двое суток смотрел на буквы э на местах всех кириллических знаков, пока не расковырял исходники всех этих фетчей и реквестов, которые думать не думают о других кодировках, кроме utf8 и других форматах данных, кроме json , и то -- JSON обязательно должен быть utf8 , даже Unicode ему нельзя быть. Как в песенке про папу, который может быть кем угодно, но мамой не может быть. Хуже всего, если все-таки -- думают, но полагают, что все решено.

Далее, важно в какой консоли вы смотрите ответы Ноды: Windows (XP, Vista, 7|8, 10 - ждут сюрпризы), xterm? У Вас LINUX! О! Как хорошо, что Вы не знаете, что такое KOI-8, а Ваши учителя даже про KOI-7. Относительно ровно предсказать вывод без танцев с большим шаманским бубном можно в консолях RHEL^7(CentOs^7, Fedora^17), Ubuntu^12, MacOs^X. С другими не знаком, либо неоднозначно.

Еще вопрос - удалённо если смотрите на терминал, то какой протокол, какой терминальный клиент? Допустим, что с терминалом и кодировками на терминале хорошо.

Вот рабочий макет для песочницы. Просто поиграйтесь с вариантами (ответы функции cnw8 ), которых на просторах интернетов вагон. Почти все они -- неправильные, работают только два: один здесь, а другой у Майкла Джексона.


0_1532767979814_на форум 59.jpg

@kain Сохранил в txt, переименовал в csv, открыл в Excel, результат:

файл 1.txt
Переименованный файл 1.csv

Так что перекодировать всё равно приходится

@fox
А как указать путь чтоб брало файл с диска С:papka и ставило туда-же после перекодирования?
В Вашем примере работает только когда исходный файл лежит в папке AppData\Roaming\BrowserAutomationStudio\apps\21.0.1\
если там его нету то какие пути не указывай - не работает
пробывал так iconv -t WINDOWS-1251 -f UTF-8 C:\test\1.csv > "C:\test\1.csv"
может что не то делаю?
Записывает C:\test\1.csv нормально после перекодировки пустой файл


@avtopars Вы посмотрите внимательнее, я сам этот файл создаю в директории

и потом его конвертирую в нужную папку.

пробывал так iconv -t WINDOWS-1251 -f UTF-8 C:\test\1.csv > "C:\test\1.csv"

Нужно сохранять в другой файл. Можете поменять папку и сохранять с этим же именем

Мда. 2 дня гемора и наконец решение,мож кому-то тоже пригодится.
Суть такая
Проект от @fox работает,делаю вроде все так-же но ничего не работает.
Вместо нужного результата после смены кодировки получаю свой файл но он пустой 0 байт.
Создал новый проект чистый делаю все с нуля все работает, возвращаюсь в старый проект и тут вроде все также но не пашет и все тут.
Решение оказалось банальным в старом проекте в названии файла было пару слов и из-за пробелов нечего не работало. Если файл 1 слово все прекрасно конвертируется.
Логичный вопрос как решить проблему пробелов? Вернее как писать название файлов с пробелами так чтоб утилита это понимала?


@avtopars Действие "выполнить процесс" по сути создаёт bat файл и выполняет его, грубо говоря. А в командной строке если в пути встречается кирилица или пробелы, его обрамляют в кавычки. По сути можно любой путь обрамлять в кавычки, на всякий случай и всё.

@fox
Вы говорили что пользуетесь утилиткой давно,а проблем не возникало с конвертацией?
У меня почему-то она обрезает файл
Например csv оригинал имеет 130 строк выходной подрезает и получается 100 или 25-75 как получится.
от чего зависит не знаю но факт такой есть и это точно она делает,а не бас и ничто другое.
Кстати не всегда иногда и полный файл выдает


Вы говорили что пользуетесь утилиткой давно

Где я такое говорил?

Например csv оригинал имеет 130 строк выходной подрезает и получается 100 или 25-75 как получится.

В общем проблема более менее понятна.
Встречаются разные символы на источнике которые утилита не читает или не понимает, если их заменять на что-то тогда конвертится нормально без обрезок.
Символы которые встречаются в разных случаях разные,тут помоему общего решения нет. В каждом отдельном случае нужно смотреть на чем затык и добавлять его в обработку

Как пример слова не нашего алфавита Pułaskiego Namysłów
ну и вот на символах ł ó и будет обрезка
Ну и символы типа 89×65×92 см где встретится × там и порежет
@fox может есть мысли по поводу решения проблемы?

Обратился к разработчику за помощью в решении проблемы с конвертацией.
Выложу это тут для будущих поколений ))
Через node js проблема решается полностью, для работы нужно поставить модуль encoding
Следующий код решает проблемы

Код если пути у нас в переменных

Отдельная благодарность @fox за участие и консультации


@avtopars Пасиб, не только будущих но и счас. В лайв хаки можно смело. Правда с "узлами" не все дружат.. Пойдут вопросы как))


@fox возможно это только в лайброфис.
Сейчас новый прикол) Конвертирую после каждой записи и сейчас перестал дописывать сконвертированный файл после того, как он начинает весить где-то 13кб) Хрен знает почему)

@fox Перезаписываю кодировку файла csv по вашему проекту. Почему то перезаписывается только первая строчка, а остальные удаляются.

Сработал вариант @avtopars при сохранении.
Но потом когда BAS открывает заново этот файл он уже нечитаем.
Как его при открытии сконвертировать обратно в UTF-8
Пробовал заменить этот же вариант так:

Кодировка текста в Microsoft Excel

С потребностью менять кодировку текста часто сталкиваются пользователи, работающие браузерах, текстовых редакторах и процессорах. Тем не менее, и при работе в табличном процессоре Excel такая необходимость тоже может возникнуть, ведь эта программа обрабатывает не только цифры, но и текст. Давайте разберемся, как изменить кодировку в Экселе.

Работа с кодировкой текста

Кодировка текста – эта набор электронных цифровых выражений, которые преобразуются в понятные для пользователя символы. Существует много видов кодировки, у каждого из которых имеются свои правила и язык. Умение программы распознавать конкретный язык и переводить его на понятные для обычного человека знаки (буквы, цифры, другие символы) определяет, сможет ли приложение работать с конкретным текстом или нет. Среди популярных текстовых кодировок следует выделить такие:

  • Windows-1251;
  • KOI-8;
  • ASCII;
  • ANSI;
  • UKS-2;
  • UTF-8 (Юникод).

Последнее наименование является самым распространенным среди кодировок в мире, так как считается своего рода универсальным стандартом.

Чаще всего, программа сама распознаёт кодировку и автоматически переключается на неё, но в отдельных случаях пользователю нужно указать приложению её вид. Только тогда оно сможет корректно работать с кодированными символами.

Некорректные символы в Microsoft Excel

Наибольшее количество проблем с расшифровкой кодировки у программы Excel встречается при попытке открытия файлов CSV или экспорте файлов txt. Часто, вместо обычных букв при открытии этих файлов через Эксель, мы можем наблюдать непонятные символы, так называемые «кракозябры». В этих случаях пользователю нужно совершить определенные манипуляции для того, чтобы программа начала корректно отображать данные. Существует несколько способов решения данной проблемы.

Способ 1: изменение кодировки с помощью Notepad++

К сожалению, полноценного инструмента, который позволял бы быстро изменять кодировку в любом типе текстов у Эксель нет. Поэтому приходится в этих целях использовать многошаговые решения или прибегать к помощи сторонних приложений. Одним из самых надежных способов является использование текстового редактора Notepad++.

    Запускаем приложение Notepad++. Кликаем по пункту «Файл». Из открывшегося списка выбираем пункт «Открыть». Как альтернативный вариант, можно набрать на клавиатуре сочетание клавиш Ctrl+O.

Переход к отрытию файла в Notepad++

Открытие файла в Notepad++

Изменение кодировки файла в Notepad++

Сохранение файла в Notepad++

Корректное отображение символов в Microsoft Excel

Несмотря на то, что данный способ основан на использовании стороннего программного обеспечения, он является одним из самых простых вариантов для перекодировки содержимого файлов под Эксель.

Способ 2: применение Мастера текстов

Кроме того, совершить преобразование можно и с помощью встроенных инструментов программы, а именно Мастера текстов. Как ни странно, использование данного инструмента несколько сложнее, чем применение сторонней программы, описанной в предыдущем методе.

    Запускаем программу Excel. Нужно активировать именно само приложение, а не открыть с его помощью документ. То есть, перед вами должен предстать чистый лист. Переходим во вкладку «Данные». Кликаем на кнопку на ленте «Из текста», размещенную в блоке инструментов «Получение внешних данных».

Переход к добавлению текста в Microsoft Excel

Импорт файла в Microsoft Excel

Переход к выбору кодировки в Мастере текстов в Microsoft Excel

Мастер текстов в Microsoft Excel

Второе окно мастера текста в Microsoft Excel

  • Общий;
  • Текстовый;
  • Дата;
  • Пропустить столбец.

Третье окно мастера текста в Microsoft Excel

Координаты вставки в Microsoft Excel

Текст добавлен в файл в Microsoft Excel

Способ 3: сохранение файла в определенной кодировке

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

    Переходим во вкладку «Файл». Кликаем по пункту «Сохранить как».

Переход в сохранить как в Microsoft Excel

Переход в сервис в Microsoft Excel

Параметры веб-документа в Microsoft Excel

Сохранение файла в Microsoft Excel

Документ сохранится на жестком диске или съемном носителе в той кодировке, которую вы определили сами. Но нужно учесть, что теперь всегда документы, сохраненные в Excel, будут сохраняться в данной кодировке. Для того, чтобы изменить это, придется опять заходить в окно «Параметры веб-документа» и менять настройки.

Существует и другой путь к изменению настроек кодировки сохраненного текста.

    Находясь во вкладке «Файл», кликаем по пункту «Параметры».

Переход в параметры в Microsoft Excel

Переход в параметры документа в Microsoft Excel

Параметры веб-документа в Microsoft Excel

Теперь любой документ, сохраненный в Excel, будет иметь именно ту кодировку, которая была вами установлена.

Как видим, у Эксель нет инструмента, который позволил бы быстро и удобно конвертировать текст из одной кодировки в другую. Мастер текста имеет слишком громоздкий функционал и обладает множеством не нужных для подобной процедуры возможностей. Используя его, вам придется проходить несколько шагов, которые непосредственно на данный процесс не влияют, а служат для других целей. Даже конвертация через сторонний текстовый редактор Notepad++ в этом случае выглядит несколько проще. Сохранение файлов в заданной кодировке в приложении Excel тоже усложнено тем фактом, что каждый раз при желании сменить данный параметр, вам придется изменять глобальные настройки программы.

Закрыть

Мы рады, что смогли помочь Вам в решении проблемы.

Отблагодарите автора, поделитесь статьей в социальных сетях.

Закрыть

Опишите, что у вас не получилось. Наши специалисты постараются ответить максимально быстро.

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