uconv - -x选项是否定义了音译器或转换?

时间:2016-12-21 16:46:20

标签: unicode icu

uconv的{​​{3}}说:

  

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

它还包括以下两个例子:

  

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

     

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

第一个示例指向定义man pages-x选项,但第二个示例指向"compound transform"

ICU提供的许多示例("rule-based transliterator"1)不起作用,这加剧了这一点:

$ 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.

但是一些例子(21)工作正常:

$ 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

1 个答案:

答案 0 :(得分: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,   如果规则字符串只包含规则,或者a   CompoundTransliterator,如果它包含ID块,或者a   NullTransliterator,如果它包含解析为的ID块   对于给定的方向是空的。