NCR(Numeric Character Reference)简单介绍

来源:互联网 发布:数据存储的方式 编辑:程序博客网 时间:2024/05/22 06:24

1 从字符编码谈起

读写文字是人与动物的最大区别,不同的种族发明了不同的语言文字,对这些文字进行二进制表示是计算机领域必须要解决的问题。文本处理在计算机程序中占有相当大的比例,尤其是在web程序中,几乎大部分程序逻辑都是为了最终输出处理过的文本。目前世界上存在有很多种字符编码标准,各个标准并不完全兼容,甚至完全不同,从而导致了“乱码”这个让很多程序员都胆战心惊的东西。

尽管目前统一的编码规范UNICODE大行其道,被越来越广泛地使用,然而尚未达到完全统治字符编码界的水平。

2 元字符与不可编码字符

2.1 元字符

在标记语言中,都会定义一些被称为“元字符”的特殊字符,这些字符具有特殊的作用,不再具有原来字面上的意义。我们以HTML为例,小于号(<)就是一个最常用的元字符,它表示一个标签的开始,而不再具有“小于号”这个字面意义。

那么想要这些元字符的字面含义该怎么办呢?
解决方法就是:用元字符引导字符序列来表示元字符的字面含义。例如在HTML中元字符<的字面值就是用如下序列表示。

&lt;

2.2 不可编码字符

很多的字符编码标准并不能涵盖所有的字符,例如ASCII编码只包含128个字符,根本不能表示英文之外的其他任何语言文字。这样就会导致一个问题:想要在ASCII编码的文件中记录汉字怎么办?

解决方法就是:用元字符引导的可编码字符序列来表示不可编码字符。解码程序能够识别这个格式的字符序列,然后把它转换成原本的不可编码字符。例如,汉字“中”在ASCII编码的HTML文件中可以使用如下序列表示。

&#20013;

这个序列只含有可以用ASCII编码的字符。浏览器在遇到这个序列时,自动转换为汉字“中”并正确显示出来,当然前提是浏览器自身具有显示汉字的能力。

3 两种解决方式

前面提到的元字符引导的可编码字符序列到底是如何规定的呢?目前有两种方案

3.1 一种是HTML中广为使用的被称作实体的规范

例如上面提到的

&lt;

这种规范中定义了很多特定的字符序列,然而总归是非常有限的,主要是为了表示元字符的字面值。对于广大的汉字仍不能表示。

3.1 另一种是被称作NCR的规范

在NCR中,使用字符的UNICODE代码点数值的十进制或十六进制表示字符串来代表这个字符。例如上面例子中

&#20013;

其中的20013就是汉字“中”在UNICODE编码中的代码点。当然也可以使用16进制来表示,如下

&#x4E2D;

这种规范看似简单,却非常强大,因为它可以表示任意的字符,只用UNICODE编码中定义了这个字符,它就可以轻松表示。存在的问题是,很少有人能记住一个字符的UNICODE代码点,需要去查表才行。

尽然NCR能表示任何字符,当然也能够表示元字符的字面值了,例如前面的

&lt;

也可以使用

&#60;

来表示。

4 好玩的UNICODE字符

UNICODE编码涵盖了世界上已知的所有字符,除了各种语言的文字外,还包含了很多符号,标记。下面给出几个小例子。

  • &#x2605; 对应 ★
  • &#x2694; 对应 ⚔
  • &#x2695; 对应 ⚕
  • &#x2713; 对应 ✓

另外,UNICODE中还定义了一些组合字符,它们本身不能单独存在,必须作用于前面的基本字符上,例如常见的重音符号。

  • A&#x030E; 对应 A̎

广大的90后小朋友网络上广泛使用的火星文就是把各种UNICODE字符按照特定的规则组合起来的。

如下序列:

&#12389;&#28779;&#9734;&#25909;&#257;

显示效果:

づ火☆攵ā

0 0