Primero: si tienes un objeto String
, entonces ya no tiene una codificación, ¡es una cadena Unicode pura (*)!
En Java, se utilizan codificaciones sólo se al convertir de bytes (byte[]
) a una cadena (String
) o viceversa. (En teoría, podría hacer una conversión directa de byte[]
a byte[]
pero aún no lo he visto en Java).
Si tiene algunos datos CP1251 codificado, entonces debe ser un byte[]
(es decir, una matriz de bytes) o en algún tipo de corriente (por ejemplo proporcionado a usted como un InputStream
).
Si desea proporcionar algunos datos como CP866, a continuación, usted debe proporcionar ya sea como un byte[]
o como una especie de corriente (por ejemplo, un `OutputStream).
Además, no existe la frase "utf8/cp1251". UTF-8 y CP-1251 son codificaciones de caracteres no relacionadas. Su entrada es UTF-8 o CP-1251 (o algo más). Realmente no puede ser ambos (+).
Y aquí está el vínculo obligatorio: The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
(*) sí, en sentido estricto tiene una codificación y es UTF-16, pero para la mayoría de los propósitos que puede (y debe) pensar en él como un "encodingless ideales cadena Unicode"
(+) en sentido estricto, que podría ser tanto si sólo se está utilizando caracteres que codifican para los mismos bytes en ambas codificaciones, que suele ser el subconjunto ASCII
¿Qué espera? Está codificando "Николай" usando UTF-8, luego decodificando los bytes codificados usando Cp866. La salida me parece razonable, pero obviamente esperas que ocurra alguna otra magia. – jarnbjo