2010-12-15 6 views
0

У нас есть веб-приложение, в котором используется набор символов ISO-8859-1. У пользовательских пользователей есть «странные» имена, которые содержат символы, такие как Š (html закодированы здесь для вашего удобства). Мы сохраняем это в нашей базе данных, но мы не можем отобразить его правильно.HTML Кодирование символов не в наборе символов

Каков наилучший способ борьбы с этим? Я думаю, что я должен автоматически преобразовывать символы вне набора символов с его кодировкой номера HTML Entity (Š - Š)

Но у меня возникают проблемы с поиском, как это сделать автоматически (без использования таблицы всех значений) ,

Этот код работает для расширенных символов ASCII, таких как 'å' (которые представлены в ISO-8859-1). Я хотел бы сделать то же самое с другими персонажами. Есть ли шаблон в этих значениях кодировки объектов HTML, которые я могу использовать?

unsigned int c; 
for(int i=0; i < html.GetLength(); i++) 
{ 
    c = html[i]; 
    if(c > 255 || c < 0) 
    { 
     CString orig = CString(html[i]); 
     CString encoded = "&#"; 
     encoded += CTool::String((byte)c); 
     encoded += ";"; 
     html.Replace(orig, encoded); 
    } 
} 

ответ

1

Веб-страница должна проинструктировать браузер для отображения ответа в UTF-8. Обычно это происходит путем подачи кодировки в заголовке ответа Content-Type, например text/html;charset=UTF-8.

Response.AppendHeader("Content-Type", "text/html;charset=UTF-8"); 

В HTML/XML сущности являются исключительно там, так что вы сможете сохранить источник веб-страницы в кодировке, отличной от UTF-8.

+0

Да, это работает, но я считаю, что мы используем ISO-8859-1 по какой-то причине. Надеюсь, нет, хотя ... Я собираюсь проверить с людьми, которые должны знать. Это рискованная операция, изменяющая набор символов на всех наших серверах, хотя я бы хотел, чтобы это вместо того, чтобы кодировать однократное обходное решение. – Polymorphix 2010-12-15 16:08:03

0

html выглядит как "Unicode" CString. Это означает, что он кодируется UTF-16. Синтаксис « #ddd» использует номер кодовой точки Юникода. Обычно это довольно просто. Š U + 0160, что означает, что он равен 0x0160 в UTF-16. Конечно, 352 десятичных, так что вы получите &#352.

У вас возникли проблемы, когда вы сталкиваетесь с символом вне базовой многоязычной плоскости (BMP), которая прошла мимо U + FFFF. Это больше не вписывается в 16 бит и поэтому будет принимать два символа в вашей строке html. Тем не менее, он должен производить только одно значение &#ddddd. Это настолько редко, что вы часто можете игнорировать его.

Смежные вопросы