Кодирање карактера у ХТМЛ-у

ХТМЛ (Хyпертеxт Маркуп Лангуаге) се користи од 1991, али ХТМЛ 4.0 (децембар 1997) је био прва стандардизована верзија где су међународни карактери добили скоро комплетан третман. Када неки ХТМЛ документ укључује специјалне карактере ван домена седмобитног АСЦИИ-а два циља су вредна разматрања: интегритет информација, и јединствен приказ у претраживачима.

Навођење кодирања карактера у документу уреди

Постоји више начина да се наведе кодирање карактера које се користи у документу. Прво, wеб сервер може да укључи кодирање карактера или “цхарсет” у хедеру Хyпертеxт Трансфер Протокола (ХТТП), што обично изгледа овако:[1]

Content-Type: text/html; charset=ISO-8859-1

Овај метод даје погодан начин ХТТП серверу да мења кодирање карактера у документу према садржају. Неки ХТТП сервер софтвер може то да уради, на пример Апацхе са модулом мод_цхарсет_лите.[2]

У ХТМЛ-у могуће је укључити ову информацију унутар хеад елемента при врху документа:[3]

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

ХТМЛ5 такође дозвољава скраћену синтаксу са истим значењем:[3]

<meta charset="utf-8">

XХТМЛ документи имају трећу могућност: да изразе кодирање карактера преко XМЛ декларације:[4]

<?xml version="1.0" encoding="ISO-8859-1"?>

<мета хттп-еqуив="Цонтент-Тyпе"> може бити интерпретиран директно од стране претраживача као обичан ХТМЛ селектор, или може бити искоришћен од стране ХТТП сервера да би се генерисао одговарајући хедер када служи документ.[5] ХТТП/1.1 хедер спецификација за ХТМЛ документ мора навести одговарајуће кодирање у Цонтент-Тyпе хедеру,[6] изостављање цхарсет= параметра доводи до прихватања ИСО-8859-1 (па ХТТП/1.1 не нуди такву такву опцију као што је неодредјено кодирање карактера), и ова спрецификација замењује све ХТМЛ (ор XХТМЛ) у мета елементима. То може да представља проблем ако сервер генерише погрешан хедер и корисник нема приступ или знање да га промени.

Како сваки од ових начина говори примаоцу како треба тумачити послати фајл, не би било прикладно да ове декларације не одговарају кодирању карактера које је коришћено. Пошто сервер обично не зна како је документ кодиран, поготову ако су документи креирани на различитим платформама или у различитим регијама, многи сервери једноставно не укључују референцу на "charset" у Content-Type хедеру, чиме избегавају давање лажних обећања. Медјутим ако документ не наведе кодирање то може довести до подједнако лоше ситуације где претраживач приказује мојибаке јер не може да пронадје које је кодирање карактера коришћено. Због распрострањеног и упорног игнорисања цхарсет= на Интернету (на серверској страни), конзорцијум се у ХТТП/1.1 одрекао строгог приступа[7] и подстиче производјаче претраживача да користе неке исправке у супротности са RFC 2616.

Ако претраживач прочита документ без наведеног кодирања карактера, може да користи неке друге информације. На пример, може се ослонити на подешавања корисника, било за цео претраживач или за дати документ, или може изабрати подразумевано кодирање у зависности од језика корисника. За западноевропске језике, уобичајено је и прилично сигурно да се претпостави Wиндоwс-1252, са ИСО-8859-1 али има карактере који се могу штампати на месту неких контролних карактера. Последица избора погрешног кодирања је да се карактери ван АСЦИИ(32-126) опсега који се могу штампати обично приказују неправилно. Ово представља неколико проблема за кориснике са енглеског говорног подручја, али у другим језицима редовно-у неким случајевима увек захтевају знакове ван тог опсега. У ЦЈК срединама где постоји више различитих вишебајтних кодирања у употреби аутодетекција се често користи. Коначно, претраживачи обично дозвољавају корисницима да превазидју погрешна кодирања карактера и ручно.

Све је учесталије за вишејезичке веб сајтове и веб сајтове на не западно-европским језицима да користе УТФ-8, који дозвољава коришћење истог кодирања за све језике. УТФ-16 или УТФ-32, који се такодје могу користити за све језике, се редје користе зато што је теже руковати им у програмским језицима који претпостављају бајт-оријентисано АСЦИИ кодирање, и мање су ефикасни у текстовима са великом учесталости АСЦИИ карактера, што је обично случај у ХТМЛ документима.

Правилно приказивање странице није нужно показатељ да је кодирање правилно наведено. Ако творац странице и читалац обоје претпостављају неко кодирање зависно од платформе, и сервер не шаље било какве податке за идентификацију, онда ће читалац ипак видети страницу како је творац замислио, али други читаоци на различитим платформама или са различитим матерњим језицима неће видети страницу како је замишљено.

Карактерске референце уреди

Поред изворног кодирања карактера, карактери се могу кодирати као карактерске референце, које могу бити нумеричке карактерске референце(децималне или хексадецималне) или карактерски ентитети. Карактерски ентитети се некад називају и именовани ентитети, или ХТМЛ ентитети за ХТМЛ. Коришћење карактерских ентитета у ХТМЛ-у потиче из СГМЛ.

ХТМЛ карактерске референце уреди

Нумеричке карактерске референце у ХТМЛ-у односе се на карактер према његовом УЦС/Уницоде кода и користи формат:

&#нннн;

или

&#xхххх;

где је нннн код у децималној форми, и хххх је код у хексадецималној форми. Знак x мора бити мало слово у XМЛ документима. Карактери нннн или хххх могу бити било који бројеви и могу да укључују водеће нуле, док хххх може да меша мала и велика слова, али се уобичајено користе велика слова.

Неће сви wеб броwсер или имејл клијент које користе примаоци ХТМЛ доцументс, или уређивачи текста коришћени од стране креатора ХТМЛ документа бити способни да прикажу све ХТМЛ карактере. Већина новијег софтвера може да прикаже скоро све карактере за језик корисника, и приказаће квадратић или неки други индикатор за карактере које не може да прикаже.

За кодове из опсега од 0 до 127 оригиналног АСЦИИ 7-битног скупа, већина карактера се може користити без карактерске референце. Кодови из опсега од 160 до 255 се сви могу креирати користечи карактерске ентитете. Само неколицина кодова високог броја се могу креирати користећи ентитете, али се сви могу креирати користећи децималне карактерске референце.

Карактерски ентитети могу такодје имати формат &ime; где је име алфанумеричка ниска где се разликују мала и велика слова. На пример, "λ" се може такодје кодирати са &lambda; у ХТМЛ документу. Карактерски ентитети &lt;, &gt;, &quot; и &amp; су предефинисани у ХТМЛ-у и СГМЛ-у, јер се <, >, " и & већ користе за ограничавање назнака. Ово не укључује XМЛ-ов &apos; (') ентитет.

Непотребно коришћење ХТМЛ карактерских референци може значајно да смањи читљивост ХТМЛ кода. Ако се кодирање карактера за веб страницу изабере правилно, онда су ХМТЛ карактерске референце потребне само за ограничавање назнака као сто је речено изнад, и за неколицину специјалних карактера(или нимало ако се користи нативно Уницоде кодирање као што је УТФ-8). Коришћење погрешног ентитета може направити проблеме са сигурношћу за 'ињецтион' нападе као што је http://en.wikipedia.org/wiki/Cross-site_scripting. Ако су ХТМЛ атрибути остављењи без наводника, поједини карактери, најважније белине, као што су размак или табулатор морају да користе ентитете. Други језици сродни ХТМЛ-у имају своје начине убацивања специјалних карактера.

Илегални карактери уреди

ХТМЛ забрањује коришћење карактера са[8] тхе усе оф тхе цхарацтерс wитх УЦС/Уницодекодовима.

  • 0 до 31, сем 9, 10, и 13 (Ц0 контролни карактери)
  • 127 (ДЕЛ цхарацтер)
  • 128 до 159 (x80 – x9Ф, Ц1 контролни карактери)
  • 55296 до 57343 (xД800 – xДФФФ)

Уницоде стандард такодје забрањује:

  • 65534 и 65535 (xФФФЕ – xФФФФ), не-карактери, везани за xФЕФФ.

Ови знакови нису дозвољени ни по референци. Тако да их не треба ни писати као нумеричке карактерске референце. Медјутим референце на карактере 128-159 су обично тумачене од веб прегледача као да су референце на карактере додељене бајтовима 128-159(децимални) у Wиндоwс-1252 кодирању карактера. Ово је у супротности са ХТМЛ и СГМЛ стандардима, и карактери су већ додељени вишим кодовима, па креатори ХТМЛ докумената увек треба да користе више кодове. На пример за заштитни знак (™), треба користити &#8482;, а не &#153;.

Карактери 9 (таб), 10 (линефеед) и 13 (царриаге ретурн) су дозвољени у ХТМЛ документима али заједно са 32 (спаце) се сматрају белинама.[9] Контролни карактер  "форм феед"  који би требало да буде 12, није дозвољен у ХТМЛ документима али се такодје помиње као један од карактера који се сматрају белинама. У ХТМЛ-у већина узастопних појављивања белина, осим <pre> блока, се интерпретира као један размак за потребе приказа. Размак се обично приказује као размак ен-ширине у европским језицима, али не и у свим осталим.

XМЛ карактерске референце уреди

За разлику од традиционалног ХТМЛ-а са својим широким опсегом карактерских ентитета, у XМЛ постоји само пет предефинисаних карактерских ентитета. Они се користе за убацивање карактера који су осетљиви на означавање у одредјеном контексту:[10]

  • &amp; → & (амперсенд, У+0026)
  • &lt; → < (мање од, У+003Ц)
  • &gt; → > (веће од, У+003Е)
  • &quot; → " (наводник, У+0022)
  • &apos; → ' (апостроф, У+0027)

Сви други карактерски ентитети морају бити дефинисани пре него што се могу користити. На пример, коришћење &eacute; (wкоји даје é, латинично мало Е са оштрим акцентом, У+00Е9 у Уницоде-у) у XМЛ документу ће генерисати грешку уколико ентитет није већ дефинисан. XМЛ такодје захтева да x у хексадекадним нумеричким референцама буде мало слово: на пример &#xA1b уместо &#XA1b. XХТМЛ, који је XМЛ апликација, подржава сет ХТМЛ ентитета, заједно са предефинисаним ентитетима XМЛ-а.

Медјутим коришћење &apos; у XХТМЛ-у генерално треба избегавати због компатибилности. Уместо тога могу се користити &#39; ор &#x0027;.

&amp; има посебан проблем да почиње са карактером који треба посебно убацити. Једноставна интернет претрага проналази милионе низова &amp;amp;amp;amp; ...у ХТМЛ странама за које алгоритам за замену амперсенда са одговарајућим ентитетом се вероватно примењује понављајући http://www.google.co.uk/search?q=%22%26amp%3Bamp%3Bamp%3Bamp%3B%22  Недостаје или је празан параметар |title= (помоћ).

Reference уреди

  1. ^ Fielding, R.; Gettys, J.; Mogul, J.; Frystyk, H.; Masinter, L.; Leach, P.; Berners-Lee, T. (jun 1999), „Content-Type”, Hypertext Transfer Protocol – HTTP/1.1, IETF, Приступљено 8. 3. 2010 
  2. ^ Apache Module mod_charset_lite
  3. ^ а б Hickson, I. (5. 3. 2010), „Specifying the document's character encoding”, HTML5, WHATWG, Приступљено 8. 3. 2010 
  4. ^ Bray, T.; Paoli, J.; Sperberg-McQueen, C.; Maler, E.; Yergeau, F. (26. 11. 2008), „Prolog and Document Type Declaration”, XML, W3C, Приступљено 8. 3. 2010 
  5. ^ The global structure of an HTML document: The META element
  6. ^ RFC 2616 3.7.1 Цаноницализатион анд Теxт Дефаултс
  7. ^ ХТМЛ 4, ХТМЛ Доцумент Репресентатион: Специфyинг тхе цхарацтер енцодинг
  8. ^ СГМЛ Децларатион оф ХТМЛ 4
  9. ^ Параграпхс, Линес, анд Пхрасес
  10. ^ Браy, Т.; Паоли, Ј.; Сперберг-МцQуеен, C.; Малер, Е.; Yергеау, Ф. (26. 11. 2008), „Цхарацтер анд Ентитy Референцес”, XМЛ, W3Ц, Приступљено 8. 3. 2010 

Спољашње везе уреди