如何使用 javascript 将字符串编码为 windows 1256

How to encode string into windows 1256 using javascript

我需要将阿拉伯字符串编码成windows1256格式

所以我找到了一种方法来将字符串从 windows 1256 解码为我的原始字符串我想要此代码的 reverse/opposite

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));

npm 上的 iconv 包声称可以这样做。这样的事情可能会奏效。

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.

这是使用 iconv silly Arabic phrase 到代码页 1256 并返回的往返转换示例。

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 表示具有大写的十六进制数字和前导 %,当然,这是您的应用程序特定的 URL 编码风格。您可以使用这样的函数将从 Iconv.convert() 获得的缓冲区转换为类似的字符串。

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