как извлечь символы из корейской строки в VBA - PullRequest
3 голосов
/ 16 ноября 2009

Необходимо извлечь начальный символ из корейского слова в MS-Excel и MS-Access. Когда я использую Left («한글», 1), он вернет первый слог, т. Е. Мне нужен начальный символ, т. Е. ㅎ. Есть ли функция для этого? или хотя бы идиома?

Если вы знаете, как получить значение Unicode из String, я смогу отработать его оттуда, но я уверен, что заново изобрету колесо. (еще раз)

Ответы [ 4 ]

8 голосов
/ 16 ноября 2009

Отказ от ответственности: я мало знаю о Access или VBA, но то, что у вас есть, это общая проблема Unicode, она не относится к этим инструментам. Я пометил ваш вопрос, чтобы добавить теги, связанные с этой проблемой.

Access делает правильные вещи, возвращая 한, это действительно первый символ этой двухсимвольной строки. Что вам нужно здесь, так это каноническое разложение этого хангула в составляющих его джамо, также известных как форма нормализации D (NFD), для «разложенного». Форма NFD - это ᄒ ‌ ᅡ ‌ ᆫ, из которых первый символ - это то, что вы хотите.

Обратите внимание, что в соответствии с вашим примером, вы, похоже, хотите, чтобы функция возвращала эквивалентный хангул (ㅎ) для jamo (ᄒ) - на самом деле есть две разные кодовые точки, потому что они представляют разные семантические единицы (полноценные). слог хангул, или часть хангул). Нет предопределенного отображения между первым и вторым, вы можете написать небольшую функцию с этой целью, так как количество джемов ограничено несколькими десятками (реальная работа выполняется в первой функции, NFD).

2 голосов
/ 25 декабря 2011

В дополнение к прекрасному ответу Артура, я хочу отметить, что извлечение джамо из слогов хангель очень просто по сравнению со стандартом. Хотя решение не является специфическим для Excel или Access (это модуль Python), оно включает только арифметические выражения, поэтому его следует легко переводить на другие языки. Как видно, формулы идентичны приведенным на стр. 109 стандарта . Декомпозиция возвращается как кортеж из целых кодированных строк, которые легко проверить на соответствие кодовой диаграмме хангыльского Jamo .

# -*- encoding: utf-8 -*-

SBase = 0xAC00
LBase = 0x1100
VBase = 0x1161
TBase = 0x11A7
SCount = 11172
LCount = 19
VCount = 21
TCount = 28
NCount = VCount * TCount


def decompose(syllable):
    global SBase, LBase, VBase, TBase, SCount, LCount, VCount, TCount, NCount

    S = ord(syllable)
    SIndex = S - SBase
    L = LBase + SIndex / NCount
    V = VBase + (SIndex % NCount) / TCount
    T = TBase + SIndex % TCount

    if T == TBase:
        result = (L,V)
    else:
        result = (L,V,T)

    return tuple(map(unichr, result))

if __name__ == '__main__':
    test_values = u'항가있닭넓짧'

    for syllable in test_values:
        print syllable, ':',
        for s in decompose(syllable): print s,
        print

Это вывод в моей консоли:

항 : ᄒ ᅡ ᆼ
가 : ᄀ ᅡ
있 : ᄋ ᅵ ᆻ
닭 : ᄃ ᅡ ᆰ
넓 : ᄂ ᅥ ᆲ
짧 : ᄍ ᅡ ᆲ
1 голос
/ 16 ноября 2009

Я думаю, что вы ищете байтовый массив Dim aByte () как байт aByte = "한글" должен дать вам два значения Юникода для каждого символа в строке

0 голосов
/ 17 ноября 2009

Полагаю, вы получили то, что вам нужно, но это выглядит довольно запутанным. Я ничего не знаю об этом, но недавно провел некоторое исследование по обработке Unicode и изучил все строковые байтовые функции, такие как LeftB (), RightB (), InputB (), InStrB (), LenB (), AscB (), ChrB () и MidB (), а также есть StrConv (), который имеет аргумент vbUnicode. Это все функции, которые, я думаю, будут использоваться в любом двухбайтовом контексте, но тогда я не работаю в этой среде, поэтому могу упустить что-то очень важное.

...