我应该将哪种数据类型用于IETF语言代码?

时间:2013-07-25 02:36:33

标签: database-design types internationalization language-agnostic multilingual

我正在微博平台上设计一个消息架构,需要有一个定义的语言。这些消息将在许多节点之间的网络中分布,因此我需要使模式紧凑但仍然完全多语言。

我将使用IETF language codesenen-AU等),但我需要知道是否有一种特定的方式来代表它们以达到效率的目的。语言标签有多种标准,但当前的规范RFC 5646通过保持与先前标准的向后兼容性而复杂化。由于存在多个子标签,我并不完全了解空间要求。

表示IETF语言代码的最节省空间的方法是什么?

1 个答案:

答案 0 :(得分:12)

我认为IETF处理区域代码的规范确实是业界“最佳通用实践”,但绝对不能妥协以保持向后兼容性等。我仍然建议根据您的需要调整它,因为最重要的国际化库和标准(Unicode,ICU)正在使用它。

BCP47 / RFC5646 section 4.4.1建议标记长度为35个字符:

   language      =  8 ; longest allowed registered value
                      ;   longer than primary+extlang
                      ;   which requires 7 characters
   script        =  5 ; if not suppressed: see Section 4.1
   region        =  4 ; UN M.49 numeric region code
                      ;   ISO 3166-1 codes require 3
   variant1      =  9 ; needs 'language' as a prefix
   variant2      =  9 ; very rare, as it needs
                      ;   'language-variant1' as a prefix

   total         = 35 characters

              Figure 7: Derivation of the Limit on Tag Length

但是如果您只关心语言和脚本(而不是区域信息表示某些区域设置敏感数据,如日期和时间格式),那么您最多可以使用13个字符。

实际上,大多数标签最终只会是该语言的两个字符。我经常处理并需要脚本子标签的唯一常见示例是sr-Latnsr-Cyrl(分别用拉丁语或西里尔语写的塞尔维亚语),zh-Hant(繁体中文)和{{1 }} (简体中文)。此外,很可能您不需要变体,这意味着这些区域代码的大多数现实示例都应该在17个字符的限制之内。