:: Не фоксом единым
Заменить лишние символы, C#
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
В программе есть такой код:

result = result.Replace("•", "*");
result = result.Replace("‹", "<");
result = result.Replace("›", ">");
result = result.Replace("™", "(tm)");
result = result.Replace("©", "(c)");
result = result.Replace("®", "(r)");
result = result.Replace("", ": )"); // в программе - без пробела между двоеточием и скобкой
result = result.Replace(";)", "; )"); // просто движок сайта преобразовывает в картинку

Не красиво и не универсально. Есть какая то библиотека, которая производит подобные преобразования?

И ещё вопрос. "" - это &#128522; Это ведь не UTF-8? Как можно все не UTF-8 символы в строке заменить на что то (например, на ?)?



Исправлено 3 раз(а). Последнее : S-type, 19.01.17 14:48
Ratings: 0 negative/0 positive
Re: Заменить лишние символы, C#
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
1. В чём именно видится "некрасивость"? Хочешь вынести настройку "что на что менять" в отдельную сущность? Ну, это можно, но кода существенно меньше не станет - инициализация соответствующего Dictionary<string, string> или там string[,] плюс цикл по нему потом... Ну да, можно сразу из какого специального xml-я считывать "замены" и по ним цикл крутить.
2. Если result это экземпляр класса string, то стоит подумать о его замене на StringBuilder - с целью оптимизации. Кроме того стоит подумать о замене .Replace(string, string) на .Replace(char, char) для "односимвольных" замен - с той же целью.
3. Юникодные смайлики вполне себе допустимы и в utf-8. В этой кодировке вообще помещается весь юникод. Соответственно в дотнетовском string в принципе не может быть ничего что было бы "не utf-8".


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Заменить лишние символы, C#
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Igor Korolyov
1. В чём именно видится "некрасивость"?
В том, что после года работы список символов, которым производится замена, пришлось дополнить. Ещё через какое то время встретится какой то ещё символ - и опять придётся программу доделывать. IMHO, нехорошо.

Igor Korolyov
Хочешь вынести настройку "что на что менять" в отдельную сущность? Ну, это можно, но кода существенно меньше не станет - инициализация соответствующего Dictionary<string, string> или там string[,] плюс цикл по нему потом... Ну да, можно сразу из какого специального xml-я считывать "замены" и по ним цикл крутить.
Даже, если создам Dictionary/ вынесем всё куда то в настройки - где взять таблицу, как его раз и на всегда заполнить весь список символов?

Igor Korolyov
3. Юникодные смайлики вполне себе допустимы и в utf-8. В этой кодировке вообще помещается весь юникод. Соответственно в дотнетовском string в принципе не может быть ничего что было бы "не utf-8".

Внутри C# к юникодовому смайлику "&#128522;" претензий нет. Проблема в том, потом вызывается Redmine, а он этот символ "переварить" не может. Можно как то все не UTF-8 символы "выкусить"?

Кстати, а можно как то внутри программы написать "&#128522;"? Что бы не было символа "смайлик"?

string s0 = ""; // так работает, но хочется заменить на код
string s1 = "\u128522"; // это что то не то
string s2 = "\x128522"; // опять что то не то
string s3 = "__128522"; // как?



Исправлено 4 раз(а). Последнее : S-type, 19.01.17 16:32
Ratings: 0 negative/0 positive
Re: Заменить лишние символы, C#
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
S-type
Проблема в том, потом вызывается Redmine, а он этот символ "переварить" не может. Можно как то все не UTF-8 символы "выкусить"?
Ещё раз данный символ это КОРРЕКТНЫЙ юникодный, а значит и utf-8 символ.
graphemica.com
В utf-8 это будет последовательность 4-х байт 0xF0, 0x9F, 0x98, 0x8A
Очевидно что Redmine некорректно воспринимает вовсе не "не UTF-8 символ", а именно что самый что ни на есть допустимый utf-8 символ. Может быть подлежащая БД не в юникоде работает, может он сам где-то конвертирует тексты в какую-то из старых кодировок...

И если исправить Redmine либо его настройки никак нельзя, то нужно определить с какой именно кодировкой он работает (что "допустимо"), и убирать все символы недопустимые для этой конкретной кодировки (после чего уже "очищенный" string перевести в последовательность байт utf-8 кодировки, если интерфейс взаимодействия так требует).
Тут всё подробно описано, включая примеры (читать раздел Choosing a Fallback Strategy).

S-type
Кстати, а можно как то внутри программы написать "&#128522;"? Что бы не было символа "смайлик"?
"\U0001f60a"
В hex виде, и "длинно" писать нужно такую escape-последовательность. Только на самом деле это всё вообще не нужно, т.к. задачу решать надо иначе


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Заменить лишние символы, C#
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Покопались в логах Redmin-а, дошли до вот такого сообщения:

Цитата:
ActiveRecord::StatementInvalid (Mysql2::Error: Incorrect string value: '\xF0\x9F\x98\x8A! ...' for column 'description' at row 1: INSERT INTO `issues` (`start_date`, `project_id`, `tracker_id`, `status_id`, `subject`, `description`, `priority_id`, `assigned_to_id`, `updated_on`, `created_on`) VALUES ('2016-12-22', 100, 7, 2, ' О размещении', ' ! ;) ', 4, 1236, '2016-12-22 08:46:37', '2016-12-22 08:46:37'):
app/models/issue.rb:182:in `create_or_update'
app/controllers/issues_controller.rb:151:in `create'
lib/redmine/sudo_mode.rb:63:in `sudo_mode'

В общем, в очередной раз подтверждается гениальность Igor Korolyov.

Попытался выполнить insert из heidiSQL, вижу:

[attachment 26907 s4.png]

при этом запись добавляется в базу.



Исправлено 1 раз(а). Последнее : S-type, 20.01.17 14:52
Ratings: 0 negative/0 positive
Re: Заменить лишние символы, C#
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Вот такая указана кодировка для таблицы:

[attachment 26908 s5.png]
Ratings: 0 negative/0 positive
Re: Заменить лишние символы, C#
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Это косячная реализация в мускуле. Советуют переходить на исправленную utf8mb4... Конечно если сервер позволяет
mathiasbynens.be


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Заменить лишние символы, C#
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Сервер то позволяет, но, IMHO, это не нужно - Redmine уже несколько лет работает отлично, а символы, вызывающие проблемы, встречаются в письмах от особо "продвинутых" пользователей очень редко (если точно - последняя проблема была больше года назад).

Программа на C# преобразует письма в задачи Redmin-а. Соответственно, если отфильтровать "лишние" символы, то оставшегося текста вполне хватит для понимания сути письма. На сколько понял из документации по mySql, проблема только с четрёх байтными символами. Одно, двух и трёхбайтные проблем не вызывают. Подозреваю, что String.Replace() не поможет - буду думать, как "выкусить" четырёхбайтные символы.
Ratings: 0 negative/0 positive
Re: Заменить лишние символы, C#
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Хозяин-барин. Не хочешь по простому поменять кодировку сервера, ищи сложные и медленные пути по фильтрации текста
Вот тут к примеру нечто подобное обсуждается...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Заменить лишние символы, C#
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Igor Korolyov
Вот тут к примеру нечто подобное обсуждается...

Спасибо за наводку!
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 6 (Гостей: 6)

© 2000-2024 Fox Club 
Яндекс.Метрика