Почему это появление в моих строках c#: £

Вам нужно 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> 
10
задан Jon Skeet 30 March 2009 в 10:45
поделиться

3 ответа

Набор символов по умолчанию 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 - я не имею других в наличии прямо сейчас.

6
ответ дан 3 December 2019 в 23:51
поделиться

AppendAllText выписывает текст в UTF-8.

Что Вы используете для рассмотрения его? Возможности, это - что-то, что не понимает UTF-8 или не пробует UTF-8 сначала. Скажите Вашему редактору/средству просмотра, что это - файл UTF-8, и все должны быть хорошо. С другой стороны, используйте перегрузку AppendAllText который позволяет Вам указывать кодирование и использование, какой бы ни кодирование будет самым удобным для Вас.

Править: В ответ на Ваш отредактированный вопрос причина это перестало работать, когда Вы кодируете ASCII, то, что £ не находится в наборе символов ASCII (который является Unicode 0-127).

Кодирование URL также использует UTF-8 взглядами его. Снова, если Вы хотите использовать другое кодирование, укажите его к HttpUtility.UrlEncode перегрузка, которая принимает кодирование.

7
ответ дан 3 December 2019 в 23:51
поделиться

Отметьте это %a3 не может быть закодирован в ASCII (7 битов, Основной латыни).

Знак фунта (ниже на страницу) является частью латинского 1 кодирования.

0
ответ дан 3 December 2019 в 23:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: