Como dice en la línea del encabezado, quiero convertir caracteres zenkaku en hankaku y vice-vrsa en C#, pero no puedo encontrar la manera de hacerlo. Entonces, diga "ラ ー メ to" a "ラ ー メ ン" y viceversa. ¿Sería posible escribir esto en un método que determine automáticamente en qué dirección debe ir la conversión, en función del formato de la entrada?Conversión de caracteres zenkaku a hankaku y viceversa en C#
Respuesta
Usted puede utilizar el método Strings.StrConv() mediante la inclusión de una referencia a Microsoft.VisualBasic.dll, o puede p/invocar la función nativa LCMapString():
private const uint LOCALE_SYSTEM_DEFAULT = 0x0800;
private const uint LCMAP_HALFWIDTH = 0x00400000;
public static string ToHalfWidth(string fullWidth)
{
StringBuilder sb = new StringBuilder(256);
LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_HALFWIDTH, fullWidth, -1, sb, sb.Capacity);
return sb.ToString();
}
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
private static extern int LCMapString(uint Locale, uint dwMapFlags, string lpSrcStr, int cchSrc, StringBuilder lpDestStr, int cchDest);
y puedes también haga lo contrario:
private const uint LCMAP_FULLWIDTH = 0x00800000;
public static string ToFullWidth(string halfWidth)
{
StringBuilder sb = new StringBuilder(256);
LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_FULLWIDTH, halfWidth, -1, sb, sb.Capacity);
return sb.ToString();
}
En cuanto a la detección del formato de la cadena de entrada, no estoy al tanto de una manera fácil sin hacer primero una conversión y comparar los resultados. (¿Qué pasa si la cadena contiene caracteres de ancho completo y medio ancho?)
Un enfoque consiste en compilar una lista de todos los caracteres que desea convertir y cómo se correlacionan entre sí, y luego iterar la cadena de entrada y reemplazar todos los caracteres de la lista con su equivalente.
var fullToHalf = new Dictionary<char, char>
{
...
{ '\u30E9', '\uFF97' }, // KATAKANA LETTER RA -> HALFWIDTH KATAKANA LETTER RA
{ '\u30EA', '\uFF98' }, // KATAKANA LETTER RI -> HALFWIDTH KATAKANA LETTER RI
...
};
var halfToFull = fullToHalf.ToDictionary(kv => kv.Value, kv => kv.Key);
var input = "\u30E9";
var isFullWidth = input.All(ch => fullToHalf.ContainsKey(ch));
var isHalfWidth = input.All(ch => halfToFull.ContainsKey(ch));
var result = new string(input.Select(ch => fullToHalf[ch]).ToArray());
// result == "\uFF97"
Gracias por la sugerencia. Pensé en algo como esto con una cadena. Contiene y arreglos que contienen todos los personajes, pero me pregunto sobre el tiempo que tomaría. Un diccionario parece más ordenado, así que podría intentarlo. –
Solo para decir: muchas gracias por la sugerencia. Me gusta el enfoque, pero fue demasiado complejo para lo que estaba tratando de lograr. También un problema potencial que tengo con esto es la necesidad de crear los diccionarios de antemano ... Un poco extraño que esta debería ser la única manera de hacer esto en C# puro cuando VB tiene el método StrConv(). –
- 1. Conversión de registros a listas (y viceversa)
- 2. Conversión de NSString a NSData y viceversa
- 3. PHP a C# y viceversa
- 4. Conversión de cadenas Unicode y viceversa
- 5. ¿Es peligrosa la conversión de flotador a BigDecimal y viceversa?
- 6. Conversión de color hexadecimal a RGB y viceversa
- 7. Conversión de cadenas de caracteres anchas a minúsculas en C++
- 8. C# Conversión de precisión de 20 dígitos de doble a cadena y viceversa
- 9. "Conversión" de matrices Numpy en Matlab y viceversa
- 10. C# convierte entero a hexadecimal y viceversa
- 11. Operadores de bit a bit y conversión de un int a 2 bytes y viceversa
- 12. Conversión de caracteres chinos a Unicode
- 13. Convirtiendo matriz de bytes a cadena y viceversa en C#
- 14. Cadena a byte [] y viceversa?
- 15. ¿Cómo puedo convertir Xml a Json y viceversa en C#
- 16. Convertir píxeles a pulgadas y viceversa en C#
- 17. FREETDS y la conversión de caracteres UNIXODBC
- 18. Conversión de caracteres UTF-8 en mayúscula/minúscula C++
- 19. Char a int conversión en C
- 20. C# 4.0: Convertir PDF a byte [] y viceversa
- 21. C# .NET: Convertir icono a byte [] y viceversa
- 22. cómo pasar un valor a C++ desde python y viceversa?
- 23. Conversión de entero de 32 bits a 4 caracteres
- 24. De SVN a GIT y viceversa
- 25. Pasando de 127.0.0.1 a 2130706433, y viceversa
- 26. converting boost shared_ptr a void * y viceversa
- 27. Migrando de MySQL a MariaDB y viceversa
- 28. Cómo el compilador convierte entero a cadena y viceversa
- 29. Conversión de caracteres UTF8 escapados a su forma original
- 30. Conversión de Matlab a C++
Gracias por la sugerencia. Esto básicamente responde mi pregunta. Una pena que no haya una manera fácil de combinar las dos funciones para que la conversión se realice automáticamente. –
Hacerlo de todos modos será un comportamiento ambiguo. Si doy "ラ ー メ ン" (note que el primer carácter es de ancho medio) como entrada a su función combinada, ¿da salida "ラ ー メ (" (conversión de carácter por charla), "ラ ー メ (" (conversión basada en el primer carácter) o "ラ ー メ ン "(¿se convierte según la mayoría)? –
Tiene toda la razón, se vuelve bastante complicado ... Estoy haciendo esto para resaltar las subcadenas en una cadena que contenga caracteres japoneses. Supongo que en este caso cubrir todas las posibilidades tomaría demasiada potencia de procesamiento para no mucho beneficio para el usuario final. Terminé haciendo lo que sugeriste por cierto, convirtiéndome en zenkaku y hankaku y luego comparando los dos para ver si sucedía algo, para poder eliminar el kanji. ¡Gracias por la ayuda! –