2009-11-16 71 views
2

需要在MS-Excel和MS-Access中從韓語單詞中提取首字符。 當我使用Left(「한글」,1)時,它會返回第一個音節,即,我需要的是初始字符,即ㅎ。 有沒有這樣做的功能?或者至少是一個成語?如何在VBA中從韓文字符中提取字符

如果你知道如何從字符串中獲得Unicode值,我可以從那裏得到它,但我相信我會重新發明輪子。 (又是)

回答

1

我知道你在尋找的是一個字節數組 昏暗aByte()作爲字節 aByte =「한글」 應該給你的字符串中的每個字符的兩個Unicode值

+0

謝謝,它的工作原理,我一開始就對字節順序感到困惑。衛生署! – 10ToedSloth

7

聲明:我對Access或VBA知之甚少,但是你所擁有的是一個通用的Unicode問題,它並不特定於那些工具。我重申了您的問題,即添加與此問題相關的標籤。

訪問通過返回한doing做正確的事情,它確實是該雙字符字符串的第一個字符。這裏你想要的是這個hangul在其組成jamos中的規範分解,也稱爲歸一化表格D(NFD),用於「分解」。 NFD的形式是한,其中第一個字符就是你想要的。

請注意,根據你的例子,你似乎想要一個函數返回jamo(ᄒ)的等價朝鮮語(ㅎ) - 實際上有兩個不同的代碼點,因爲它們代表不同的語義單元羽翼豐滿的韓語音節或韓語的一部分)。沒有從前者到後者的預定義映射,你可以寫一個小函數來達到這個效果,因爲jamos的數量限制在幾十個(真正的工作是在第一個函數NFD中完成的)。

+0

嗨亞瑟,是我找的初始JAMO(即初始字符),而不是最初的韓文音節。映射並不困難我只是不知道如何從VBA中的字符串正確獲取unicode值。初始字符。映射可以使用(UnicodeValue - 44032)/ 588找到。Cheers – 10ToedSloth

+0

是的,對於hangul,您也可以通過算法來實現。事實上,這就是標準中的規定(http://www.unicode.org/versions/Unicode5.2.0/ch03.pdf第3.12節,從第104頁開始)。 –

+0

+1再次感謝您的參考。 – 10ToedSloth

0

我假設你有你需要什麼,但似乎相當複雜。我對此一無所知,但最近做了一些關於處理Unicode的調查,並查看了所有字符串的Byte函數,如LeftB(),RightB(),InputB(),InStrB(),LenB(),AscB (),ChrB()和MidB(),還有StrConv(),它有一個vbUnicode參數。這些都是我認爲會在任何雙字節上下文中使用的所有函數,但是,我不在該環境中工作,因此可能會丟失一些非常重要的內容。

+0

是的手動音節分解似乎令人費解,我真的希望有一個更加標準化的方法。 Charles的建議是將它放入一個字節數組中,效果很好。但正如你所提到的,使用AscB()等函數也可以實現。 – 10ToedSloth

1

除了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 

這是我的控制檯輸出:

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

謝謝Jong Bor,那很好。我更改了示例中的輸出以返回編碼的字符串。即如果T == TBase: u = unichr(L)+''+ unichr(V) else: u = unichr(L)+「+ unichr(V)+」+ unichr(T) .encode( 'UTF-8') 回報(U) 如果__name__ == '__main__': 打印(U '항'), ' - >',分解(U '항') 打印(U '가'),' - >',decompose(u'가') – 10ToedSloth

+0

@ 10ToedSloth你的改變很有意義,因爲'decompose'將一個編碼字符串作爲參數,所以我相應地修改了我的代碼。我很高興你花時間回顧了你兩年前提出的問題的答案:) –

相關問題