【问题标题】:Javascript C# Unicode Strings - headscratcherJavascript C# Unicode 字符串 - 头条新闻
【发布时间】:2012-03-07 23:17:13
【问题描述】:

如果我使用以下方法将 Javascript 中的 Bytearray 转换为字符串:

convertByteArrayToString: function(byteArray)
{
    var s = '';
    for(var i = 0;i < byteArray.length;i++)
            {
                    s += String.fromCharCode(byteArray[i])
            }
    return s;
},

然后如何在 C# 中将此字符串转换回字节数组?

我已经尝试了以下所有三种方法:

 System.Text.UnicodeEncoding encoding = new System.Text.UnicodeEncoding().GetBytes(myString);
 System.Text.UTF32Encoding encoding = new System.Text.UTF32Encoding().GetBytes(myString);
 System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding().GetBytes(myString);

最接近的是第一个,但它返回一个字节数组,该数组的长度是原始数组的两倍,数组中的每个其他元素都是 0,有时是一两个不正确的值。

据我所知,String.fromCharCode 在 Unicode 中工作,那么如何让它与 C# 互操作?

这让我发疯了!

编辑:

这是一个例子,

原始字节数组: [139、104、166、35、8、42、216、160、235、153、23、143、105、3、24、255]

我的函数将其转换为: "h¦#*Ø ëiÿ"

在 C# 中,尝试将此字符串解码为字节数组会产生以下结果:

使用 System.Text.UnicodeEncoding 给出: [142,0,139,0,104,0,166,0,35,0,8,0,42,0,216,0,32,0,235,0,153,0,23,0,143,0,105,0,30,24,0,255,0]

【问题讨论】:

  • 这不是“两倍的长度”。 C# 中的字符串是 little-endian UTF16,因此 30 个chars 的字符串长度为 60 个字节。最常见的字母数字字符低于 0xFF,因此第二个(更重要的)字节为 0。
  • 重新标记,编码不是加密。 Unicode 字符点可以进行字符编码,例如使用 UTF-8 或 UTF-16。编码是编码数据的方法(通常隐含字节),例如Base-64 或十六进制。加密是一种创建机密性的方法,例如AES。

标签: c# javascript string unicode encoding


【解决方案1】:

crypto-js 具有 Crypto.charenc.UTF8.stringToBytes()Crypto.charenc.UTF8.bytesToString(),它们与 C# 中的 UTF-8 编码完美搭配。

编辑

经过讨论,事实证明,OP 希望将 byte[] 从 JS 传输到 C# - 这最好通过 base64 编码完成(我推荐相同的 JS 工具包)

【讨论】:

  • 这意味着您的字节数组不是有效的 UTF8 字符串。也许这个问题应该换个方式问:你想将byte[] 从 JS 传输到 C# 吗?如果是这样,不要通过字符串,通过base64(crypto-js也是),我们一直这样做是为了加密密码,所以我猜它有效;-)
  • “不要通过字符串,通过 base64(crypto-js 也可以)” - 辛苦了,谢谢
猜你喜欢
  • 2019-05-12
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多