Подтвердить что ты не робот

С# Как заменить Microsoft Smart Quotes прямыми кавычками?

Мое сообщение ниже спросило, каковы фигурные кавычки и почему мое приложение не работает с ними, теперь мой вопрос заключается в том, как я могу их заменить, когда моя программа сталкивается с ними, как я могу это сделать на С#? Являются ли они особыми символами?

curly-quotation-marks-vs-square-quotation-marks-what-gives

Спасибо

4b9b3361

Ответ 1

Более подробный список проблемных словных символов

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

Ответ 2

Когда я столкнулся с этой проблемой, я написал метод расширения для класса 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;
    }
}

Это просто заменяет глупые "умные кавычки" обычными кавычками.

[EDIT] Исправлено также для поддержки замены "двойных умных кавычек".

Ответ 3

Обратите внимание, что то, что у вас есть, является коррумпированным CSV файлом. Без разбора заменяя все котировки типографов прямыми кавычками, не обязательно будет исправлять ваш файл. Насколько вам известно, некоторые цитаты типографа должны были быть там, как часть значения поля. Замена их прямыми кавычками может также не оставить вас с допустимым CSV файлом.

Я не думаю, что есть алгоритмический способ исправить файл, который поврежден в том, как вы описываете. Ваше время может быть лучше потрачено на исследование того, как вы попадаете в такие недопустимые файлы, а затем остановите его. Кто-нибудь использует Word для редактирования ваших файлов данных, например?

Ответ 4

Чтобы распространить на популярный ответ Ника ван Эша, вот код с именами символов в комментариях.

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

Ответ 5

В соответствии с приложением "Карта символов", которое поставляется с Windows, значения Unicode для фигурных котировок равны 0x201c и 0x201d. Замените эти значения прямой цитатой 0x0022, и вам должно быть хорошо идти.

String.Replace(0x201c, '"');
String.Replace(0x201d, '"');

Ответ 6

У меня есть большая большая... программа... это делает именно это. Вы можете вырвать script и использовать его при вашем удержании. Он выполняет всевозможные замены и находится в http://bitbucket.org/nesteruk/typografix

Ответ 7

Эквивалент VB того, что написал @Matthew:

Public Module StringExtensions

    <Extension()>
    Public Function StripIncompatableQuotes(BadString As String) As String
        If Not String.IsNullOrEmpty(BadString) Then
            Return BadString.Replace(ChrW(&H2018), "'").Replace(ChrW(&H2019), "'").Replace(ChrW(&H201C), """").Replace(ChrW(&H201D), """")
        Else
            Return BadString
        End If
    End Function
End Module

Ответ 8

Попробуйте это для умных одиночных кавычек, если выше не работают:

string.Replace("\342\200\230", "'")
string.Replace("\342\200\231", "'")

Попробуйте это также для умных двойных кавычек:

string.Replace("\342\200\234", '"')
string.Replace("\342\200\235", '"')

Ответ 9

У меня также есть программа, которая делает это, источник находится в этот файл CP-1252 Fixer. Он дополнительно определяет некоторые сопоставления для преобразования символов в строки RTF, сохраняя при этом все форматирование, которые могут быть полезны для некоторых.

Это также полное отображение всех символов "умной кавычки" их коллегам с низким уровнем ascii, кодов объектов и ссылок на символы.

Ответ 10

это сработало для меня, вы можете попробовать под кодом

string replacedstring = ("your string with smart quotes").Replace('\u201d', '\'');

Спасибо!