最近將一個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;
}