Почему это появляется в моих c # строках? - PullRequest
10 голосов
/ 30 марта 2009

У меня есть строка в c #, инициализированная следующим образом:

string strVal = "£2000";

Однако всякий раз, когда я пишу эту строку, пишется следующее:

 £ 2000

Он не делает это с долларами.

Пример кода, который я использую для записи значения:

System.IO.File.AppendAllText(HttpContext.Current.Server.MapPath("/logging.txt"), strVal);

Я предполагаю, что это как-то связано с локализацией, но если строки c # просто unicode, то это должно сработать?

РАЗЪЯСНЕНИЕ: Немного больше информации, ответ Джона Скита верен, однако я также получаю проблему, когда URLE кодирую строку. Есть ли способ предотвратить это?

Таким образом, строка в кодировке URL выглядит следующим образом:

"% c2% a32000"

% c2 = Â % a3 = £

Если я закодирую как ASCII, знак £ получится?

Есть еще идеи?

Ответы [ 4 ]

7 голосов
/ 30 марта 2009

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

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

РЕДАКТИРОВАТЬ: В ответ на ваш отредактированный вопрос причина сбоя при кодировании с помощью ASCII заключается в том, что £ не входит в набор символов ASCII (то есть Unicode 0-127).

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

6 голосов
/ 30 марта 2009

Набор символов по умолчанию для URL-адресов при использовании на страницах HTML и в заголовках HTTP называется ISO-8859-1 или ISO Latin-1.

Это не то же самое, что UTF-8, и это не то же самое, что ASCII, но оно вписывается в один байт на символ. Диапазон от 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 GET, она должна соответствовать ISO-8859-1.

Другим фактором является то, что HTML также использует стандарт ISO-8859-1 по умолчанию, а URL-адреса обычно создаются в виде ссылок на страницах HTML. Поэтому, когда вы создаете простую минимальную HTML-страницу в Блокноте, URL-адреса, которые вы вводите в этот файл, соответствуют ISO-8859-1.

В стандартах это иногда называют "дырой", но на самом деле это не так; просто HTML / HTTP заполняет пробел, оставленный RFC для URL.

Отсюда, например, совет по этой странице :

URL-кодировка символа состоит символа "%", за которым следует двузначное шестнадцатеричное представление (без учета регистра) ISO-Latin кодовая точка для символа.

(ISO-Latin - другое название для 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 - у меня нет других доступных сейчас.

0 голосов
/ 14 сентября 2015

Я заметил, что это происходит только тогда, когда используются длинные строки (более 4000) символов. Мое решение было при получении параметра в базе данных, я просто заменяю знак ничем. Будьте осторожны, это может действительно понадобиться, и если это так, то это решение не подходит.

0 голосов
/ 30 марта 2009

Обратите внимание, что %a3 не может быть закодировано в ASCII (7 бит, Базовая латиница ).

Знак Pound (вниз по странице) является частью кодировки Latin-1 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...