资讯专栏INFORMATION COLUMN

将 NCR(Numeric Character Reference) 字符转换为真实字符的方法

crelaber / 3040人阅读

摘要:中国二字分别是字符和,十六进制表示的数值和就是十进制的和。所以这两种写法都会在显示时转换为中国二字。如中国等同与中文中国字符编码和一

开发过程中遇到一种奇怪的编码格式:

每日一色|蓝白~

使用decode/unescape/decodeURI解码均无效.研究一番,总结一下.

实际上上面这种奇怪的编码格式并不是编码,而是一种叫做 NCR(Numeric Character Reference) 的标记结构.

Numeric Character Reference

看看维基百科的解释:

A numeric character reference (NCR) is a common markup construct used in SGML and other SGML-related markup languages such as HTML and XML. It consists of a short sequence of characters that, in turn, represent a single character from the Universal Charact

NCR是一种常见的标记结构,用于SGML和其他SGML相似的标记语言,如HTML和XML。它由一个短的字符序列组成,代表一个字符(全球的文字字符)。

NCR编码是由一个与号(&)跟着一个井号(#), 然后跟着这个字符的Unicode编码值, 最后跟着一个分号组成的, 如:

&#ffffdd;
&#xhhhh;
&#name;

其中, ffffdd是字符编码的十进制表示, 而hhhh是字符的16进制表示.

以 HTML 为例,这三种转义序列都称作 character reference:
前两种是 numeric character reference(NCR),数字取值为目标字符的 Unicode code point;以「」开头的后接十进制数字,以「」开头的后接十六进制数字。
后一种是 character entity reference,后接预先定义的 entity 名称,而 entity 声明了自身指代的字符。
从 HTML 4 开始,NCR 以 Unicode 为准,与文档编码无关。

「中国」二字分别是 Unicode 字符 U+4E2D 和 U+56FD,十六进制表示的 code point 数值「4E2D」和「56FD」就是十进制的「20013」和「22269」。所以——

中国
中国

——这两种 NCR 写法都会在显示时转换为「中国」二字。

如何将 NCR 字符转换成真实字符

方法如下:

var regex_num_set = /&#(d+);/g;
var str = "Here is some text: 每日一色|蓝白~"

str = str.replace(regex_num_set, function(_, $1) {
  return String.fromCharCode($1);
});

document.write("
"+JSON.stringify(str,0,3));

以上例子使用了 String.prototype.replace() 和 String.fromCharCode() 方法. 思路为将字符串中的 NCR 字符逐个获取到 ""和";"间的 Unicode 字符编码值, 然后利用 String.fromCharCode() 方法, 将 Unicode 编码转为真实字符.

博客文章地址:http://joebon.cc/convert-numeric-chracter-reference-to-actual-character

参考资料

开头的是什么编码呢。浏览器可以解释它。如中国等同与中文"中国"?

Converting numeric character reference to actual character

String.prototype.replace()

[字符编码]Numeric Character Reference和HTML Entities(一)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/79408.html

相关文章

  • PHP之mb_strpos使用

    摘要:第一个字符的位置是,第二个字符的位置是,以此类推。和不同的是,数字的值不会被当做字符的顺序值。搜索位置的偏移。如果没有提供该参数,将会使用。负数的会从字符串尾部开始统计。如果省略,则使用内部字符编码。返回的中首次出现位置的数值。 mb_strpos (PHP 4 >= 4.0.6, PHP 5, PHP 7) mb_strpos — Find position of first oc...

    B0B0 评论0 收藏0
  • JAVA知识梳理

    摘要:由于最近一个项目需要需要学习知识学习的过程中做了一些笔记主要以知识点记录为主现在分享出来供参考大部分内容是参考的自强学堂这里做了归纳接口在中接口可理解为对象间相互通信的协议接口在继承中扮演着很重要的角色接口只定义派生要用到的方法但方法的具体 由于最近一个项目需要,需要学习JAVA知识,学习的过程中做了一些笔记,主要以知识点记录为主,现在分享出来供参考.大部分内容是参考的自强学堂.这里做...

    Steve_Wang_ 评论0 收藏0
  • ES6中文手册、ES6 Cheatsheet

    摘要:盲目使用替换后可能会导致预期意外的结果。在中,许多种方法来处理函数的参数默认值,参数数量,参数命名。此外,处理后的值,无论是解决还是拒绝的结果值,都是不可改变的。 这是一个 ES2015(ES6) 的Cheatsheet,其中包括提示、小技巧、最佳实践和一些代码片段,帮助你完成日复一日的开发工作。 Table of Contents var 与 let / const 声明 代码执行...

    Cristalven 评论0 收藏0
  • JS语言核心——“词法结构及类型、值和变量”

    摘要:词法结构字符集字符集程序是用字符集编写的注释支持两种格式的注释单行注释另一个注释也是一个注释这是一个多行注释直接量直接量程序中直接使用的数据值标识符和保留字标识符就是一个名字,用来对变量和函数命名,或者用作代码中某些循环语句中的跳转位置的标 1 词法结构 1.1 字符集 字符集:JS程序是用Unicode字符集编写的 1.2 注释 js支持两种格式的注释 // 单行注释 /* 另一...

    Labradors 评论0 收藏0
  • 从0到1使用VUE-CLI3开发实战(三): ES6/ES7知识储备

    摘要:它们都用于声明变量。盲目使用替换后可能会导致预期意外的结果。有鉴于此,还是建议使用字符串,布尔和数字类型的数据类型。像使用这种下划线命名约定在一个开源项目中,命名规则很难维持得一直很好,这样经常会造成一些困扰。 今天群里有小伙伴跟我聊天,问了我几个关于ES6的问题,我才意识到,大部分初学者在学习的过程中,都是学了HTML/CSS/JS之后就开始上手学习框架了,而对于ES6的重视程度却不...

    crossoverJie 评论0 收藏0

发表评论

0条评论

crelaber

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<