Base64 UTF-16BE的Java脚本字符串

问题描述 投票:1回答:2

我正在尝试将字符串转换为BASE64和utf-16 Big Endian的字符集,以便使用短信API发送该字符串。

我无法使用Javascript执行此操作。

这是我想在短信中发送的原始js字符串:

const originalString = 'Teste 5% áàÁÀ éèÉÈ íìÍÌ óòÓÒ úùÚÙ çÇ ãà ?!,;';

使用btoa(originalString)我得到的不是我需要的VGVzdGUgNSUyNSDh4MHAIOnoycgg7ezNzCDz8tPSIPr52tkg58cg48MgPyEsOw== ...我为此目的使用了在线转换器,这是正确的值:

AFQAZQBzAHQAZQAgADUAJQAgAOEA4ADBAMAAIADpAOgAyQDIACAA7QDsAM0AzAAgAPMA8gDTANIAIAD6APkA2gDZACAA5wDHACAA4wDDACAAPwAhACwAOw==

我测试了发送短信并正常运行。

javascript base64 utf-16 utf-16le
2个回答
0
投票

这并不容易,因为javascript中的UTF16BE编码几乎没有支持。

挑战是将字符串转换为字节缓冲区;一旦将其保存在缓冲区中,将其轻松转换为base64即可。一种方法是使用库来添加对UTF16BE的支持,例如iconv-lite。

这是您可以在节点上运行的示例:

const iconv = require('iconv-lite');
const originalString = 'Teste 5% áàÁÀ éèÉÈ íìÍÌ óòÓÒ úùÚÙ çÇ ãà ?!,;';
const buffer = iconv.encode(originalString, 'utf16be');
console.log(buffer.toString('base64'));

您可以在此处查看其演示:https://repl.it/@RobBrander/SelfishForkedAlphatest

此外,这也是UTF16BE的base64编码的很好解释:https://crawshaw.io/blog/utf7


0
投票

注意:此答案假定为Little-Endian系统,我无权访问BE,也无法确定String.charCodeAt在此的行为。如果您知道,请在评论中让我知道。


要获取字符串的UTF-16版本,我们需要将其所有字符映射到其charCodeAt(0)值。从那里,我们可以构建一个包含UTF-16LE文本文件的Uint16Array。我们只需要交换Uint16Array中的所有项目即可获得UTF-16BE版本。

然后将其编码为base64。

charCodeAt(0)
© www.soinside.com 2019 - 2024. All rights reserved.