2023年8月1日发(作者:)

#x开头的是什么编码?⾸先说明,这不是编码在使⽤readability的api提取⽹页内容的时候点这⾥看-readability-⽹页内容提取利器,中⽂内容都是&#x开头的⼀堆乱码似的东西。但保存成⽹页⽂件后,浏览器是可以正常显⽰的~形如&name;&#dddd;&#xhhhh;的⼀串字符是 HTML、XML 等 SGML 类语⾔的转义序列(escape sequence)。它们不是「编码」。以 HTML 为例,这三种转义序列都称作character reference:第⼀种是 character entity reference,后接预先定义的 entity 名称,⽽ entity 声明了⾃⾝指代的字符。后两种是 numeric character reference(NCR),数字取值为⽬标字符的 Unicode code point;以「&#」开头的后接⼗进制数字,以「&#x」开头的后接⼗六进制数字。从 HTML 4 开始,NCR 以 Unicode 为准,与⽂档编码⽆关。「中国」⼆字分别是 Unicode 字符 U+4E2D 和 U+56FD,⼗六进制表⽰的code point 数值「4E2D」和「56FD」就是⼗进制的「20013」和「22269」。所以我给加了空格,不然⽹页会⾃动渲染成⽂字...&#x 4e2d;&#x 56fd;&# 20013;&# 22269;这两种 NCR 写法都会在显⽰时转换为「中国」⼆字。NCR 可以⽤于转义任何 Unicode 字符,⽽ character entity reference 很受限,参见HTML 4 和 HTML5 中已有定义的字符列表:Character entity references in HTML 4Character entity references in HTML5知道了是什么,现在来看怎么把它转回成中⽂呢?Python实现要将16进制字符转成中⽂可以⽤如下⽅法# Pythone3b'u4e2du6587'.decode('unicode-escape')# Python2'u4e2du6587'.decode('unicode-escape')故需要将&#xhhhh;做替换,再⽤上⾯的⽅式进⾏转换。对于特殊符号(如加减乘除),会显⽰为&#xhh,后⾯只有两位,在转换之前,需要提前补全。具体可参看readability-⽹页内容提取利器Java实现引⽤此处:/blog/2155114package ;

import edWriter;

import iter;

import ption;

import medURLException;

import ;

import ;

import r;

import n;

import ntException;

import eaner;

import e;

import rException;

public class Test {

public static void main(String[] args) throws IOException, DocumentException, XPatherException {

// 定义正则表达式来搜索中⽂字符的转义符号

Pattern compile = e("&#.*?;");

// 测试⽤中⽂字符

String sourceString = "C集团天c津⼤唐国际盘⼭发电有限责任公司";

Matcher matcher = r(sourceString);

// 循环搜索 并转换 替换

while (()) {

String group = ();

// 获得16进制的码

String hexcode = "0" + eAll("(&#|;)", "");

// 字符串形式的16进制码转成int并转成char 并替换到源串中

sourceString = eAll(group, (char) (hexcode).intValue() + "");

}

n(sourceString);

}

}

补充:后来想到,其实可以把这当成html来解析啊,然后就有了:text = '&#x 4e2d'ring(text).text

2023年8月1日发(作者:)

#x开头的是什么编码?⾸先说明,这不是编码在使⽤readability的api提取⽹页内容的时候点这⾥看-readability-⽹页内容提取利器,中⽂内容都是&#x开头的⼀堆乱码似的东西。但保存成⽹页⽂件后,浏览器是可以正常显⽰的~形如&name;&#dddd;&#xhhhh;的⼀串字符是 HTML、XML 等 SGML 类语⾔的转义序列(escape sequence)。它们不是「编码」。以 HTML 为例,这三种转义序列都称作character reference:第⼀种是 character entity reference,后接预先定义的 entity 名称,⽽ entity 声明了⾃⾝指代的字符。后两种是 numeric character reference(NCR),数字取值为⽬标字符的 Unicode code point;以「&#」开头的后接⼗进制数字,以「&#x」开头的后接⼗六进制数字。从 HTML 4 开始,NCR 以 Unicode 为准,与⽂档编码⽆关。「中国」⼆字分别是 Unicode 字符 U+4E2D 和 U+56FD,⼗六进制表⽰的code point 数值「4E2D」和「56FD」就是⼗进制的「20013」和「22269」。所以我给加了空格,不然⽹页会⾃动渲染成⽂字...&#x 4e2d;&#x 56fd;&# 20013;&# 22269;这两种 NCR 写法都会在显⽰时转换为「中国」⼆字。NCR 可以⽤于转义任何 Unicode 字符,⽽ character entity reference 很受限,参见HTML 4 和 HTML5 中已有定义的字符列表:Character entity references in HTML 4Character entity references in HTML5知道了是什么,现在来看怎么把它转回成中⽂呢?Python实现要将16进制字符转成中⽂可以⽤如下⽅法# Pythone3b'u4e2du6587'.decode('unicode-escape')# Python2'u4e2du6587'.decode('unicode-escape')故需要将&#xhhhh;做替换,再⽤上⾯的⽅式进⾏转换。对于特殊符号(如加减乘除),会显⽰为&#xhh,后⾯只有两位,在转换之前,需要提前补全。具体可参看readability-⽹页内容提取利器Java实现引⽤此处:/blog/2155114package ;

import edWriter;

import iter;

import ption;

import medURLException;

import ;

import ;

import r;

import n;

import ntException;

import eaner;

import e;

import rException;

public class Test {

public static void main(String[] args) throws IOException, DocumentException, XPatherException {

// 定义正则表达式来搜索中⽂字符的转义符号

Pattern compile = e("&#.*?;");

// 测试⽤中⽂字符

String sourceString = "C集团天c津⼤唐国际盘⼭发电有限责任公司";

Matcher matcher = r(sourceString);

// 循环搜索 并转换 替换

while (()) {

String group = ();

// 获得16进制的码

String hexcode = "0" + eAll("(&#|;)", "");

// 字符串形式的16进制码转成int并转成char 并替换到源串中

sourceString = eAll(group, (char) (hexcode).intValue() + "");

}

n(sourceString);

}

}

补充:后来想到,其实可以把这当成html来解析啊,然后就有了:text = '&#x 4e2d'ring(text).text