首页 > 其他分享 >NCR 字符串转成真实字符显示

NCR 字符串转成真实字符显示

时间:2023-09-15 11:06:51浏览次数:35  
标签:字符 HTML NCR character &# Unicode 字符串

遇到以&#开头的特殊字符串

开发过程中遇到了一种奇怪的字符串,以&#开头,如下:

久精品

于是查询了下发现是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以及派生的如HTMLXML中常见的一种转义序列结构,用来表示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));

来自https://stackoverflow.com/questions/35501026/converting-numeric-character-reference-to-actual-character

但是你会发现它的正则只是转译了10进制,对十六进制的(类似:&#x57DF;&#x540D;&#x51FA;&#x552E;)并没有效果。

然后你就开始寻找发现搜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

相关文章

  • mysql 字段前两位替换成其他字符 mysql字符替换函数
    一、字符串处理函数1、REPLACE()字符串替换语法:REPLACE(str,old_str,new_str);含义:将str中的old_str替换为new_str字符串。注意:当搜索要替换的文本时,MySQL使用区分大小写匹配来执行要替换的字符串搜索。示例:将"helloworld!"中hello字符串替换为hi。SELECTREPLACE('hel......
  • springmvc中在web.xml中设置过滤器,排去字符乱码
    2023-09-14web.xml<!--设置编码格式,解决字符乱码--><filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param>......
  • Golang字符串拼接性能
    问题引入Golang中的string类型是只读且不可变的。因此通过循环字符串切片拼接字符串的方式会导致大量的string创建、销毁和内存分配解决方法通过bytes.Buffer优化使用varbsbytes.Buffer存放最终拼接好的字符串,一定程度上避免了string每进行一次拼接都重新申请内存空间的问题但依......
  • C++字符串
      1,2这个形式的字符串数组,就和普通数组一样,定义后面的大括号,里面装着每个具体的值,然后3,4直接表示出来,然后其实直接3就OK了,4可能是为了方便看。   字符串数组输入部分1.这个。。先把字符串数组定义好,然后使用cin直接输入进去2.如果想要读入包含空格键之类字符串的话......
  • 字符串的拼接与输出
    研究字符串的拼接原理,字符串的拼接可以使用字符‘+’来进行操作的,任何的基础数据与字符串相加拼接成一个新的字符串,为了更好的理解字符串的拼接,我们进行测试源代码:publicclassMain{publicstaticvoidmain(String[]args){System.out.println("abc"+1.0+0.42)......
  • Java生成Json字符串
    publicclassTest01{publicstaticvoidmain(String[]args){//StringBuilderresponseMsg=newStringBuilder();//responseMsg.append("");//responseMsg.append("");//System.out.println(responseMsg.leng......
  • 字符串
    字符串基础操作正序for(inti=0;i<len;i++)//数组第一个数下标为零,最后一个数n下标为n-1倒序for(inti=len-1;i>=0;i--)函数输入一行(字符串)strings;getline(cin,s)//cin吞空格,getline不吞字符串拼接strings1,s2;s1+=s2;//将......
  • 遍历输入框时出现输入一个字符立刻失焦,无法正常输入
    原因:循环时绑定输入框值为key,双向绑定时改变输入框值,key值被修改则失焦。解决:动态值不要作为key值 ......
  • 字符串转hash值
    需求:将中文字符串转为对应的hash值packageutil;importjava.nio.charset.StandardCharsets;importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException;/***@Author:ZD*@Date:2023/8/29*/publicclassHashUtil{publicstaticlo......
  • 字符串小练习
    AC自动机P2414题目描述:阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机。打字机上只有\(28\)个按键,分别印有\(26\)个小写英文字母和B、P两个字母。经阿狸研究发现,这个打字机是这样工作的:输入小写字母,打字机的一个凹槽中会加入这个字母(这个字母加在凹槽的......