繁体   English   中英

JavaScript编码会破坏并组合多字节字符?

[英]Javascript encoding breaking & combining multibyte characters?

我打算为我的Web应用程序使用客户端AES加密。

现在,我一直在寻找将多字节字符分解为一个字节的方法,即“非字符”,加密(具有相同的加密文本长度),

将它们解密,然后将那些一字节的“非字符”转换回多字节字符。

我看过有关UTF-8(据说是JS的默认编码?)和UTF-16的Wiki,但是我不知道如何检测“碎片化”多字节字符以及如何将它们组合回去。

谢谢 : )

JavaScript字符串是UTF-16,存储在16位“字符”中。 对于需要超过16位的Unicode字符(“代码点”)(某些代码点在UTF-16中需要32位),每个JavaScript“字符”实际上仅是代码点的一半。

因此,要将“ JavaScript”字符“分解”为字节,只需获取字符代码并将高字节和低字节分开即可:

var code = str.charCodeAt(0); // The first character, obviously you'll have a loop
var lowbyte = code & 0xFF;
var highbyte = (code & 0xFF00) >> 8;

(即使JavaScript的数字是浮点数,按位运算符也可以使用32位整数,当然,在我们的情况下,这些位中只有16位是相关的。)

您永远不会有奇数个字节,因为这又是UTF-16。

您可以简单地转换为UTF8 ...例如,使用此技巧

function encode_utf8(s) {
  return unescape(encodeURIComponent(s));
}

function decode_utf8(s) {
  return decodeURIComponent(escape(s));
}

考虑到您使用的是crypto-js ,可以使用其方法转换为utf8并返回到字符串。 这里

var words = CryptoJS.enc.Utf8.parse('𤭢');
var utf8  = CryptoJS.enc.Utf8.stringify(words);

probably可能是Utf8字符的拙劣示例。

通过查看其他示例(请参见Latin1示例),我会说,通过parse您可以将字符串转换为Utf8(从技术上讲,您可以将其转换为Utf8并放入WordArray类型的crypto-js使用的特殊数组)中,结果可以传递给Aes编码算法,并通过stringify将WordArray(例如通过解码算法获得)转换为Utf8。

JsFiddle示例: http : //jsfiddle.net/UpJRm/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM