如何使用JavaScript将阿拉伯字符串编码为Windows-1256格式
实现Windows-1256字符串编码函数(对应你的解码函数反向)
你的解码函数是把URL编码格式的Windows-1256字节串转成原始字符串,反向的编码逻辑需要完成两个核心步骤:把字符串转成Windows-1256编码的字节数组,再将每个字节转换成%XX格式的URL编码(同时把空格替换成+,对应你解码时的split('+')处理)。
因为JavaScript原生的TextEncoder只支持UTF-8,所以我们需要通过Blob API来实现Windows-1256的编码转换。下面提供两种实现方式:
同步编码函数(适用于Worker或允许同步IO的场景)
function encode(str) { // 将字符串转换为Windows-1256编码的ArrayBuffer const blob = new Blob([str], { type: 'text/plain; charset=windows-1256' }); const reader = new FileReaderSync(); const buffer = reader.readAsArrayBuffer(blob); const uint8Array = new Uint8Array(buffer); // 将每个字节转换为%XX格式的十六进制字符串(大写) const encodedSegments = Array.from(uint8Array).map(byte => `%${byte.toString(16).padStart(2, '0').toUpperCase()}` ); // 把空格对应的%20替换为+,匹配你解码时的处理逻辑 return encodedSegments.join('').replace(/%20/g, '+'); }
异步编码函数(适用于浏览器主线程)
如果在浏览器主线程中使用,FileReaderSync会阻塞主线程,更推荐异步版本:
async function encode(str) { const blob = new Blob([str], { type: 'text/plain; charset=windows-1256' }); const buffer = await blob.arrayBuffer(); const uint8Array = new Uint8Array(buffer); const encodedSegments = Array.from(uint8Array).map(byte => `%${byte.toString(16).padStart(2, '0').toUpperCase()}` ); return encodedSegments.join('').replace(/%20/g, '+'); }
测试验证
你可以用你的解码函数反向测试:
// 测试单个字符串 const originalStr = decode('%E3%CD%E3%CF'); console.log(encode(originalStr)); // 应该输出 %E3%CD%E3%CF // 测试带空格的字符串数组 const decodedArr = '%C7%E1%DA%E1%E6%E3+%2D%CA%DA%E1%ED%E3+%C7%D3%C7%D3%EC'.split('+').map(decode); // 异步版本需要用await (async () => { const encodedStr = (await Promise.all(decodedArr.map(encode))).join('+'); console.log(encodedStr); // 应该输出原字符串 %C7%E1%DA%E1%E6%E3+%2D%CA%DA%E1%ED%E3+%C7%D3%C7%D3%EC })();
注意事项
- 这个实现依赖浏览器环境的
Blob和FileReaderAPI,如果是Node.js环境,需要用iconv-lite之类的库来处理Windows-1256编码(Node.js原生不支持该编码)。 - 确保输入的字符串是有效的Unicode字符串,这样才能正确转换为Windows-1256编码(Windows-1256覆盖了阿拉伯语字符集,大部分常用阿拉伯字符都能正确转换)。
内容的提问来源于stack exchange,提问作者hesham shawky
相关产品推荐
相关产品推荐

