最近将一个PDF文档转换成txt之后,想放在讯飞有声里听,听的时候发现,有些奇诡。
转换完的效果如下:
存在问题:1. 字符中的方框问题,读的时候磕磕绊绊,如同结巴。
2.多余的换行符问题,导致讯飞读的时候,存在过多的断句,听起来别扭。
上述方框在pdf里显示的时候不存在。
换行符用代码写一下,处理一下就好。
这个方框 本来以为通过查找替换掉就可以了,后来发现这个方框很神奇。
将第一个方框复制粘贴到一个新的txt里,结果发现是这个样子的
第二个“不”就是 原文中的 方框
每个方框都是奇怪的字符,看上去是汉字,实际上与常规的汉字看起来又有点不同。
查询了一大堆资料,参考如下帖子
大体原因是编码的问题,应该就是将编码转换成了多余的字符了,而这些字符,都不是常规的汉字字符。
通过下述网址,可以查看这些奇怪字符的编码。
http://www.mytju.com/classcode/tools/encode_utf8.asp
比如:
上述是两个看上去一样,又有点不同的字符的编码。分别是 “⽬”和 “目”,第一个是方框表示的字符,编码是2F6C,第二个是常规输入法打出的字,编码是76EE
知道了问题,接下来就是想办法把这些特殊字符移除掉。
参考如下资料
https://www.cnblogs.com/straybirds/p/6392306.html
https://blog.csdn.net/victoryckl/article/details/91536878
上面列出了常见的unicode字符编码的范围,将方框中的unicode所代表的字符类型范围内进行排除即可。比如,2F6C代表的是康熙字典部首
在代码中将2F00-2FD5范围内字符移除即可。
核心代码:
/// <summary>
/// 康熙部首范围
/// </summary>
static int[] kangxibushou = new int[] { 0x2F00, 0x2FDF };
/// <summary>
/// cjk部首范围
/// </summary>
static int[] cjkbushou = new int[] { 0x2E80, 0x2EFF };
/// <summary>
/// cjk扩展部首
/// </summary>
static int[] cjkbushou_ext = new int[] { 0x2E80, 0x2EFF };
/// <summary>
/// 彝文部首范围
/// </summary>
static int[] yiwenbushou = new int[] { 0xA490 , 0xA4CF};
//static int[] bzzf = new int[] { 0x4E00, 0x9FCB};
//兼容汉字
static int[] jrhz = new int[] { 0xF900, 0xFAD9 };
static string solveLine(string line)
{
Console.WriteLine("处理: "+line);
for(int i = line.Length-1; i >=0; i--)
{
char c = line[i];
Console.WriteLine("正在处理:{0}", c);
if (isInnerOfBushou(c, kangxibushou) || isInnerOfBushou(c, cjkbushou) ||
isInnerOfBushou(c, cjkbushou_ext) || isInnerOfBushou(c, yiwenbushou) ||
isInnerOfBushou(c,jrhz))
{
line = line.Remove(i, 1);
}
}
Console.WriteLine("处理结果: "+line);
return line;
}