Это ошибка (Windows API)? - PullRequest
       5

Это ошибка (Windows API)?

3 голосов
/ 29 июня 2010

У меня был вопрос о нормализации строки, и на него уже был дан ответ, но проблема в том, что я не могу правильно нормализовать корейские символы, требующие 3 нажатия клавиш
С помощью ввода "ㅁ ㅜㄷ" (от нажатия клавиш "ane")вместо «묻» появляется «무 ㄷ».
При вводе «ㅌ ㅐ ㅇ» (от нажатия клавиш «xod») вместо «탱» выходит «태 ㅇ».

Это ответ мистера Дина, и хотя он работал на примере, который я привел вначале ... он не работает с тем, который я привел выше.

Если вы используете .NET, сработает следующее:

var s = "ㅌㅐㅇ";
s = s.Normalize(NormalizationForm.FormKC);

В собственном Win32 соответствующий вызов: NormalizeString :

wchar_t *input = "ㅌㅐㅇ";
wchar_t output[100];
NormalizeString(NormalizationKC, input, -1, output, 100);

NormalizeString доступна только в Windows Vista +. Вам необходимо установить «API-интерфейсы для смягчения последствий использования интернационализированных доменных имен Microsoft» , если вы хотите использовать его в XP (почему он находится в загрузке IDN, я не понимаю ...)

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

Это код, который я использую в Delphi (с XP):

      var  buf: array [0..20] of char;
      temporary: PWideChar;
      const NORMALIZATIONKC=5;
      ...
      temporary:='ㅌㅐㅇ';
      NormalizeString(NORMALIZATIONKC , temporary, -1, buf, 20);
      showmessage(buf);

Это ошибка?Что-то не так в моем коде?Правильно ли работает код на вашем компьютере?На каком языке?Какую версию Windows вы используете?

1 Ответ

2 голосов
/ 29 июня 2010

Используемый вами джамо (ㅌㅐㅇ) находится в блоке, называемом Julo-совместимостью Hangul , который присутствует из-за устаревших кодовых страниц.Если вы возьмете своего целевого персонажа и разложите его (используя NFKD), вы получите джамо из блока Hangul Jamo (ᄐ ᅢ ᆼ, без пробелов, которые есть только для предотвращения его нормализации браузером), и они могут быть перекомпонованы просто отлично.

Unicode 5.2 состояния:

Когда Jamo совместимости Hangul преобразованы с формой нормализации совместимости, NFKDили NFKC, символы преобразуются в соответствующие соединяющиеся символы джамо.

(...)

В таблице 12-11 показано, как два джамо-совместимости с хангыль может отображаться на дисплее даже после преобразования их в NFKD или NFKC.

Это говорит о том, что NFKC должен правильно их комбинировать, рассматривая их как обычный Jamo, но Windows, похоже, этого не делает.Однако использование NFKD, по-видимому, конвертирует их в обычный Jamo, и затем вы можете запустить NFKC на нем, чтобы получить правильный символ.

Поскольку эти символы появляются из внешней программы (IME), яЯ бы посоветовал вам либо выполнить ручной переход для преобразования этих совместимых Jamo, либо начать с выполнения NFKD, а затем NFKC.Кроме того, вы можете перенастроить IME для вывода «нормального» Jamo вместо совместимости Jamo.

...