String.Replace来自ItextSharp的数据

时间:2015-10-13 16:38:20

标签: c# pdf character-encoding itextsharp itext

我正在使用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转换没有什么区别(请参阅下面的截图 - 替换函数后的断点,但文本仍然存在):

Shows the result of the string replace in the text visualiser

修改

以下是sample file的链接。在记事本或++中打开时,它会显示一系列空格和连字符(请参阅带有空格渲染的npp屏幕截图)。但是,当在c#中读取时,此文件不会被解释为unicode连字符和Unicode空间。 enter image description here

1 个答案:

答案 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: 字符编码绝对正常,并非所有连字符都相同。