【问题标题】:uconv - Does the -x option define a transliterator or a transform?uconv - -x 选项是否定义音译或转换?
【发布时间】:2016-12-21 16:46:19
【问题描述】:

man pagesuconv 说:

-x音译
对转码后的 Unicode 数据运行给定的音译,并将转译后的数据作为输入用于转码到目标编码。

还包括以下两个例子:

echo '\u30ab' | uconv -x 'hex-any; any-name'

uconv -f utf-8 -t utf-8 -x '::nfkc; [:Cc:] >; ::katakana-hiragana;'

第一个示例指向定义"compound transform"-x 选项,但第二个示例指向它是"rule-based transliterator"

ICU 提供的许多示例(12)都不起作用,这加剧了这种情况:

$ echo "Example" | uconv -f UTF8 -t UTF8 -x 'NFD; [:Nonspacing Mark:] Remove; NFC;'
Couldn't create transliteration "NFD; [:Nonspacing Mark:] Remove; NFC;": U_MISSING_OPERATOR, line 0, offset 0.

$ echo "Example" | uconv -f UTF8 -t UTF8 -x '[:Latin:]; NFKD; Lower; Latin-Katakana;'
Couldn't create transliteration "[:Latin:]; NFKD; Lower; Latin-Katakana;": U_MISSING_OPERATOR, line 0, offset 0.

但是一些例子(12)工作得很好:

$ echo "Example" | uconv -f UTF8 -t UTF8 -x '[aeiou] Upper'
ExAmplE

$ echo "Example" | uconv -f UTF8 -t UTF8 -x 'NFKD; Lower; Latin-Katakana;'
エクサンプレ

那么-x到底定义了什么?


情节变厚了!看起来uconv 阻塞了不在转换规则中的预定义字符类。

常规字符类:

$ echo "Example" | uconv -f UTF8 -t UTF8 -x '[a-zA-Z] Upper'
EXAMPLE

$ echo "Example" | uconv -f UTF8 -t UTF8 -x ':: [a-zA-Z] Upper;'
EXAMPLE

预定义的字符类:

$ echo "Example" | uconv -f UTF8 -t UTF8 -x '[:alpha:] Upper'
Couldn't create transliteration "[:alpha:] Upper": U_MISSING_OPERATOR, line 0, offset 0.

$ echo "Example" | uconv -f UTF8 -t UTF8 -x ':: [:alpha:] Upper;'
EXAMPLE

以防万一,这是我正在使用的uconv 的版本:

$ uconv --version
uconv v2.1  ICU 58.1

【问题讨论】:

    标签: unicode icu


    【解决方案1】:

    根据你传递的内容,它会做不同的事情。

    下面的摘录是来自uconv.cpp 的格式化代码。 translit-x 参数的值。

    UnicodeString str(translit), pestr;
    
    /* Create from rules or by ID as needed. */
    
    parse.line = -1;
    
    if (uprv_strchr(translit, ':') || uprv_strchr(translit, '>') ||
        uprv_strchr(translit, '<') || uprv_strchr(translit, '>')) {
      t = Transliterator::createFromRules(UNICODE_STRING_SIMPLE("Uconv"), str,
                                          UTRANS_FORWARD, parse, err);
    } else {
      t = Transliterator::createInstance(UnicodeString(translit, -1, US_INV),
                                         UTRANS_FORWARD, err);
    }
    

    createFromRules 根据输入创建的内容进一步不同:

    返回一个Transliterator 对象,由 给定的规则字符串。这将是一个 RuleBasedTransliterator, 如果规则字符串只包含规则,或者 CompoundTransliterator,如果它包含 ID 块,或 NullTransliterator,如果它包含解析为的 ID 块 给定方向为空。

    【讨论】:

    • 当,所以我的怀疑是正确的。只要输入有:,它的解析方式就会不同。调整它应该不会太难。
    猜你喜欢
    • 2017-03-06
    • 2021-07-29
    • 2016-08-19
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    相关资源
    最近更新 更多