Форум программистов, компьютерный форум, киберфорум
JavaScript: React/ReactJS
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/41: Рейтинг темы: голосов - 41, средняя оценка - 4.61
2 / 2 / 1
Регистрация: 24.11.2018
Сообщений: 130

Работа с iconv-lite (проблемы с кодировкой)

10.05.2020, 10:04. Показов 7951. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Суть задания такова Написать приложение для выполнения под ОС Android, которое
переводит текст в одной кодировке (например win-1251) и записывает
содержимое в другой кодировке (например utf-8) и обратную задачу.
Возникла проблема с кодировкой делаю вот
JavaScript
1
2
3
4
5
6
7
8
9
10
11
const convertItem = (text,key) =>{
    var iconv = require('iconv-lite');
    var buf = iconv.encode(text, 'win1251');
    var str = iconv.decode(buf, 'utf8');
    setValue(old=>old.map((value)=>{
      if(value.key==key){
        value.text = str
      }
      return value
    }))
  }
И в обратную сторону вот так
JavaScript
1
2
3
4
5
6
7
8
9
10
11
const convertItem = (text,key) =>{
    var iconv = require('iconv-lite');
    var buf = iconv.encode(text, 'utf8');
    var str = iconv.decode(buf, 'win1251');
    setValue(old=>old.map((value)=>{
      if(value.key==key){
        value.text = str
      }
      return value
    }))
  }
Как вы могли догадаться, ничего не работает. Как будет правильней реализовать данную задачу?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.05.2020, 10:04
Ответы с готовыми решениями:

Не работает iconv: Fatal error: Call to undefined function iconv()...
Доброе время суток! Подскажите пожалуйста, почему может не работать функция iconv? Версия php 5.1.6, установлен на системе...

PHPExcel Notice: iconv() [function.iconv]: Detected an illegal character in input string!
Блин задолбала эта библиотека!!! Выдает 2 ошибки!!! : Detected an illegal character in input string in...

ICONV - зачем нужна iconv.output_encoding и иже с ней?
Добрый вечер. Есть вопрос по расширению ICONV для преобразования кодировок. Кто-нибудь знает, для чего нужны переменные...

16
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
10.05.2020, 12:20
Halacky, сначала - decode, потом - encode.
0
2 / 2 / 1
Регистрация: 24.11.2018
Сообщений: 130
10.05.2020, 14:27  [ТС]
Цитата Сообщение от shvyrevvg Посмотреть сообщение
Halacky, сначала - decode, потом - encode.
А как мне получить buf?
Мы же сначала получаем массив байт (то есть получаем текст в виде массива из байт), для это используем encode
А потом уже этот массив уже обратно в слово, но уже в другой кодировке.
Разве нет?
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
10.05.2020, 14:33
Цитата Сообщение от Halacky Посмотреть сообщение
А как мне получить buf?
Halacky, как-то так
JavaScript
1
const buf = Buffer.from(text, 'binary');
0
2 / 2 / 1
Регистрация: 24.11.2018
Сообщений: 130
10.05.2020, 14:58  [ТС]
Цитата Сообщение от shvyrevvg Посмотреть сообщение
Halacky, как-то так
const buf = Buffer.from(text, 'binary');
К сожалению проблема не решилась.
При вызове, методов русские символы отображаются некоректно.
JavaScript
1
2
3
4
5
6
7
8
9
10
11
const convertItem = (text,key) =>{
    var iconv = require('iconv-lite');
    const buf = Buffer.from(text, 'binary');
    var str = iconv.decode(buf, 'utf8');
    setValue(old=>old.map((value)=>{
      if(value.key==key){
        value.text = str
      }
      return value
    }))
  }
И при вызове обратного метода, который по моей логике должен был отобразить русские символы нормально. Не как задумывалось
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
10.05.2020, 15:07
Halacky, смотрите, у Вас изначально есть строка в какой-то кодировке(набор байт), значит нужно сначала декодировать набор байт, а затем закодировать строку в новой кодировке.
JavaScript
1
2
3
  const buf = Buffer.from(text, "binary");
  const str = iconv.decode(buf, "win1251");
  const bufUtf8 = iconv.encode(str, "utf-8");
Но так как в ноде мы работаем со строками в utf-8, то можно просто декодировать
JavaScript
1
2
  const buf = Buffer.from(text, "binary");
  const str = iconv.decode(buf, "win1251");
0
2 / 2 / 1
Регистрация: 24.11.2018
Сообщений: 130
11.05.2020, 05:33  [ТС]
Цитата Сообщение от shvyrevvg Посмотреть сообщение
смотрите, у Вас изначально есть строка в какой-то кодировке(набор байт), значит нужно сначала декодировать набор байт, а затем закодировать строку в новой кодировке.
День новый-проблемы старые.
Переписал вот так
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const convertItem = (text,key) =>{
    var iconv = require('iconv-lite');
    const buf = Buffer.from(text, "binary");
    const str = iconv.decode(buf, "win1251");
    setValue(old=>old.map((value)=>{
      if(value.key==key){
        value.text = str
      }
      return value
    }))
  }
  const convertItem2 = (text,key) =>{
    var iconv = require('iconv-lite');
    const buf = Buffer.from(text, "binary");
    const str = iconv.decode(buf, "utf8");
    setValue(old=>old.map((value)=>{
      if(value.key==key){
        value.text = str
      }
      return value
    }))
  }
При вызове любого из этих методов, результат одинаково неправильный. Русские символы отображаются некоректно. Хотя обе кодировки "работают" с русскими символами. Может в процессе кодирования\декодирования, теряется часть байтов. хм
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
11.05.2020, 06:37
Halacky, откуда text приходит? Если его вывести без преобразования как он будет выглядеть(скиньте иероглифы)?
0
2 / 2 / 1
Регистрация: 24.11.2018
Сообщений: 130
11.05.2020, 07:25  [ТС]
При вводе сообщения я не трогаю кодировку вообще.
Потом только обрабатываю простое нажатие и долгое нажатие, для смены кодировки.
То есть если вводить просто текст, все работает корректно. (Первая фотка)
При обычном нажатии вызывается метод ConvertItem (Вторая фотка)
При долгом нажатии вызывается метод ConvertItem2
Миниатюры
Работа с iconv-lite (проблемы с кодировкой)   Работа с iconv-lite (проблемы с кодировкой)  
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
11.05.2020, 07:44
Halacky, так у Вас изначально текст в utf-8, а в ConvertItem Вы его пытаетесь декодировать как win1251
0
2 / 2 / 1
Регистрация: 24.11.2018
Сообщений: 130
11.05.2020, 08:18  [ТС]
Я получаю код изначально в utf-8, мне нужно перевести этот же текст в win1251
Потом обратную операцию. Как бы я не кодировал\декодировал, ответ тот же остается. Неправильный
1
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
11.05.2020, 08:39
Halacky, понял, Вы строки гоняете, туда сюда. Тут нужно подумать, может часть будет теряться.
Самый простой вариант - хранить изначальный буфер.
0
2 / 2 / 1
Регистрация: 24.11.2018
Сообщений: 130
11.05.2020, 08:43  [ТС]
В репозитории у iconv-lite нашел упоминание о том, что могут возникнуть проблемы при перегоне из кодировки в кодировку
Они предложили вот такой вариант.
https://github.com/ashtuchkin/... n-decoding
Но я не понял как прикрутить это к моему проекту. (т.к. в целом с js я познакомился дня два назад)
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
11.05.2020, 09:03
Halacky, да, получается нельзя туда-сюда конвертить строки(ну это было ожидаемо). Нужно хранить исходную строку. Т.е. первый раз когда вводите строку в utf-8 сохраните ее куда-нибудь. И только ее конвертите в нужную кодировку.

Добавлено через 5 минут
Вообще странное занятие Получается сконверченые строки показываться в приложении будут неверно(т.е. из них не получить исходную строку), т.к. выводятся они
как utf-8.
0
2 / 2 / 1
Регистрация: 24.11.2018
Сообщений: 130
11.05.2020, 09:11  [ТС]
Ну вот такое у нас задание дали, а главное методичку скинули, а там про то как сайт верстать
Я сделал скрипт для кодирования\декодирования из txt документа и все работает
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
FSO = new ActiveXObject("Scripting.FileSystemObject"); 
var t_file = FSO.OpenTextFile("E:\\OC\\3\\1\\read.txt" , 1,true); 
 
source = t_file.ReadAll();
 
var x=strConv(source,"windows-1251","utf-8");
 
new ActiveXObject("Scripting.FilesystemObject").openTextFile("E:\\OC\\3\\1\\\write.txt",2,true).write(x);
 
function strConv(txt, sourceCharset, destCharset)
{
  with(new ActiveXObject("ADODB.Stream"))
  {
    type=2, mode=3, charset=destCharset;
    open();
    writeText(txt);
    position=0, charset=sourceCharset;
    return readText();
 }
}
И вот обратно
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var source1 = new ActiveXObject("Scripting.FileSystemObject").OpenTextFile("E:\\OC\\3\\1\\write.txt", 1,true).ReadAll();
var x1=strConv(source1,"utf-8",C);
new ActiveXObject("Scripting.FilesystemObject").openTextFile("E:\\OC\\3\\1\\result.txt",2,true).write(x1);
function strConv(txt, sourceCharset, destCharset)
{
  with(new ActiveXObject("ADODB.Stream"))
  {
    type=2, mode=3, charset=destCharset;
    open();
    writeText(txt);
    position=0, charset=sourceCharset;
    return readText();
 }
}
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
11.05.2020, 09:18
Цитата Сообщение от Halacky Посмотреть сообщение
Я сделал скрипт для кодирования\декодирования из txt документа и все работает
Halacky, а в этом и прикол, что на файлах все будет нормально работать, так как нет лишних преобразований Может Вам нужно тестовые файлы конвертить, а не в текст в поле?
0
2 / 2 / 1
Регистрация: 24.11.2018
Сообщений: 130
11.05.2020, 09:21  [ТС]
Во, смотрите. Полностью задание.
Напишите приложение для выполнения под ОС Android, которое
переводит текст в одной кодировке (например win-1251) и записывает
содержимое в другой кодировке (например koi-8) и обратную задачу.
Приложение должно содержать текстовые поля для ввода, а также иметь
возможность загружать текстовый файл с текстом в исходной кодировке и
сохранять в текстовый файл переведенный текст на ваше мобильное
устройство.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.05.2020, 09:21
Помогаю со студенческими работами здесь

проблемы с кодировкой
подскажите плиз, вместо русского языка отображаются иероглифы в access, видимо проблемы с кодировкой или шрифтами, версиия 2007, заранее...

Проблемы с кодировкой
Помогите пожалуйста. От php я ваще далекий(((, не могу справить с кодировкой. Вот сайт -http://topmuz.com.ua/muzics/a чуть ниже плеер,...

Проблемы с кодировкой
Не давно поставил windows7. Заметил, что во всех браузерах, на некоторых сайтах, что-то с кодировкой, менять настройки браузера не...

Проблемы с кодировкой
Есть парсер (плагин для Joomla). Парсирует такого рода .csv файлы сохраненные с помощью EXCEL КГН;1 x 185;32,7;2490 КГН;1 x...

Проблемы с кодировкой
До не давно все было хорошо. Вот такая проблема - Например в место того чтоб писало нормально пишет вот что - ������ ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Использование Keycloak со Spring Boot и интеграция Identity Provider
Javaican 01.07.2025
Два года назад я получил задачу, которая сначала показалась тривиальной: интегрировать корпоративную аутентификацию в микросервисную архитектуру. На тот момент у нас было семь Spring Boot приложений,. . .
Содержание темы с примерами на WebGL
8Observer8 01.07.2025
Все примеры из книги Мацуды и Ли в песочнице JSFiddle Пример выводит точку красного цвета размером 10 пикселей на WebGL 1. 0 и 2. 0 WebGL 1. 0. Передача координаты точки из главной программы в. . .
Основы WebGL. Простой треугольник
8Observer8 01.07.2025
Простой треугольник без трансформаций. Для трансформаций можно использовать glMatrix, как в примере: https:/ / plnkr. co/ edit/ qT6ZTwvncLPRamK5?preview На русском: . . .
Полиглотные микросервисы на C# и .NET
ArchitectMsa 30.06.2025
Полиглотная архитектура появилась не из желания усложнить жизнь разработчикам. Она родилась из практической необходимости решать разные задачи наиболее эффективным способом. В одном из проектов. . .
Стратегии кеширования
Javaican 29.06.2025
Кеширование — это хранение часто запрашиваемых данных в быстром хранилище (обычно в памяти), чтобы не обращаться к более медленному первоисточнику. Казалось бы, все просто. Но за этой простотой. . .
Наблюдаемость приложений ASP.NET Core с OpenTelemetry, Prometheus и Grafana
ArchitectMsa 29.06.2025
Наблюдаемость (observability) – это ключевое свойство современной системы, позволяющее понимать её внутреннее состояние на основе внешних данных. Если мониторинг отвечает на вопрос "что случилось?",. . .
Четыре главных модели отношений классов в с++
russiannick 28.06.2025
Продолжаю крестовый поход против c++. ideone. com/ юзаю для проверки валидности кода. Насчитал 4 модели отношений классов: одиночный класс, равноправные классы, слейв - мастер, терминатор. . . .
Вложенные корутины в Unity
GameUnited 28.06.2025
Работа с корутинами в Unity кажется простой до тех пор, пока не начинаешь их вкладывать друг в друга. Я потратил несколько месяцев на изучение этого механизма, и до сих пор иногда ловлю себя на том,. . .
Управление Arduino на C# через последовательный порт
Wired 28.06.2025
Когда я впервые попробовал заставить Arduino общаться с моим C# приложением, казалось, что эти два мира существуют параллельно и никогда не пересекутся. Микроконтроллер упорно моргал встроенным. . .
Основы OpenGL 3.3 и Qt 6.9. Трансформированный треугольник
8Observer8 27.06.2025
Содержание блога На русском https:/ / rutube. ru/ video/ e424497dd6b7ae7e11494027c4b31a54/ https:/ / vkvideo. ru/ video-231040171_456239019 https:/ / www. youtube. com/ watch?v=mfD-ZL7wa_4
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru