¿Podemos simplificar este código de codificación de cadena?
¿Es posible simplificar este código en una forma más limpia / más rápida?
StringBuilder builder = new StringBuilder();
var encoding = Encoding.GetEncoding(936);
// convert the text into a byte array
byte[] source = Encoding.Unicode.GetBytes(text);
// convert that byte array to the new codepage.
byte[] converted = Encoding.Convert(Encoding.Unicode, encoding, source);
// take multi-byte characters and encode them as separate ascii characters
foreach (byte b in converted)
builder.Append((char)b);
// return the result
string result = builder.ToString();
En pocas palabras, toma una cadena con caracteres chinos como 鄆 y los convierte a ài.
Por ejemplo, ese carácter chino en decimal es 37126 o 0x9106 en hexadecimal.
Verhttp://unicodelookup.com/#0x9106/1
Convertidos a una matriz de bytes, obtenemos [145, 6] (145 * 256 + 6 = 37126). Cuando se codifica en CodePage 936 (chino simplificado), obtenemos [224, 105]. Si dividimos esta matriz de bytes en caracteres individuales, tenemos 224 = e0 = à y 105 = 69 = i en Unicode.
Verhttp://unicodelookup.com/#0x00e0/1 yhttp://unicodelookup.com/#0x0069/1
Por lo tanto, estamos haciendo una conversión de codificación y asegurando que todos los caracteres en nuestra cadena de salida Unicode puedan representarse utilizando a lo más dos bytes.
Actualización: Necesito esta representación final porque este es el formato que está aceptando mi impresora de recibos. ¡Me llevó una eternidad para averiguarlo! :) Como no soy un experto en codificación, estoy buscando un código más simple o más rápido, pero la salida debe seguir siendo la misma.
Actualización (versión más limpia):
return Encoding.GetEncoding("ISO-8859-1").GetString(Encoding.GetEncoding(936).GetBytes(text));