Как кодировать строку в windows 1256, используя javascript - PullRequest
1 голос
/ 28 февраля 2020

Мне нужно закодировать строку Arabi c в windows 1256 формате

Итак, я нашел способ декодировать строку из windows 1256 в мою исходную строку. этот код

function decode(string) {
  var array = [...string.matchAll(/%(.{2})/g)].map((groups) => parseInt(groups[1], 16));
  var decoder = new TextDecoder('windows-1256');
  return decoder.decode(Uint8Array.from(array).buffer);
}
console.log(decode('%E3%CD%E3%CF'));
console.log('%C7%E1%DA%E1%E6%E3+%2D%CA%DA%E1%ED%E3+%C7%D3%C7%D3%EC'.split('+').map(decode));

1 Ответ

1 голос
/ 28 февраля 2020

Пакет iconv на npm утверждает, что делает это Нечто подобное, вероятно, будет работать.

const Iconv = require('iconv').Iconv;

const utfToArabic = new Iconv('UTF-8', 'CP1256');
const arabic = utfToArabic.convert(string);

Вы можете, в зависимости от содержимого вашей входной строки, лучше указать 'CP1256//TRANSLIT//IGNORE' вместо 'CP1256'. Это заставляет iconv пытаться транслитерировать, а затем игнорировать символы во входной строке UTF-8, которые не соответствуют вашей кодовой странице.

В Javascript, все значения string, без исключения, закодированы в utf-8. Другие кодировки обрабатываются как буферы. Если это не utf-8, это не string.

Вот пример преобразования туда и обратно глупой арабской c фразы в кодовую страницу 1256 и обратно, используя iconv .

const Iconv = require('iconv').Iconv;
const eatGlass = 'أنا قادر على أكل الزجاج و هذا لا يؤلمني'
console.log (eatGlass, eatGlass.length)
const utfToArabic = new Iconv('UTF-8', 'CP1256')
const arabicToUtf = new Iconv('CP1256', 'UTF-8')
try {
  const arabic = utfToArabic.convert(eatGlass)
  console.log(arabic, arabic.length)
  const s = arabicToUtf.convert(arabic).toString()
  console.log (s, s.length)
}
catch (err) {
  console.log(err)
}

Этот фрагмент кода производит этот вывод.

أنا قادر على أكل الزجاج و هذا لا يؤلمني 39
<Buffer c3 e4 c7 20 de c7 cf d1 20 da e1 ec 20 c3 df e1 20 c7 e1 d2 cc c7 cc 20 e6 20 e5 d0 c7 20 e1 c7 20 ed c4 e1 e3 e4 ed> 39
أنا قادر على أكل الزجاج و هذا لا يؤلمني 39

Ваше представление %C3%E4%C7+%DE%C7%CF%D1+%DA имеет шестнадцатеричные цифры в верхнем регистре и ведущие % s. Это, конечно, разновидность Кодировка URL указывается c для вашего приложения. Вы можете преобразовать полученный из Iconv.convert() буфер в строку, подобную этой, с помощью функции, подобной этой.

function toHexStringWithMarker (buf, marker = '%' ) {
  const a = []
  buf.forEach(c => a.push(c === 0x20 ? '+' : marker + c.toString(16).toUpperCase()))
  return a.join('')
}
...