2023年8月1日发(作者:)
#x开头的是什么编码?⾸先说明,这不是编码在使⽤readability的api提取⽹页内容的时候点这⾥看-readability-⽹页内容提取利器,中⽂内容都是开头的⼀堆乱码似的东西。但保存成⽹页⽂件后,浏览器是可以正常显⽰的~形如&name;dddd;hhhh;的⼀串字符是 HTML、XML 等 SGML 类语⾔的转义序列(escape sequence)。它们不是「编码」。以 HTML 为例,这三种转义序列都称作character reference:第⼀种是 character entity reference,后接预先定义的 entity 名称,⽽ entity 声明了⾃⾝指代的字符。后两种是 numeric character reference(NCR),数字取值为⽬标字符的 Unicode code point;以「」开头的后接⼗进制数字,以「」开头的后接⼗六进制数字。从 HTML 4 开始,NCR 以 Unicode 为准,与⽂档编码⽆关。「中国」⼆字分别是 Unicode 字符 U+4E2D 和 U+56FD,⼗六进制表⽰的code point 数值「4E2D」和「56FD」就是⼗进制的「20013」和「22269」。所以我给加了空格,不然⽹页会⾃动渲染成⽂字... 4e2d; 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')故需要将hhhh;做替换,再⽤上⾯的⽅式进⾏转换。对于特殊符号(如加减乘除),会显⽰为hh,后⾯只有两位,在转换之前,需要提前补全。具体可参看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 = ' 4e2d'ring(text).text
2023年8月1日发(作者:)
#x开头的是什么编码?⾸先说明,这不是编码在使⽤readability的api提取⽹页内容的时候点这⾥看-readability-⽹页内容提取利器,中⽂内容都是开头的⼀堆乱码似的东西。但保存成⽹页⽂件后,浏览器是可以正常显⽰的~形如&name;dddd;hhhh;的⼀串字符是 HTML、XML 等 SGML 类语⾔的转义序列(escape sequence)。它们不是「编码」。以 HTML 为例,这三种转义序列都称作character reference:第⼀种是 character entity reference,后接预先定义的 entity 名称,⽽ entity 声明了⾃⾝指代的字符。后两种是 numeric character reference(NCR),数字取值为⽬标字符的 Unicode code point;以「」开头的后接⼗进制数字,以「」开头的后接⼗六进制数字。从 HTML 4 开始,NCR 以 Unicode 为准,与⽂档编码⽆关。「中国」⼆字分别是 Unicode 字符 U+4E2D 和 U+56FD,⼗六进制表⽰的code point 数值「4E2D」和「56FD」就是⼗进制的「20013」和「22269」。所以我给加了空格,不然⽹页会⾃动渲染成⽂字... 4e2d; 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')故需要将hhhh;做替换,再⽤上⾯的⽅式进⾏转换。对于特殊符号(如加减乘除),会显⽰为hh,后⾯只有两位,在转换之前,需要提前补全。具体可参看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 = ' 4e2d'ring(text).text
发布评论