Cómo codificar texto como Base64 UTF-16
- Escribe o pega tu texto en Entrada · texto. Juego de caracteres viene ajustado a UTF-16LE.
- Copia el Base64 de Salida · Base64. La cifra Entrada muestra el número de bytes UTF-16, el doble de la longitud de un texto inglés normal.
- Para un consumidor big-endian, cambia Juego de caracteres a UTF-16BE.
- Intercambiar vuelve a decodificar el resultado para una comprobación rápida; Base64 a UTF-16 es el decodificador específico.
UTF-16LE frente a UTF-16BE
UTF-16 guarda cada carácter como una o dos unidades de código de 16 bits. Little-endian escribe primero el byte bajo; big-endian, primero el alto. Windows y .NET usan little-endian; el codificador UTF-16 de Java y muchos formatos de red usan 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== |
Los caracteres fuera del plano multilingüe básico, incluidos todos los emoji, ocupan dos unidades de código llamadas par sustituto. 👋 (U+1F44B) se convierte en D83D DC4B, que son los 4 bytes de la última fila.
Como cada letra ASCII va emparejada con un byte cero, el Base64 UTF-16 de un texto en inglés está salpicado de caracteres A. Vale la pena decodificar como UTF-16 una cadena desconocida con ese patrón.
Dónde se usa Base64 de UTF-16
-EncodedCommandde PowerShell.powershell -EncodedCommand RwBlAHQALQBEAGEAdABlAA==ejecutaGet-Date. Un motivo frecuente por el que estos comandos fallan es un script codificado como UTF-8. La herramienta PowerShell EncodedCommand añade el prefijo del comando, avisa del límite de longitud decmd.exey también decodifica comandos encontrados en logs.- Código .NET.
Encoding.Unicodeen C# es UTF-16LE, así queConvert.ToBase64String(Encoding.Unicode.GetBytes(s))produce la misma salida que esta página. - Datos de Windows. Las cadenas del registro, de columnas
NVARCHARconvertidas a binario en SQL Server y de muchas API de Windows son UTF-16LE.
Marcas de orden de bytes
Esta herramienta no escribe marca de orden de bytes, que es lo que quieren PowerShell y la mayoría de las API. Algunas bibliotecas añaden una automáticamente:
| Origen | Primeros bytes | Base64 de Hi |
|---|---|---|
| Esta herramienta, 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 |
Si tu Base64 tiene que coincidir con alguno de ellos, codifica en el código con un orden de bytes explícito, como se ve abajo.
UTF-16 a Base64 en 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'))
En Python usa utf-16-le en lugar de utf-16 salvo que quieras la BOM. Más ejemplos: Python, Node.js.
Preguntas frecuentes
¿Por qué PowerShell necesita Base64 en UTF-16LE?
powershell -EncodedCommand espera el Base64 de los bytes UTF-16LE del script, porque así guarda Windows las cadenas internamente. El Base64 de UTF-8 se decodifica en caracteres incorrectos y el comando falla. La herramienta PowerShell EncodedCommand genera la línea de comandos completa.
¿Qué diferencia hay entre UTF-16LE y UTF-16BE?
El orden de los dos bytes de cada unidad de código. H es 48 00 en little-endian y 00 48 en big-endian, así que Hi se codifica como SABpAA== o AEgAaQ==.
¿La salida empieza con una marca de orden de bytes?
No, solo se codifican los bytes del propio texto. El códec "utf-16" de Python y el charset UTF_16 de Java sí añaden una, y por eso su Base64 empieza por //5 o /v8.
¿Por qué el Base64 de UTF-16 es tan largo?
UTF-16 usa al menos 2 bytes por carácter, así que el texto en inglés duplica su tamaño antes de que Base64 añada su tercio. Hello son 8 caracteres Base64 en UTF-8 y 16 en UTF-16.