Como codificar texto como Base64 de UTF-16
- Digite ou cole o texto em Entrada · texto. O Charset já vem em UTF-16LE.
- Copie o Base64 de Saída · Base64. O número Entrada mostra a quantidade de bytes UTF-16, o dobro do comprimento de um texto simples em inglês.
- Para um consumidor big-endian, mude o Charset para UTF-16BE.
- Inverter decodifica o resultado de novo para uma conferência rápida; Base64 para UTF-16 é o decodificador dedicado.
UTF-16LE vs UTF-16BE
O UTF-16 guarda cada caractere como uma ou duas unidades de código de 16 bits. Little-endian escreve o byte menos significativo primeiro, big-endian o mais significativo. Windows e .NET usam little-endian; o codificador UTF-16 do Java e muitos formatos de rede usam big-endian.
| Texto | Bytes UTF-16LE | Base64 UTF-16LE | Base64 UTF-16BE |
|---|---|---|---|
Hi | 48 00 69 00 | SABpAA== | AEgAaQ== |
Hello | 10 bytes | SABlAGwAbABvAA== | AEgAZQBsAGwAbw== |
€ | AC 20 | rCA= | IKw= |
👋 | 3D D8 4B DC | PdhL3A== | 2D3cSw== |
Caracteres fora do Plano Multilíngue Básico, incluindo todos os emojis, ocupam duas unidades de código, chamadas de par substituto (surrogate pair). 👋 (U+1F44B) vira D83D DC4B, que são os 4 bytes da última linha.
Como cada letra ASCII vem acompanhada de um byte zero, o Base64 em UTF-16 de um texto em inglês fica salpicado de caracteres A. Vale a pena decodificar como UTF-16 uma string desconhecida com esse padrão.
Onde o Base64 de UTF-16 é usado
-EncodedCommanddo PowerShell.powershell -EncodedCommand RwBlAHQALQBEAGEAdABlAA==executaGet-Date. Um motivo frequente de falha desses comandos é um script codificado como UTF-8. A ferramenta PowerShell EncodedCommand adiciona o prefixo do comando, avisa sobre o limite de comprimento docmd.exee também decodifica comandos encontrados em logs.- Código .NET.
Encoding.Unicodeno C# é UTF-16LE, entãoConvert.ToBase64String(Encoding.Unicode.GetBytes(s))gera a mesma saída que esta página. - Dados do Windows. Strings do registro, de colunas
NVARCHARconvertidas para binário no SQL Server e de muitas APIs do Windows são UTF-16LE.
Byte order marks
Esta ferramenta não escreve byte order mark, que é o que o PowerShell e a maioria das APIs querem. Algumas bibliotecas adicionam um automaticamente:
| Origem | Primeiros bytes | Base64 de Hi |
|---|---|---|
| Esta ferramenta, UTF-16LE | 48 00 | SABpAA== |
Python "Hi".encode("utf-16") | FF FE 48 00 | //5IAGkA |
Java "Hi".getBytes(UTF_16) | FE FF 00 48 | /v8ASABp |
Se o seu Base64 precisa bater com um desses, codifique com uma ordem de bytes explícita no código, como abaixo.
UTF-16 para Base64 no código
import base64
base64.b64encode("Get-Date".encode("utf-16-le")).decode() # 'RwBlAHQALQBEAGEAdABlAA=='
base64.b64encode("Hi".encode("utf-16-be")).decode() # 'AEgAaQ=='
// Node.js has a little-endian codec only
Buffer.from("Get-Date", "utf16le").toString("base64"); // "RwBlAHQALQBEAGEAdABlAA=="
[Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes('Get-Date'))
No Python, use utf-16-le em vez de utf-16, a menos que você queira o BOM. Mais exemplos: Python, Node.js.
Perguntas frequentes
Por que o PowerShell precisa de Base64 em UTF-16LE?
O powershell -EncodedCommand espera o Base64 dos bytes UTF-16LE do script, porque é assim que o Windows guarda strings internamente. Um Base64 de UTF-8 decodifica para os caracteres errados e o comando falha. A ferramenta PowerShell EncodedCommand monta a linha de comando inteira.
Qual é a diferença entre UTF-16LE e UTF-16BE?
A ordem dos dois bytes em cada unidade de código. H é 48 00 em little-endian e 00 48 em big-endian, então Hi vira SABpAA== ou AEgAaQ==.
A saída vai começar com um byte order mark?
Não, só os bytes do próprio texto são codificados. O codec "utf-16" do Python e o charset UTF_16 do Java adicionam um, e é por isso que o Base64 deles começa com //5 ou /v8.
Por que o Base64 de UTF-16 é tão longo?
O UTF-16 usa pelo menos 2 bytes por caractere, então um texto em inglês dobra de tamanho antes de o Base64 somar o seu terço. Hello tem 8 caracteres Base64 em UTF-8 e 16 em UTF-16.