Преобразование символов zenkaku в hankaku и наоборот в C # - PullRequest
6 голосов
/ 22 июня 2011

Как говорится в строке заголовка, я хочу преобразовать символы дзенкаку в символы ханкаку и наоборот в C #, но не могу понять, как это сделать.Итак, скажите «ラ ー メ ン» «ラ ー メ ン» и наоборот.Можно ли написать это в методе, который автоматически определяет, в каком направлении должно идти преобразование, в зависимости от формата ввода?

Ответы [ 2 ]

2 голосов
/ 22 июня 2011

Вы можете использовать метод Strings.StrConv () , включив ссылку на Microsoft.VisualBasic.dll, или вы можете p / вызвать функцию LCMapString () native:

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);

и вы также можете сделать обратное:

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();
}

Что касается определения формата входной строки, я не знаю простого способа, не выполнив сначала преобразование и не сравнив результаты. (Что если строка содержит символы как полной ширины, так и полуширины?)

1 голос
/ 22 июня 2011

Один из подходов состоит в том, чтобы составить список всех символов, которые вы хотите преобразовать, и то, как они отображаются друг на друга, а затем выполнить итерацию входной строки и заменить все символы в списке их эквивалентами.

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"

Диаграмма Unicode: формы половинной и полной ширины (FF00-FFEF)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...