¿Es posible simplificar este código en una forma más limpia/más rápida?¿Podemos simplificar este código de codificación de cadena
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.
Ver http://unicodelookup.com/#0x9106/1
Modificada 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 este conjunto de bytes en caracteres individuales, tenemos 224 = e0 = à y 105 = 69 = i en Unicode.
Ver http://unicodelookup.com/#0x00e0/1 y http://unicodelookup.com/#0x0069/1
Por lo tanto, estamos haciendo una conversión de codificación y asegurar que todos los personajes de nuestra cadena Unicode de salida pueden ser representados usando un máximo de dos bytes.
Actualización: Necesito esta representación final porque este es el formato que acepta mi impresora de recibos. Me tomó para siempre para resolverlo! :) Como no soy un experto en codificación, estoy buscando un código más simple o más rápido, pero el resultado debe seguir siendo el mismo.
actualización (versión limpia):
return Encoding.GetEncoding("ISO-8859-1").GetString(Encoding.GetEncoding(936).GetBytes(text));
Supongo que su impresora de recibos no acepta cadenas .NET, entonces, ¿qué está enviando exactamente a la impresora de recibos? Blobs de texto? Si es así, todo el texto se codifica a través del cable, por lo que hay una buena posibilidad de que haya alguna codificación oculta pasando más adelante en el proceso; podría ser más fácil encontrar la "mejor" solución si estuviera claro * cómo * te estás comunicando con la impresora. –
Estoy usando POS para .NET ... acepta cadenas y funcionó bien siempre y cuando permanezca en CodePage 1252 ... pero cambiar a 936 causó problemas, lo que se debe a la forma en que esta impresora específica reconoce estos caracteres. –
A menudo es más rápido asignar una matriz de caracteres, usar un bucle for para asignarlo y luego usar el constructor de cadena para convertirlo en una cadena, en lugar de anexar una cadena carácter por carácter. – Brian