【问题标题】:How to customize CFString transliteration in Cocoa / Cocoa Touch / Foundation如何在 Cocoa / Cocoa Touch / Foundation 中自定义 CFString 音译
【发布时间】:2016-06-07 17:40:17
【问题描述】:

我正在探索如何使用 CFStringTransformtransliterate texts in Hebrew 并且我遇到了一些不一致之处,其中应该以不同方式发音的字母以完全相同的方式书写或 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 发音为 loch Bach,通常音译为 CH、KH 或Ḵ。但是,这两个字母都音译为 K。

Pei (פּ → P) vs Fei (פ → 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 的尾随辅音

来自英文维基百科Hebrew vocalization的文章:

单词末尾字母 ח, ע, ה 上的 patach 在字母之前而不是之后发声。因此,נֹחַ (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 的行为以解决这三种情况?

reference for CFMutableString中,我们看到CFStringTransform作为transform:参数

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

the documentation 看来,ICU 转换的规则足够灵活,可以自定义。甚至还有一个rule editor 可以从their playground 访问,但是,虽然我发现a Stack Overflow question 可以处理一些切线相似的事情,但我找不到针对RTL 语言的明确记录方法。

【问题讨论】:

    标签: swift foundation hebrew icu cfstring


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多