Заменить лишние символы, C# | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
В программе есть такой код:
Не красиво и не универсально. Есть какая то библиотека, которая производит подобные преобразования? И ещё вопрос. "" - это 😊 Это ведь не UTF-8? Как можно все не UTF-8 символы в строке заменить на что то (например, на ?)? Исправлено 3 раз(а). Последнее : S-type, 19.01.17 14:48 |
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 |
Re: Заменить лишние символы, C# | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
В том, что после года работы список символов, которым производится замена, пришлось дополнить. Ещё через какое то время встретится какой то ещё символ - и опять придётся программу доделывать. IMHO, нехорошо. Даже, если создам Dictionary/ вынесем всё куда то в настройки - где взять таблицу, как его раз и на всегда заполнить весь список символов?
Внутри C# к юникодовому смайлику "😊" претензий нет. Проблема в том, потом вызывается Redmine, а он этот символ "переварить" не может. Можно как то все не UTF-8 символы "выкусить"? Кстати, а можно как то внутри программы написать "😊"? Что бы не было символа "смайлик"?
Исправлено 4 раз(а). Последнее : S-type, 19.01.17 16:32 |
Re: Заменить лишние символы, C# | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Ещё раз данный символ это КОРРЕКТНЫЙ юникодный, а значит и utf-8 символ. graphemica.com В utf-8 это будет последовательность 4-х байт 0xF0, 0x9F, 0x98, 0x8A Очевидно что Redmine некорректно воспринимает вовсе не "не UTF-8 символ", а именно что самый что ни на есть допустимый utf-8 символ. Может быть подлежащая БД не в юникоде работает, может он сам где-то конвертирует тексты в какую-то из старых кодировок... И если исправить Redmine либо его настройки никак нельзя, то нужно определить с какой именно кодировкой он работает (что "допустимо"), и убирать все символы недопустимые для этой конкретной кодировки (после чего уже "очищенный" string перевести в последовательность байт utf-8 кодировки, если интерфейс взаимодействия так требует). Тут всё подробно описано, включая примеры (читать раздел Choosing a Fallback Strategy). "\U0001f60a" В hex виде, и "длинно" писать нужно такую escape-последовательность. Только на самом деле это всё вообще не нужно, т.к. задачу решать надо иначе ------------------ WBR, Igor |
Re: Заменить лишние символы, C# | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Покопались в логах Redmin-а, дошли до вот такого сообщения:
Цитата: В общем, в очередной раз подтверждается гениальность Igor Korolyov. Попытался выполнить insert из heidiSQL, вижу: [attachment 26907 s4.png] при этом запись добавляется в базу. Исправлено 1 раз(а). Последнее : S-type, 20.01.17 14:52 |
Re: Заменить лишние символы, C# | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Вот такая указана кодировка для таблицы:
[attachment 26908 s5.png] |
Re: Заменить лишние символы, C# | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Это косячная реализация в мускуле. Советуют переходить на исправленную utf8mb4... Конечно если сервер позволяет
mathiasbynens.be ------------------ WBR, Igor |
Re: Заменить лишние символы, C# | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Сервер то позволяет, но, IMHO, это не нужно - Redmine уже несколько лет работает отлично, а символы, вызывающие проблемы, встречаются в письмах от особо "продвинутых" пользователей очень редко (если точно - последняя проблема была больше года назад).
Программа на C# преобразует письма в задачи Redmin-а. Соответственно, если отфильтровать "лишние" символы, то оставшегося текста вполне хватит для понимания сути письма. На сколько понял из документации по mySql, проблема только с четрёх байтными символами. Одно, двух и трёхбайтные проблем не вызывают. Подозреваю, что String.Replace() не поможет - буду думать, как "выкусить" четырёхбайтные символы. |
Re: Заменить лишние символы, C# | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Хозяин-барин. Не хочешь по простому поменять кодировку сервера, ищи сложные и медленные пути по фильтрации текста
Вот тут к примеру нечто подобное обсуждается... ------------------ WBR, Igor |
Re: Заменить лишние символы, C# | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Спасибо за наводку! |
© 2000-2024 Fox Club  |