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



我需要将阿拉伯字符串编码为windows 1256格式的

所以我找到了一种方法来解码一个字符串从窗口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));

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将一个愚蠢的阿拉伯语短语来回转换为代码页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表示具有大写十六进制数字和前导%s,当然,它是特定于您的应用程序的URL编码风格。您可以使用这样的函数将从Iconv.convert()获得的缓冲区转换为这样的字符串。

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

最新更新