当前位置:  开发笔记 > 编程语言 > 正文

C#如何用直引号替换微软的智能报价?

如何解决《C#如何用直引号替换微软的智能报价?》经验,为你挑选了4个好方法。

我的帖子下面询问了什么是卷曲引号以及为什么我的应用程序无法使用它们,我现在的问题是如何在我的程序遇到它们时替换它们,我怎样才能在C#中执行此操作?他们是特殊人物吗?

卷曲带的标志-VS-方报价的标志 - 什么 - 给

谢谢



1> Nick van Esc..:

更广泛的有问题的单词字符列表

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', '\"');


我很好奇,有没有人做过性能测试,显示.IndexOf()比不包含字符的字符串上运行.Replace()便宜?
最便宜的操作是迭代一次字符串,而不是迭代最多2 *个寻址的字符。例如:`foreach(char c in buffer){/ *如果要替换列表中的char,请替换* /}`。

2> Matthew Rust..:

当我遇到这个问题时,我在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;
    }
}

这只是用正常的引号替换愚蠢的"智能引号".

[编辑]固定也支持替换'双智能报价'.



3> 小智..:

为了扩展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


嗨芭芭拉.对答案有用的补充,但这更适合作为对现有答案的建议编辑而不是新答案.

4> Rob Kennedy..:

请注意,您所拥有的本质上是一个损坏的CSV文件.不加思索地用直引号替换所有印刷者的引号不一定会修复你的文件.如你所知,一些印刷师的引用应该在那里,作为一个领域价值的一部分.用直引号替换它们可能也不会为您留下有效的CSV文件.

我认为没有一种算法来修复以您描述的方式损坏的文件.您可以更好地花时间调查如何首先获得此类无效文件,然后停止它.例如,是否有人使用Word来编辑您的数据文件?

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有