Основной проблемой является влияние Response.Codepage на сообщения в форме.
Когда вы отправляете клиенту форму с указанием, что контент закодирован как UTF-8, браузер будет предполагать, что контент постов формы должен быть отправлен в кодировке UTF-8.
Теперь страница действий, которая получает сообщение, будет (несколько нелогично) использовать значение Response.Codepage
, чтобы сообщить ему, как кодируются символы в сообщении. Это не очевидно, потому что мы склонны считать, что отправитель определяет кодировку того, что он отправляет. Также не является естественным скачком думать, что свойство, связанное с кодировкой того, что мы хотим отправить в нашем ответе, будет иметь какое-либо отношение к тому, как получен первоначальный запрос. В этом случае это так.
Что происходит, если ваша форма публикует версию символа в кодировке UTF-8, но на странице, которая получает, не задана страница Response.Code для 65001 (кодовая страница UTF-8). Вероятно, он установлен на системную кодовую страницу OEM, например 1252. Следовательно, кодировка UTF-8 для символа интерпретируется как два отдельных символа.
Мои рекомендации по хорошей обработке символов в ASP: -
- Сохранить все страницы как UTF-8
- Включить <% @ codepage = 65001 вверху всех страниц </li>
- Включить <% Response.CharSet = "UTF-8"%> вверху всех страниц
- Хранение опубликованных данных в типе поля Юникод, например, тип сервера SQL Server NVARCHAR.
Здесь важно то, что перед чтением значений формы на странице ASP необходимо убедиться, что для Response.Codepage задана кодовая страница, соответствующая кодировке отправителей, и это не происходит автоматически.