reemplazar - Conversión de caracteres zenkaku a hankaku y viceversa en C#
string c# ejemplos (2)
Puede utilizar el método Strings.StrConv () incluyendo 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 también puedes hacer 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 detectar el 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?)
Como dice en la línea del encabezado, quiero convertir los caracteres zenkaku a los hankaku y vice-vrsa en C #, pero no puedo entender cómo 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?
Un enfoque es 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"
Gráfico Unicode: formularios Halfwidth y Fullwidth (FF00-FFEF)