我的帖子下面询问了什么是卷曲引号以及为什么我的应用程序无法使用它们,我现在的问题是如何在我的程序遇到它们时替换它们,我怎样才能在C#中执行此操作?他们是特殊人物吗?
卷曲带的标志-VS-方报价的标志 - 什么 - 给
谢谢
更广泛的有问题的单词字符列表
if (buffer.IndexOf('\u2013') > -1) buffer = buffer.Replace('\u2013', '-'); if (buffer.IndexOf('\u2014') > -1) buffer = buffer.Replace('\u2014', '-'); if (buffer.IndexOf('\u2015') > -1) buffer = buffer.Replace('\u2015', '-'); if (buffer.IndexOf('\u2017') > -1) buffer = buffer.Replace('\u2017', '_'); if (buffer.IndexOf('\u2018') > -1) buffer = buffer.Replace('\u2018', '\''); if (buffer.IndexOf('\u2019') > -1) buffer = buffer.Replace('\u2019', '\''); if (buffer.IndexOf('\u201a') > -1) buffer = buffer.Replace('\u201a', ','); if (buffer.IndexOf('\u201b') > -1) buffer = buffer.Replace('\u201b', '\''); if (buffer.IndexOf('\u201c') > -1) buffer = buffer.Replace('\u201c', '\"'); if (buffer.IndexOf('\u201d') > -1) buffer = buffer.Replace('\u201d', '\"'); if (buffer.IndexOf('\u201e') > -1) buffer = buffer.Replace('\u201e', '\"'); if (buffer.IndexOf('\u2026') > -1) buffer = buffer.Replace("\u2026", "..."); if (buffer.IndexOf('\u2032') > -1) buffer = buffer.Replace('\u2032', '\''); if (buffer.IndexOf('\u2033') > -1) buffer = buffer.Replace('\u2033', '\"');
当我遇到这个问题时,我在C#中为String类编写了一个扩展方法.
public static class StringExtensions { public static string StripIncompatableQuotes(this string s) { if (!string.IsNullOrEmpty(s)) return s.Replace('\u2018', '\'').Replace('\u2019', '\'').Replace('\u201c', '\"').Replace('\u201d', '\"'); else return s; } }
这只是用正常的引号替换愚蠢的"智能引号".
[编辑]固定也支持替换'双智能报价'.
为了扩展Nick van Esch的流行答案,这里是注释中包含字符名称的代码.
if (buffer.IndexOf('\u2013') > -1) buffer = buffer.Replace('\u2013', '-'); // en dash if (buffer.IndexOf('\u2014') > -1) buffer = buffer.Replace('\u2014', '-'); // em dash if (buffer.IndexOf('\u2015') > -1) buffer = buffer.Replace('\u2015', '-'); // horizontal bar if (buffer.IndexOf('\u2017') > -1) buffer = buffer.Replace('\u2017', '_'); // double low line if (buffer.IndexOf('\u2018') > -1) buffer = buffer.Replace('\u2018', '\''); // left single quotation mark if (buffer.IndexOf('\u2019') > -1) buffer = buffer.Replace('\u2019', '\''); // right single quotation mark if (buffer.IndexOf('\u201a') > -1) buffer = buffer.Replace('\u201a', ','); // single low-9 quotation mark if (buffer.IndexOf('\u201b') > -1) buffer = buffer.Replace('\u201b', '\''); // single high-reversed-9 quotation mark if (buffer.IndexOf('\u201c') > -1) buffer = buffer.Replace('\u201c', '\"'); // left double quotation mark if (buffer.IndexOf('\u201d') > -1) buffer = buffer.Replace('\u201d', '\"'); // right double quotation mark if (buffer.IndexOf('\u201e') > -1) buffer = buffer.Replace('\u201e', '\"'); // double low-9 quotation mark if (buffer.IndexOf('\u2026') > -1) buffer = buffer.Replace("\u2026", "..."); // horizontal ellipsis if (buffer.IndexOf('\u2032') > -1) buffer = buffer.Replace('\u2032', '\''); // prime if (buffer.IndexOf('\u2033') > -1) buffer = buffer.Replace('\u2033', '\"'); // double prime
请注意,您所拥有的本质上是一个损坏的CSV文件.不加思索地用直引号替换所有印刷者的引号不一定会修复你的文件.如你所知,一些印刷师的引用应该在那里,作为一个领域价值的一部分.用直引号替换它们可能也不会为您留下有效的CSV文件.
我认为没有一种算法来修复以您描述的方式损坏的文件.您可以更好地花时间调查如何首先获得此类无效文件,然后停止它.例如,是否有人使用Word来编辑您的数据文件?