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

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

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

Author24 — интернет-сервис помощи студентам
Всем привет.
Суть задания такова Написать приложение для выполнения под ОС 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.05.2020, 10:04
Ответы с готовыми решениями:

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

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

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

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

16
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
10.05.2020, 12:20 2
Halacky, сначала - decode, потом - encode.
0
2 / 2 / 1
Регистрация: 24.11.2018
Сообщений: 130
10.05.2020, 14:27  [ТС] 3
Цитата Сообщение от shvyrevvg Посмотреть сообщение
Halacky, сначала - decode, потом - encode.
А как мне получить buf?
Мы же сначала получаем массив байт (то есть получаем текст в виде массива из байт), для это используем encode
А потом уже этот массив уже обратно в слово, но уже в другой кодировке.
Разве нет?
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
10.05.2020, 14:33 4
Цитата Сообщение от Halacky Посмотреть сообщение
А как мне получить buf?
Halacky, как-то так
Javascript
1
const buf = Buffer.from(text, 'binary');
0
2 / 2 / 1
Регистрация: 24.11.2018
Сообщений: 130
10.05.2020, 14:58  [ТС] 5
Цитата Сообщение от 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 6
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  [ТС] 7
Цитата Сообщение от 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 8
Halacky, откуда text приходит? Если его вывести без преобразования как он будет выглядеть(скиньте иероглифы)?
0
2 / 2 / 1
Регистрация: 24.11.2018
Сообщений: 130
11.05.2020, 07:25  [ТС] 9
При вводе сообщения я не трогаю кодировку вообще.
Потом только обрабатываю простое нажатие и долгое нажатие, для смены кодировки.
То есть если вводить просто текст, все работает корректно. (Первая фотка)
При обычном нажатии вызывается метод ConvertItem (Вторая фотка)
При долгом нажатии вызывается метод ConvertItem2
Миниатюры
Работа с iconv-lite (проблемы с кодировкой)   Работа с iconv-lite (проблемы с кодировкой)  
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
11.05.2020, 07:44 10
Halacky, так у Вас изначально текст в utf-8, а в ConvertItem Вы его пытаетесь декодировать как win1251
0
2 / 2 / 1
Регистрация: 24.11.2018
Сообщений: 130
11.05.2020, 08:18  [ТС] 11
Я получаю код изначально в utf-8, мне нужно перевести этот же текст в win1251
Потом обратную операцию. Как бы я не кодировал\декодировал, ответ тот же остается. Неправильный
1
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
11.05.2020, 08:39 12
Halacky, понял, Вы строки гоняете, туда сюда. Тут нужно подумать, может часть будет теряться.
Самый простой вариант - хранить изначальный буфер.
0
2 / 2 / 1
Регистрация: 24.11.2018
Сообщений: 130
11.05.2020, 08:43  [ТС] 13
В репозитории у iconv-lite нашел упоминание о том, что могут возникнуть проблемы при перегоне из кодировки в кодировку
Они предложили вот такой вариант.
https://github.com/ashtuchkin/... n-decoding
Но я не понял как прикрутить это к моему проекту. (т.к. в целом с js я познакомился дня два назад)
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
11.05.2020, 09:03 14
Halacky, да, получается нельзя туда-сюда конвертить строки(ну это было ожидаемо). Нужно хранить исходную строку. Т.е. первый раз когда вводите строку в utf-8 сохраните ее куда-нибудь. И только ее конвертите в нужную кодировку.

Добавлено через 5 минут
Вообще странное занятие Получается сконверченые строки показываться в приложении будут неверно(т.е. из них не получить исходную строку), т.к. выводятся они
как utf-8.
0
2 / 2 / 1
Регистрация: 24.11.2018
Сообщений: 130
11.05.2020, 09:11  [ТС] 15
Ну вот такое у нас задание дали, а главное методичку скинули, а там про то как сайт верстать
Я сделал скрипт для кодирования\декодирования из 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 16
Цитата Сообщение от Halacky Посмотреть сообщение
Я сделал скрипт для кодирования\декодирования из txt документа и все работает
Halacky, а в этом и прикол, что на файлах все будет нормально работать, так как нет лишних преобразований Может Вам нужно тестовые файлы конвертить, а не в текст в поле?
0
2 / 2 / 1
Регистрация: 24.11.2018
Сообщений: 130
11.05.2020, 09:21  [ТС] 17
Во, смотрите. Полностью задание.
Напишите приложение для выполнения под ОС Android, которое
переводит текст в одной кодировке (например win-1251) и записывает
содержимое в другой кодировке (например koi-8) и обратную задачу.
Приложение должно содержать текстовые поля для ввода, а также иметь
возможность загружать текстовый файл с текстом в исходной кодировке и
сохранять в текстовый файл переведенный текст на ваше мобильное
устройство.
0
11.05.2020, 09:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.05.2020, 09:21
Помогаю со студенческими работами здесь

Проблемы с кодировкой
Помогите пожалуйста. От php я ваще далекий(((, не могу справить с кодировкой. Вот сайт...

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

Проблемы с кодировкой
Есть парсер (плагин для Joomla). Парсирует такого рода .csv файлы сохраненные с помощью EXCEL...

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

Проблемы с кодировкой
Добрый день. Возникли проблемы с отображением моей вэб страницы в браузере-вместо кириллицы...

Проблемы с кодировкой
Добрый день. Вот столкнулся с проблемой кодировки. Сайт http://www.web-design.ho.ua/ В .htaccess...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru