2

我正在探索如何使用CFStringTransform希伯来语音译文本,但我遇到了一些不一致之处,其中应该以不同方式发音的字母以完全相同的方式书写,或者 Apple 算法未考虑到的特殊情况。

Kaf (כּ → K) vs Khaf (כ → Ḵ)

  • כִּי(“因为”)

    let string = NSMutableString(string: "כִּי")
    CFStringTransform(string, nil, kCFStringTransformLatinHebrew, true)
    print(string) // prints "ki̇y"
    
  • שָׁכָחְתִּי(“我忘了”)

    let string = NSMutableString(string: "שָׁכָחְתִּי")
    CFStringTransform(string, nil, kCFStringTransformLatinHebrew, true)
    print(string) // prints "şá̌káẖĕţi̇y" instead of "şá̌ḵáẖĕţi̇y"
    

כִּי 中的kaf在英语中的发音类似于 K,而שָׁכָֽחְתִּי中的 khaf 发音为lochBach,通常音译为 CH、KH 或 Ḵ。但是,这两个字母都音译为 K。

(פּ → P) vs(פ → F)

  • פַּרְעֹה(“法老”)

    let string = NSMutableString(string: "פַּרְעֹה")
    CFStringTransform(string, nil, kCFStringTransformLatinHebrew, true)
    print(string) // prints "pȧrĕʻòh"
    
  • יוֹסֵף(“约瑟夫”)

    let string = NSMutableString(string: "יוֹסֵף")
    CFStringTransform(string, nil, kCFStringTransformLatinHebrew, true)
    print(string) // prints "ywòsép" instead of "ywòséf"
    

虽然 פַּרְעֹה 中的pei发音类似于 P 的发音(并相应地音译),但 יוֹסֵף 中的(尾随)fei发音为 F (并相应地音译)。但是,两者都用 P 音译。

带pataḥ g'nuva的尾随辅音

来自英语维基百科中关于希伯来语发声的文章:

单词结尾处字母 ח, ע, ה 上的补丁在字母之前而不是之后发声。因此,נֹחַ (Noah) 发音为 /ˈno.ax/。这仅出现在单词的末尾,并且仅出现在 patach 和 ח、ע 和 הּ(即 ה 中带有点 (mapiq))。这有时被称为 patach ganuv 或“偷来的” patach(更正式地说,“偷偷摸摸的 patach”),因为声音“窃取”了一个想象的附加辅音以使额外的音节。

然而:

  • תַפּוּחַ(“苹果”)

    let string = NSMutableString(string: "תַפּוּחַ")
    CFStringTransform(string, nil, kCFStringTransformLatinHebrew, true)
    print(string) // prints "ţaṗẇẖa" instead of "ţaṗẇaẖ"
    

问:我怎样才能改变行为CFStringTransform来解释这三种情况?

从 的参考资料中CFMutableString,我们看到CFStringTransform作为transform:参数

一个 CFString 对象,用于标识要应用的转换。有关有效值的列表,请参阅CFStringTransform 的转换标识符。在 OS X v10.4 及更高版本上,您还可以使用ICU User Guide for Transforms中定义的任何有效 ICU 转换 ID 。

文档看来,ICU 转换的规则足够灵活,可以自定义。甚至还有一个可以从他们的 playground访问的规则编辑器,但是,虽然我发现了一个 Stack Overflow 问题,它处理一些切线相似的事情,但我找不到一个明确记录的 RTL 语言的方法。

4

1 回答 1

1

据我所知,通过在中文和日文中使用它,CFStringTransform 逐个标记工作,而不是将单词作为一个整体(可能是多个标记长)考虑在内。因此,当需要考虑多个标记时,音译将受到限制/不正确。我希望我的假设是正确的,这也是您在希伯来语中的问题的根源(请告知)。

CFStringTokenizer我发现在这种情况下,通过使用 a对文本进行标记,然后使用该CFStringTokenizerCopyCurrentTokenAttribute()方法依次获取每个标记的拉丁音译,在这种情况下音译会更加准确。这里给出了一个例子——我认为是在 Objective C 中,尽管这种情况下的语法与 Swift 非常相似。

于 2017-02-19T17:34:09.117 回答