在JavaScript中将字符串编码为UTF-16并转换为Base64

3

我很难在网上找到任何相关资源,这让我感到担忧。我一直在阅读有关UCS-2和UTF-16的问题,但是我找不到解决方案。

我需要从输入框中获取一个值:

var val = $('input').val()

将文本视为utf-16,对其进行base64编码,因此:

this is a test

变成:

dABoAGkAcwAgAGkAcwAgAGEAIAB0AGUAcwB0AA==

而不是将它视为UTF-8处理时所得到的以下内容:
dGhpcyBpcyBhIHRlc3Q=

什么问题?如何生成与UTF-8相同的内容?我想不是这个问题。 - Alexander
1个回答

1
一旦将数据读入JavaScript,它将以无编码数字格式存在(严格来说,它必须是Unicode规范化形式C,但Unicode只是Unicode词典中每个字形的识别数字系列。它是无编码的)。所以:如果您特别需要数据编码为UTF-16字节序列,请这样做,然后对其进行base64编码。
但这里有趣的部分是:您需要哪种UTF-16?小端还是大端?带BOM还是不带?UTF-16是一种非常不方便的编码格式(我们甚至不会触及UCS-2。它已经过时了。已经很久了)。
你真正需要的是从HTML元素获取文本值,Base64编码其值,然后让任何接收该数据的人解包成UTF8;不要让JavaScript做更多的工作。我假设您正在将此数据发送到服务器或其他地方,在这种情况下:您的服务器语言比JavaScript复杂得多,并且可以通过内置函数以约一百万种不同的编码方式解压缩文本。所以就用那个吧。不要为X解决Y

我需要接受高位字符(如中文字符)。UTF-8 能处理吗? - Andrew Bullock
UTF8是Unicode的一种编码方式,而不是“其中的一部分”,所以它可以很好地处理它。这就是它的设计目的=)有趣的事实是:UTF16和UTF32每个字符使用16位和32位。UTF8并不是每个字符使用8位,而是使用“尽可能多的8位块”。 - Mike 'Pomax' Kamermans
1
你真正需要的是从HTML元素中获取文本值,对其进行Base64编码。你不能直接对文本进行Base64编码,必须将其隐式编码为字节数组。首先,您必须选择一种字节编码方式来处理Unicode字符(例如UTF8、UTF16等)。一旦将所有字符编码为字节数组,然后再对其进行Base64编码。 - Triynko
作为对此的更正,您可以对任何字节序列进行base64编码,包括文本。这可以通过打开控制台并键入btoa("cats")或甚至btoa(3)来轻松检查。由于这些输入只是字节,以及您认为它们是什么,它们将被正确地进行base64编码。唯一真正重要的是接收方知道原始数据使用的编码方式,以便稍后执行正确的操作(仅在需要非UTF8数据源时才需要)。 - Mike 'Pomax' Kamermans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接