如何从VBA中的韩语字符串中提取字符

时间:2009-11-16 10:06:40

标签: excel vba ms-access unicode unicode-normalization

需要从MS-Excel和MS-Access中的韩语单词中提取初始字符。 当我使用左(“한글”,1)时,它将返回第一个音节,即한,我需要的是初始字符,即ㅎ。 有这个功能吗?或者至少是成语?

如果您知道如何从String中获取Unicode值,我可以从那里开始工作,但我相信我会重新发明轮子。 (又一次)

4 个答案:

答案 0 :(得分:8)

免责声明:我对Access或VBA知之甚少,但您所拥有的是一般的Unicode问题,并非特定于这些工具。我重新提出了您的问题,要添加与此问题相关的标签。

Access通过返回한做正确的事情,它确实是那个双字符串的第一个字符。你想要的是这个hangul在其成分jamos中的规范分解,也称为归一化形式D(NFD),用于“分解”。 NFD形式是한,其中第一个字符就是你想要的。

另请注意,根据您的示例,您似乎希望函数返回jamo(ᄒ)的等效hangul(ㅎ) - 实际上有两个不同的代码点,因为它们代表不同的语义单元(完全成熟) hangul音节,或hangul的一部分)。从前者到后者没有预先定义的映射,你可以为这个效果编写一个小函数,因为jamos的数量限制在几十个(真正的工作在第一个函数中完成,NFD)。 / p>

答案 1 :(得分:2)

除了Arthur的优秀答案之外,我想指出从标准中提取hangeul音节中的jamo是非常简单的。虽然解决方案不是特定于Excel或Access(它是一个Python模块),但它只涉及算术表达式,因此它应该很容易翻译成其他语言。可以看出,公式与standard的第109页中的公式相同。分解作为整数编码字符串的元组返回,可以很容易地验证它们与Hangul Jamo Code Chart对应。

# -*- 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

这是我的控制台中的输出:

항 : ᄒ ᅡ ᆼ
가 : ᄀ ᅡ
있 : ᄋ ᅵ ᆻ
닭 : ᄃ ᅡ ᆰ
넓 : ᄂ ᅥ ᆲ
짧 : ᄍ ᅡ ᆲ

答案 2 :(得分:1)

我认为你要找的是一个字节数组 将aByte()调暗为字节 aByte = “한글” 应该为字符串

中的每个字符提供两个unicode值

答案 3 :(得分:0)

我认为你得到了你需要的东西,但它似乎相当复杂。我对此一无所知,但最近做了一些关于处理Unicode的调查,并查看了所有的字符串字节函数,例如LeftB(),RightB(),InputB(),InStrB(),LenB(),AscB (),ChrB()和MidB(),还有StrConv(),它有一个vbUnicode参数。这些都是我认为可以在任何双字节上下文中使用的函数,但是,我不在那个环境中工作,所以可能会遗漏一些非常重要的东西。