我正在使用ItextSharp从pdf中读取数据。检查结果字符串看起来是正确的,但是string.Replace无法替换文本。
因此,我猜这是某种编码问题,但我没有把它固定下来。
我从PDF导入文本的代码应转换为UTF8
PdfReader pdfReader = new PdfReader("file.pdf");
for (int page = 1; page <= pdfReader.NumberOfPages; page++)
{
ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
string currentText = PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy);
currentText = Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(currentText)));
text.AppendLine(currentText);
}
pdfReader.Close();
然后我试图将三个连字符和一个空格( - - )替换成只有3个连字符(---)
input = input.Replace("-- -", "---");
从PDF导入中删除utf8转换没有什么区别(请参阅下面的截图 - 替换函数后的断点,但文本仍然存在):
修改
以下是sample file的链接。在记事本或++中打开时,它会显示一系列空格和连字符(请参阅带有空格渲染的npp屏幕截图)。但是,当在c#中读取时,此文件不会被解释为unicode连字符和Unicode空间。
答案 0 :(得分:0)
事实证明,ITextSharp或源PDF正在使用一种称为软夸大的东西来代表标准的宣传,所以虽然记事本,记事本++和Visual Studio文本可视化器都将软宣传作为标准的宣传,但它们不是相同的字符,这就是String.Replace不执行任何替换的原因。
根据我对软连字符的理解,通常不应该渲染,这在尝试将字符粘贴到网络浏览器或其他程序(如charmap)甚至视觉工作室本身时会导致奇怪的行为。
这产生了以下工作代码:
input = input.Replace(" ", "---");
在Firefox上,这会使用三个连字符替换空格,但会粘贴到记事本显示中(这表明了我的真实意图)。
input = input.Replace("-- -", "---");
https://en.wikipedia.org/wiki/Soft_hyphen
Soft Hyphen: http://www.fileformat.info/info/unicode/char/ad/index.htm
连字符(标准连字符) http://www.fileformat.info/info/unicode/char/2010/index.htm
我的解决方案是添加以下行:
input = input.Replace((char)173, '-');
TL; DR: 字符编码绝对正常,并非所有连字符都相同。