То, что вы действительно хотите сделать, это сначала декодировать строку, а затем кодировать снова. Не пытайтесь исправлять закодированную строку.
Любая кодировка имеет смысл только в том случае, если ее можно легко декодировать, поэтому используйте эту логику, чтобы упростить свою жизнь. И ваше программное обеспечение менее подвержено ошибкам.
Теперь, если вы не уверены, закодирована ли строка или нет - проблема, скорее всего, будет не в самой строке, а в экосистеме, которая ее вызвала. Откуда ты это взял? Через кого он прошел, прежде чем до тебя дошло? Вы в это верите?
Если вам действительно придется прибегнуть к созданию функции magic-fix-weird-data, подумайте о создании таблицы "кодировок" и соответствующих им символов:
& -> &
€ -> €
< -> <
// etc.
Затем сначала декодирует все встречающиеся кодировки в соответствии с таблицей, а затем перекодирует всю строку. Конечно, вы могли бы получить более эффективные методы, когда шарить без предварительного декодирования. Но ты не будешь в здравом уме в следующем году. И это ваш перевозчик, верно? Вам нужно оставаться прямо в голове! Вы сойдете с ума, если попытаетесь быть слишком умным. И ты потеряешь свою работу, когда сойдешь с ума. Печальные вещи случаются с людьми, которые позволяют своим хакерам разрушать их умы ...
РЕДАКТИРОВАТЬ: Использование библиотеки .NET, конечно, спасет вас от безумия:
Я только что проверил это, и, похоже, нет проблем с декодированием строк с использованием только амперсандов в них. Итак, вперед:
string magic(string encodedOrNot)
{
var decoded = HttpUtility.HtmlDecode(encodedOrNot);
return HttpUtility.HtmlEncode(decoded);
}
EDIT # 2 : Оказывается, что декодер HttpUtility.HtmlDecode
будет работать для вашей цели, но кодер не будет, так как вам не нужны угловые скобки (<
, >
) для кодирования. Но написать кодировщик действительно легко:
define encoder(string decoded):
result is a string-builder
for character in decoded:
if character in encoding-table:
result.append(encoding-table[character])
else:
result.append(character)
return result as string