我正在尝试将字符串转换为BASE64和utf-16 Big Endian的字符集,以便使用短信API发送该字符串。
我无法使用Javascript执行此操作。
这是我想在短信中发送的原始js字符串:
const originalString = 'Teste 5% áàÁÀ éèÉÈ íìÍÌ óòÓÒ úùÚÙ çÇ ãà ?!,;';
使用btoa(originalString)
我得到的不是我需要的VGVzdGUgNSUyNSDh4MHAIOnoycgg7ezNzCDz8tPSIPr52tkg58cg48MgPyEsOw==
...我为此目的使用了在线转换器,这是正确的值:
AFQAZQBzAHQAZQAgADUAJQAgAOEA4ADBAMAAIADpAOgAyQDIACAA7QDsAM0AzAAgAPMA8gDTANIAIAD6APkA2gDZACAA5wDHACAA4wDDACAAPwAhACwAOw==
我测试了发送短信并正常运行。
这并不容易,因为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
注意:此答案假定为Little-Endian系统,我无权访问BE,也无法确定String.charCodeAt
在此的行为。如果您知道,请在评论中让我知道。
要获取字符串的UTF-16版本,我们需要将其所有字符映射到其charCodeAt(0)
值。从那里,我们可以构建一个包含UTF-16LE文本文件的Uint16Array。我们只需要交换Uint16Array中的所有项目即可获得UTF-16BE版本。
然后将其编码为base64。
charCodeAt(0)