una - Manipular el conjunto de caracteres ASCII y unicode en C#
encoding c# (2)
Tengo este mapeo en mi aplicación C #
string [,] unicode2Ascii = { { "ஹ", "/x86" } };
ஹ - es el valor unicode para un literal tamil "ஹ". Este es el literal hexadecimal en bruto para el valor unicode guardado por MS Word como una secuencia de bytes. Estoy tratando de asignar estas "cadenas" de valor unicode a un valor hexadecimal por debajo de 255 (para acomodar sistemas que no sean Unicode).
Estoy tratando de usar string.replace así:
S = S.replace(unicode2Ascii[0,0], unicode2Ascii[0,1]);
Sin embargo, la salida resultante tiene un? en lugar del hex real 0x86 almacenado. ¿Algún puntero sobre cómo podría establecer la codificación para el segundo elemento de esa matriz en algo así como windows-1252?
¿O hay una mejor manera de hacer esta conversión?
gracias por adelantado
Las cadenas en .NET siempre son Unicode internamente. Sin embargo, esto realmente no importa. Las cadenas son una serie en caracteres y .NET Strings admite todos los caracteres Unicode. No debería importar cómo se presentan en la memoria. Le importa codificar solo cuando sus cadenas se van (o ingresan) .NET (es decir, cuando las escribe (lee) en archivos, las envía (recibe) a otros sistemas, etc.). Aquí es cuando usa la clase de Codificación para convertir a la codificación que desee. Reemplazar caracteres o intentar cualquier trucos de codificación en cadenas .NET no tiene sentido. También recomiendo este artículo http://www.joelonsoftware.com/articles/Unicode.html
No estoy seguro de si esto ayuda, pero la página de códigos Tamil "57004 - ISCII Tamil" es compatible con Windows.
Sin embargo, no da la misma traducción para el personaje de ejemplo anterior. Para ''ஹ'' da 216. ¿Se debe usar una página de códigos diferente?
string tamilUnicodeString = "ஹ";
Encoding encoding = Encoding.GetEncoding("x-iscii-ta");
byte[] codepageBytes = encoding.GetBytes(tamilUnicodeString);
Actualizar
Si desea tomar un archivo Unicode como entrada, transcribir caracteres para obtener una representación de un solo byte, lo siguiente debería ser el truco. La matriz resultante debe tener su representación de un solo byte si su diccionario codifica cada carácter:
Dictionary<char, char> lookup = new Dictionary<char, char>
{
{ ''ஹ'', ''/x86'' },
{ ''இ'', ''/x87'' },
//next pair...,
//etc, etc.
};
string input = "ஹஇதில் உள்ள தமிழ் எழுத்துக்கள் சரியாகத் தெரிந்தால்";
char[] chars = input.ToCharArray();
for (int i = 0; i < chars.Length; i++)
{
char replaceChar;
if (lookup.TryGetValue(chars[i], out replaceChar))
{
chars[i] = replaceChar;
}
}
byte[] output = Encoding.GetEncoding("iso-8859-1").GetBytes(chars);