Вам нужно Spring CharacterEncodingFilter
в вашем web.xml
. Вы должны убедиться, что этот фильтр является первым в файле.
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Набор символов по умолчанию URL при использовании в страницах HTML и в HTTP-заголовках называют ISO-8859-1 или латынью ISO 1.
Это не то же как UTF-8, и это не то же как ASCII, но это действительно вписывается в one-byte-per-character. Диапазон от 0 до 127 много похож на ASCII, и целый диапазон от 0 до 255 совпадает с диапазоном, 0000-00FF из Unicode.
Таким образом, можно генерировать его от строки C# путем кастинга каждого символа к байту, или можно использовать Encoding.GetEncoding("iso-8859-1")
получить объект сделать преобразование для Вас.
(В этом наборе символов британский символ фунта равняется 163.)
Фон
RFC говорит, что незакодированный текст должен быть ограничен традиционным 7-разрядным американским диапазоном ASCII, и что-либо еще (плюс специальные символы-разделители URL) должно быть закодировано. Но это оставляет открытым вопрос того, какой набор символов использовать для верхней половины 8-разрядного диапазона, делая это зависящим от контекста, в котором появляется URL.
И тот контекст определяется двумя другими стандартами, HTTP и HTML, которые действительно указывают набор символов по умолчанию, и которые вместе создают практически непреодолимую силу на реализаторах, чтобы предположить, что строка поиска содержит кодировку процента, которая относится к ISO-8859-1.
ISO-8859-1 является набором символов основанного на тексте содержания, отправленного через HTTP кроме, где иначе указано. Таким образом к тому времени, когда строка URL появляется в HTTP, ПОЛУЧАЮТ заголовок, это должно быть в ISO-8859-1.
Другой фактор - то, что HTML также использует ISO-8859-1 в качестве своего значения по умолчанию, и URL обычно происходят как ссылки в страницах HTML. Таким образом, при обработке простой минимальной страницы HTML в Блокноте URL, которые Вы вводите в тот файл, находятся в ISO-8859-1.
Это иногда описывается как "дыра" в стандартах, но это не действительно; это просто, что HTML/HTTP заполняет пробел, оставленный RFC для URL.
Следовательно, например, совет на этой странице:
Кодирование URL символа состоит из символа "%", сопровождаемого двухразрядным шестнадцатеричным представлением (нечувствительным к регистру) из латинской ISO кодовой точки для символа.
(Латынь ISO является другим названием IS-8859-1).
Так для теории. Вставьте это в блокнот, сохраните его как .html файл и откройте его в нескольких браузерах. Нажмите на ссылку, и Google должен искать британский фунт.
<HTML>
<BODY>
<A href="http://www.google.com/search?q=%a3">Test</A>
</BODY>
</HTML>
Это работает в IE, Firefox, Apple Safari, Google Chrome - я не имею других в наличии прямо сейчас.
AppendAllText
выписывает текст в UTF-8.
Что Вы используете для рассмотрения его? Возможности, это - что-то, что не понимает UTF-8 или не пробует UTF-8 сначала. Скажите Вашему редактору/средству просмотра, что это - файл UTF-8, и все должны быть хорошо. С другой стороны, используйте перегрузку AppendAllText
который позволяет Вам указывать кодирование и использование, какой бы ни кодирование будет самым удобным для Вас.
Править: В ответ на Ваш отредактированный вопрос причина это перестало работать, когда Вы кодируете ASCII, то, что £ не находится в наборе символов ASCII (который является Unicode 0-127).
Кодирование URL также использует UTF-8 взглядами его. Снова, если Вы хотите использовать другое кодирование, укажите его к HttpUtility.UrlEncode
перегрузка, которая принимает кодирование.
Отметьте это %a3
не может быть закодирован в ASCII (7 битов, Основной латыни).
Знак фунта (ниже на страницу) является частью латинского 1 кодирования.