天天看点

语言识别及标签tag定义:RFC 5646中文简述

   RFC5646是关于语言识别的请求评议文档,在开发国际化应用时离不开语言信息的处理,比如drupal多语言处理,语言信息识别以语言标签来指定:

   语言标签用以指明信息对象的语言信息,如方言、区域、书写变体等等,信息对象不仅仅是文本,还有音视频等等内容,在人类使用的计算机系统中语言标签被广泛使用,如浏览器可以发送首选语言参数信息。

   由the Internet Assigned Numbers Authority (IANA)依据RFC 5646来管理语言标签的注册和维护,指明人类沟通的自然语言或人工语言,不指程序语言,如php、java等,语言标签具备语义性,除注册的公有标签外,提供了私有使用的机制。

语言标签语法:

   语言标签tag由一个或多个子标签Subtag组成的US-ASCII字符序列构成,以连字符“-”分割,第一个子标签是主语言子标签Primary Language Subtag,只能有两个或三个字符,四个字符的保留为功能使用,5-8个字符的为特权标签,注册来形式化主语言子标签和未来扩展;一个字符的首标签有特殊含义,如X表明语言标签为私用;在主语言标签之后,各个子标签进一步细化或缩小整个语言标签的范围,子标签由字母或数字构成,所有子标签不得超过8个字符(但语言标签字符总长度未给予限制),空格不被允许,大小写没关系;根据位置、长短和内容,子标签有不同的类型,通常的格式如下:

首语言标签-扩展语言标签extlang-脚本标签script-区域标签region-变体标签Variant (0个或多个)-扩展标签Extension(0个或多个)-私有标签Private(以字母X开头,如en-x-US)

其中许多标签名由IANA注册维护,通常来自于ISO标准文件,有些标签名为自定义,如私有标签

举例如下:

zh-cmn-Hans-CN 表示:汉语(首语言标签)-普通话(扩展语言标签)-简体中文(脚本标签)-中国(使用区域)

zh-yue-HK 表示:汉语(首语言标签)-粤语(扩展语言标签)-香港(使用区域)

除首语言标签外其他标签均为可选,如简体中文通常记为:zh-hans

详细的格式描述请看RFC 5646 ,该描述使用了扩展巴克斯范式ABNF,那是类似正则表达式一样的表达工具,关于该巴克斯范式请见RFC5234,或搜索关键词:ABNF,本文附加了一份ABNF的简短中文说明,见附加资料

RFC5646文档地址:

http://www.rfc-editor.org/rfc/rfc5646.txt 

W3C语言标签应用:

https://www.w3.org/International/articles/language-tags/

我是云客,【云游天下,做客四方】,微信号:php-world,原创内容,欢迎转载,但须注明出处,讨论请加qq群203286137

附加资料:

以下列出ABNF的中文规则说明:

ABNF

  RFC2234 定义了扩展的巴科斯范式(ABNF)。近年来在Internet的定义中 ABNF 被广泛使用。ABNF 做了更多的改进。扩充巴科斯-瑙尔范式(ABNF)基于了巴科斯-瑙尔范式(BNF),但由它自己的语法和推导规则构成。这种元语言的发起原则是描述作为通信协议(双向规范)的语言的形式系统。它建档于 RFC 4234 中通常充当 IETF 通信协议的定义语言。

  ABNF 规定是一组推导规则,写为:

规则 = 定义 ; 注释 CR LF      

  这里的规则是大小写敏感的非终止符,定义由定义这个规则的符号序列,一个文档注释组成,并结束于回车换行。

  规则名字是大小写不敏感的: 

<rulename>

<Rulename>

<RULENAME>

 和 

<rUlENamE>

 都提及同一个规则。规则名字由开始于一个字母的字母、数字和连字符组成。不要求用尖括号(“

<

”, “

>

”) (如 BNF 那样)包围规则名字。但是它们可以用来界定规则名字,比如在冗文中识别出规则名字的时候。ABNF 使用 7-位 ASCII 编码,在 8-位域中把高位置零。

  终结符由一个或多个数值字符指定。数值字符可以指定为跟随着基数(b = 二进制, d = 十进制, x = 十六进制)的一个百分号“

%

”,随后是这个数值,或数值的串联(用“

.

” 来指示)。例如回车可以指定为十进制的 

%d13

 或十六进制的 

%x0D

。回车换行可以指定为 

%d13.10

  文字正文通过使用包围在引号(

"

)中字符串来指定。这些字符串是大小写不敏感的,使用的字符集是 US-ASCII。所以字符串“abc”将匹配“abc”, “Abc”, “aBc”, “abC”, “ABc”, “AbC”, “aBC” 和 “ABC”。对于大小写敏感匹配,必须定义明确的字符: 要匹配 “aBc” 定义将是 

%d97 %d66 %d99

  操作符

  空白被用来分隔定义的各个元素: 要使空格被识别为分割符则必须明确的包含它。

  串联

规则1 规则2         

  规则可以通过列出一序列的规则名字来定义。

  要匹配字符串“aba”可以使用下列规则:

fu = %x61; a
bar = %x62; b
mumble = fu bar fu      

  选择

规则1 / 规则2        

  规则可以通过用反斜杠(“

/

”)分隔的多选一规则来定义。

  要接受规则 <fu> 或规则 <bar> 可构造如下规则:

fubar = fu / bar          

  递增选择

规则1 =/ 规则2        

  可以通过使用在规则名字和定义之间的“

=/

”来向一个规则增加补充选择。

  规则

ruleset = alt1 / alt2 / alt3 / alt4 / alt5      

  等价于

ruleset = alt1 / alt2
ruleset =/ alt3
ruleset =/ alt4 / alt5      

  值范围

%c##-##           

  数值范围可以通过使用连字符(“

-

”)来指定。

  规则

OCTAL = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7"      

  等价于

OCTAL = %x30-37      

  序列分组

(规则1 规则2)        

  元素可以放置在圆括号中来组合定义中的规则。

  要匹配“elem fubar snafu”或“elem tarfu snafu”可以构造下列规则:

group = elem (fubar / tarfu) snafu      

  要匹配“elem fubar”或“tarfu snafu”可以构造下列规则:

group = elem fubar / tarfu snafu
group = (elem fubar) / (tarfu snafu)      

  可变重复

n*n规则           

  要指示一个元素的重复可以使用形式 

<a>*<b> 元素

。可选的 

<a>

 给出要包括的元素的最小数目,缺省为 0。可选的 

<b>

 给出要包括的元素的最大数目,缺省为无穷。

  对零或多个元素使用 

*元素

,对一或多个元素使用 

1*元素

,对二或三个元素使用 

2*3元素

  特定重复

  

n规则             

  要指示明确数目的元素可使用形式 

<a> 元素

,它等价于 

<a>*<a>元素

  使用 

2DIGIT

 得到两个数字,使用 

3DIGIT

 得到三个数字。(DIGIT 在下面的核心规则中定义)。

  可选序列

[规则]              

  要指示可选元素下列构造是等价的:

[fubar snafu]
*1(fubar snafu)
0*1(fubar snafu)      

  注释

; 注释             

  分号(“

;

”)开始一个注释并持续到此行的结束。

  操作符优先级

  上述操作符有从最紧绑定(binding)到最松绑定的给定优先级:

  1. 字符串,名字形成(formation)
  2. 注释
  3. 值范围
  4. 重复
  5. 分组,可选
  6. 串联
  7. 选择

  与串联一起使用选择操作符可以造成混淆,建议使用分组来做明确串联分组。

  核心规则

  核心规则定义于 ABNF 标准中。

规则 形式定义 意义
ALPHA %x41-5A / %x61-7A 大写和小写 ASCII 字母 (A-Z a-z)
DIGIT %x30-39 数字 (0-9)
HEXDIG DIGIT / "A" / "B" / "C" / "D" / "E" / "F" 十六进制数字 (0-9 A-F a-f)
DQUOTE %x22 双引号
SP %x20 空格
HTAB %x09 水平tab
WSP SP / HTAB 空格和水平tab
LWSP *(WSP / CRLF WSP) 线性空白(晚于换行)
VCHAR %x21-7E 可见(打印)字符
CHAR %x01-7F 任何 7-位 US-ASCII 字符,不包括 NUL
OCTET %x00-FF 8 位数据
CTL %x00-1F / %x7F 控制字符
CR %x0D 回车
LF %x0A 换行
CRLF CR LF 互联网标准换行
BIT "0" / "1"

继续阅读