Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.02.2021, 16:53
Новичок на форуме
Отправить личное сообщение для repulsor Посмотреть профиль Найти все сообщения от repulsor
 
Регистрация: 19.02.2021
Сообщений: 9

Как получить код символа в нужной кодировке?
Здравствуйте.

Нужно нативными средствами (то есть, без костылей) получить код символа в нужной кодировке, например, CP866.

Проблема в том, что в JS есть подходящая функция (TextEncoder), но она, в отличии от своей обратной функции (TextDecoder), не принимает параметр с кодировкой, и такое:
let encoder = new TextEncoder('ibm866');
let uint8Array = encoder.encode('А');
console.log(uint8Array);


Дает не: Uint8Array [ 128 ], а: Uint8Array [ 208, 144 ], так как используется UTF-8.

Можно конечно сделать массив, и оттуда получать эти символы, но по некоторым причинам, это не желательно

Если кто-то сможет подсказать, как это можно реализовать, буду очень признателен
Ответить с цитированием
  #2 (permalink)  
Старый 19.02.2021, 19:33
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,704

Никак. Ручками перекодировать. Таблицу делать. Обходя всякие препоны.
https://javascript.ru/forum/ajax/815...rchparams.html
Ответить с цитированием
  #3 (permalink)  
Старый 19.02.2021, 21:51
Новичок на форуме
Отправить личное сообщение для repulsor Посмотреть профиль Найти все сообщения от repulsor
 
Регистрация: 19.02.2021
Сообщений: 9

voraa, я так не играю...

Значит развели over 9000 этих кодовых таблиц, а теперь простым трудягам в ручную писать?

У TextDecoder почему-то есть указание кодировки, что им было сложно добавить обратный алгоритм в TextEncoder?

В одной функции у них стандарт UTF-8, в другой UTF-16 (charCodeAt), что дальше? Такими темпами не то, что костыли или велосипеды писать нужно, а уже заводское производство их запускать
Ответить с цитированием
  #4 (permalink)  
Старый 19.02.2021, 22:06
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

Неверно - везде utf8:
alert([
'A'.charCodeAt(0),
'A'.codePointAt(0)
].join('\n'))


А вот на счёт TextEncoder согласен. Изначально в стандарте он как раз поддерживал любую кодировку, но у текущих товарищей у руля стандарта мания принудительного навязывания utf8, потому всё иное выпиливают со страшной силой. Тот же fetch из коробки уже не умеет ничего кроме utf8. Очевидно, что внутри браузера всё нужное для конвертации в любую сторону есть, но из-за такой политики приходится тащить кучу мусорного дублирующего кода.
__________________
29375, 35
Ответить с цитированием
  #5 (permalink)  
Старый 19.02.2021, 22:27
Новичок на форуме
Отправить личное сообщение для repulsor Посмотреть профиль Найти все сообщения от repulsor
 
Регистрация: 19.02.2021
Сообщений: 9

Сообщение от Aetae Посмотреть сообщение
Неверно - везде utf8:
alert([
'A'.charCodeAt(0),
'A'.codePointAt(0)
].join('\n'))

Aetae, попробуйте вернуть код русской А, результат 1040, а не 53392 (Hex: D0 90), это UTF-16, насколько я помню, или нет?

Сообщение от Aetae Посмотреть сообщение
А вот на счёт TextEncoder согласен. Изначально в стандарте он как раз поддерживал любую кодировку
Можете подсказать когда убрали? Я вот не нашел версию, чтобы работало с кодировкой

Последний раз редактировалось repulsor, 19.02.2021 в 22:33.
Ответить с цитированием
  #6 (permalink)  
Старый 19.02.2021, 22:50
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

Сообщение от repulsor Посмотреть сообщение
Можете подсказать когда убрали? Я вот не нашел версию, чтобы работало с кодировкой
Х.з. мб в nightly каких-то версий фокса было. Я об этих штуках первый раз читал когда они были в статусе предложения и тогда там всё было, а когда спустя n лет оно мне понадобилось - уже ничего не было.

А по поводу charCodeAt - вы правы, а я не прав.

..upd:
Цитата:
Note: Prior to Firefox 48 and Chrome 53, an encoding type label was accepted as a paramer to the TextEncoder object
__________________
29375, 35

Последний раз редактировалось Aetae, 19.02.2021 в 22:53.
Ответить с цитированием
  #7 (permalink)  
Старый 19.02.2021, 22:56
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,704

Сообщение от repulsor
У TextDecoder почему-то есть указание кодировки, что им было сложно добавить обратный алгоритм в TextEncoder?
Разумеется сложно.
TextDecoder переводит из каких то кодировок в Юникод в кодировку UTF16, в которой хранятся строки в javascript.
Теперь представьте, что любую строку из javascript мы захотим преобразовать в CP866, win1251 и проч. Что делать с китайскими иероглифами? С греческими буквами?
Ответить с цитированием
  #8 (permalink)  
Старый 19.02.2021, 23:28
Новичок на форуме
Отправить личное сообщение для repulsor Посмотреть профиль Найти все сообщения от repulsor
 
Регистрация: 19.02.2021
Сообщений: 9

Сообщение от Aetae Посмотреть сообщение
..upd:
Aetae, читал, да. В Chrome правда все равно не получилось, посмотрю еще в более младшей версии.

voraa, ну правильно, я же говорю, давайте будем сами делать костыли-велосипеды... То из 16 в 8, то еще куда-то... Они там сверху не могут порой по n лет что-то исправить (а скорее, не хотят). Зато фреймворки выходят со скоростью света

P. S. Не сочтите за личное просто так уже задолбало, то с Canvas, то с формами, то еще с чем-то.
Ответить с цитированием
  #9 (permalink)  
Старый 19.02.2021, 23:52
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,704

Сообщение от repulsor
То из 16 в 8, то еще куда-то..
Ну с этим то как раз все ясно.
Javascript работает в Юникоде. Есть три основных способа кодирования символов в Юникоде. UTF32- самый универсальный, простой и быстрый. Но жрет много памяти. UTF8 - универсальный, памяти в большинстве случаев занимает меньше, но на компьютере обрабатывается медленнее. Ну и UTF16 - Не достаточно универсален (не все символы можно представить) но вполне удовлетворителен по памяти и времени)
Сообщение от repulsor
Они там сверху не могут порой по n лет что-то исправить (а скорее, не хотят)
Не думаю. Просто нет хорошего, устраивающего всех решения
Ну вот надо строку в win1251 перевести, а в строке иероглиф. Что делать? Выбрасывать исключение? Заменять каким то кодом? (в Win1251 все коды заняты)
Ответить с цитированием
  #10 (permalink)  
Старый 20.02.2021, 00:09
Новичок на форуме
Отправить личное сообщение для repulsor Посмотреть профиль Найти все сообщения от repulsor
 
Регистрация: 19.02.2021
Сообщений: 9

Сообщение от voraa Посмотреть сообщение
Ну вот надо строку в win1251 перевести, а в строке иероглиф. Что делать? Выбрасывать исключение? Заменять каким то кодом? (в Win1251 все коды заняты)
voraa, ну как всегда, пишем параметр options, с флагом по умолчанию ignore, а там уже по желаю: показывать сообщение об ошибке, заменить на указанный символ.

В конце концов, JS один из самых гибких языков.

Сейчас вот даже вопрос с генерацией таблицы в CP866 не так однозначен, нужно подумать, как лучше сделать
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как найти и заменить код скрипта на странице на другой код? smls Общие вопросы Javascript 2 18.07.2016 22:01
initComponent: Как получить данные родителя и как получить store для вызова load()? Пролетарий ExtJS 76 04.07.2015 09:22
Как получить ID в теге IMG oslayer Элементы интерфейса 2 05.04.2015 10:23
Как получить значение с помощью JavaScript? griga999 Общие вопросы Javascript 2 22.02.2015 01:57
Как писать код который легко поддерживать, расширять, читать. Policeman Общие вопросы Javascript 3 24.03.2012 05:40