遇到以&#开头的特殊字符串
开发过程中遇到了一种奇怪的字符串,以&#开头,如下:
久精品
于是查询了下发现是NCR字符串,然后就了解了下什是 NCR,又如何转译成正常字符串。
简单通俗说就是一种标识特殊语言字符的转义序列结构,如日语,中文,俄文等特俗符号等
什么是NCR?
wiki百科介绍:
A numeric character reference (NCR) is a common markup construct used in SGML and SGML-derived markup languages such as HTML and XML. It consists of a short sequence of characters that, in turn, represents a single character. Since WebSgml, XML and HTML 4, the code points of the Universal Character Set (UCS) of Unicode are used. NCRs are typically used in order to represent characters that are not directly encodable in a particular document (for example, because they are international characters that do not fit in the 8-bit character set being used, or because they have special syntactic meaning in the language). When the document is interpreted by a markup-aware reader, each NCR is treated as if it were the character it represents.
from: https://en.wikipedia.org/wiki/Numeric_character_reference
字符值引用(numeric character reference, NCR)是在标记语言SGML以及派生的如HTML与XML中常见的一种转义序列结构,用来表示Unicode的通用字符集 (UCS)中的单个字符. NCR可以表示在一个特定文档中不能直接编码的字符,而该标记语言阅读器软件把每个NCR当作一个字符来处理。
例如,在ISO/IEC 8859-1编码的网页文件中使用了俄文字母或者希腊字母。由于该编码不支持这些字母,就需要用NCR来表示。网页浏览器可以正确地把这些NCR绘制为相应的西里尔字母或希腊字母。
描述如下:
标记语言使用的字符编码方法(如ISO-8859),常常不能表示所有的Unicode字符,这就需要使用“转义”机制来处理这些不能编码的字符。
基于SGML的标记语言允许使用7比特ASCII字符(即Unicode的前128个码位)的序列来表示或者说引用任何Unicode字符。基于Unicode字符"码位"的字符引用被称作字符值引用。HTML 4与所有版本的XHTML及XML,这些Unicode字符的码位可以表示为十进制或十六进制。语法如下:
字符U+0026 (&), 后跟随U+0023 (#),后跟随下列选择之一:
- 一个或更多十进制数字0(U+0030)到9(U+0039);
- 字符U+0078 (x)后跟随一个或更多个十六进制数字, 包括从0 (U+0030)到9(U+0039), 大写拉丁字母从A (U+0041)到F (U+0046), 小写拉丁字母从a(U+0061)到f(U+0066);
上述两种选择情形之后,跟随字符U+003B (;)。 老的版本的HTML不支持十六进制表示法.
另外一种字符引用被称作*字符实体引用,*允许字符用其名字而不是码位的值来引用。HTML定义了一些字符实体,但是并不多;其它字符只能直接用NCR来引用。
如何转译解码成真实字符串
你可能会搜到很多如下的方案:
var regex_num_set = /&#(\d+);/g;
var strJapanese = "Here is some Japanese text: みなさん、"
strJapanese = strJapanese.replace(regex_num_set, function(_, $1) {
return String.fromCharCode($1);
});
document.write('<pre>'+JSON.stringify(strJapanese,0,3));
但是你会发现它的正则只是转译了10进制,对十六进制的(类似:域名出售
)并没有效果。
然后你就开始寻找发现搜NCR相关的并不那么容易找到答案;
要改一下正则兼容?十六进制转是进制等?等等……
再深入探索html entity decode相关的,于是在github找到了想要的。
符合的精简库:https://github.com/humanmade/simple-entity-decode
另外比较齐全的库:https://github.com/mathiasbynens/he
其他参考:
https://www.cnblogs.com/shishm/archive/2011/11/24/2261996.html
https://www.w3.org/TR/2017/WD-html52-20170228/syntax.html#character-references
标签:字符,HTML,NCR,character,&#,Unicode,字符串 From: https://blog.51cto.com/u_16264254/7479162