[{"data":1,"prerenderedAt":992},["ShallowReactive",2],{"guide-html-encoding-guide":3},{"id":4,"title":5,"body":6,"date":984,"description":985,"extension":986,"meta":987,"navigation":303,"path":988,"readingTime":331,"seo":989,"stem":990,"__hash__":991},"guides\u002Fguides\u002Fhtml-encoding-guide.md","HTML Encoding Guide: How Browsers Process Entities",{"type":7,"value":8,"toc":956},"minimark",[9,14,27,30,34,39,42,138,144,148,162,166,169,173,176,180,190,194,213,217,234,246,250,254,257,335,338,342,345,418,427,431,438,531,534,538,541,591,594,598,602,605,647,650,654,796,800,803,858,862,892,896,916,920,940,944,952],[10,11,13],"h2",{"id":12},"what-is-html-encoding","What Is HTML Encoding?",[15,16,17,18,22,23,26],"p",{},"HTML encoding converts characters that have special meaning in HTML into safe entity sequences. When you write ",[19,20,21],"code",{},"&lt;"," instead of ",[19,24,25],{},"\u003C",", you tell the browser to display a less-than sign — not open a tag.",[15,28,29],{},"Encoding protects your markup from breaking and your users from injection attacks. Every web developer touches HTML encoding, whether manually or through a framework's auto-escaping.",[10,31,33],{"id":32},"why-encode-special-characters","Why Encode Special Characters?",[35,36,38],"h3",{"id":37},"prevent-markup-breakage","Prevent markup breakage",[15,40,41],{},"Five characters can destroy your HTML if left unencoded:",[43,44,45,61],"table",{},[46,47,48],"thead",{},[49,50,51,55,58],"tr",{},[52,53,54],"th",{},"Character",[52,56,57],{},"Entity",[52,59,60],{},"Why it matters",[62,63,64,80,93,108,123],"tbody",{},[49,65,66,72,77],{},[67,68,69],"td",{},[19,70,71],{},"&",[67,73,74],{},[19,75,76],{},"&amp;",[67,78,79],{},"Starts every entity reference",[49,81,82,86,90],{},[67,83,84],{},[19,85,25],{},[67,87,88],{},[19,89,21],{},[67,91,92],{},"Opens an HTML tag",[49,94,95,100,105],{},[67,96,97],{},[19,98,99],{},">",[67,101,102],{},[19,103,104],{},"&gt;",[67,106,107],{},"Closes an HTML tag",[49,109,110,115,120],{},[67,111,112],{},[19,113,114],{},"\"",[67,116,117],{},[19,118,119],{},"&quot;",[67,121,122],{},"Delimits attribute values",[49,124,125,130,135],{},[67,126,127],{},[19,128,129],{},"'",[67,131,132],{},[19,133,134],{},"&apos;",[67,136,137],{},"Delimits attribute values (HTML5\u002FXML)",[15,139,140,141,143],{},"A single unencoded ",[19,142,71],{}," in a paragraph can cause the browser to misread everything after it as a broken entity.",[35,145,147],{"id":146},"stop-xss-attacks","Stop XSS attacks",[15,149,150,151,154,155,157,158,161],{},"When you render user input as HTML, unencoded ",[19,152,153],{},"\u003Cscript>"," tags execute. Entity encoding defangs the payload — ",[19,156,153],{}," becomes ",[19,159,160],{},"&lt;script&gt;",", and the browser renders it as harmless text.",[35,163,165],{"id":164},"display-symbols-correctly","Display symbols correctly",[15,167,168],{},"Currency signs, mathematical operators, and typographic marks often need entities when your editor or source control cannot handle the raw Unicode character.",[10,170,172],{"id":171},"how-browsers-process-entities","How Browsers Process Entities",[15,174,175],{},"Understanding the parsing order helps you avoid subtle bugs.",[35,177,179],{"id":178},"step-1-tokenization","Step 1: Tokenization",[15,181,182,183,185,186,189],{},"The browser's HTML tokenizer reads the raw byte stream character by character. When it encounters ",[19,184,71],{},", it enters \"entity state\" and collects characters until it hits ",[19,187,188],{},";"," or a non-entity character.",[35,191,193],{"id":192},"step-2-entity-resolution","Step 2: Entity resolution",[15,195,196,197,199,200,202,203,199,206,209,210,212],{},"The tokenizer looks up the entity name in its internal table. If it finds a match — ",[19,198,76],{}," → ",[19,201,71],{},", ",[19,204,205],{},"&copy;",[19,207,208],{},"©"," — it replaces the entire entity with the corresponding character. If no match exists, the browser treats the ",[19,211,71],{}," and following text as literal content.",[35,214,216],{"id":215},"step-3-dom-construction","Step 3: DOM construction",[15,218,219,220,222,223,225,226,229,230,233],{},"The resolved characters feed into the DOM builder. At this point, ",[19,221,25],{}," and ",[19,224,99],{}," that arrived via entity resolution are plain text nodes — not markup. This is why ",[19,227,228],{},"&lt;div&gt;"," renders as the visible text ",[19,231,232],{},"\u003Cdiv>"," instead of creating a DOM element.",[15,235,236,240,241,245],{},[237,238,239],"strong",{},"Key insight:"," Entity resolution happens ",[242,243,244],"em",{},"before"," the browser builds DOM nodes. An entity can never \"escape\" into markup once the tokenizer resolves it.",[10,247,249],{"id":248},"common-mistakes","Common Mistakes",[35,251,253],{"id":252},"double-encoding","Double encoding",[15,255,256],{},"Encoding a string that already contains entities produces garbled output:",[258,259,264],"pre",{"className":260,"code":261,"language":262,"meta":263,"style":263},"language-html shiki shiki-themes github-light github-dark","\u003C!-- Original -->\n\u003Cp>5 &gt; 3\u003C\u002Fp>\n\n\u003C!-- Double-encoded (wrong) -->\n\u003Cp>5 &amp;gt; 3\u003C\u002Fp>\n\u003C!-- Renders as: 5 &gt; 3 (literal text, not \"5 > 3\") -->\n","html","",[19,265,266,275,298,305,311,329],{"__ignoreMap":263},[267,268,271],"span",{"class":269,"line":270},"line",1,[267,272,274],{"class":273},"sJ8bj","\u003C!-- Original -->\n",[267,276,278,281,284,287,290,293,295],{"class":269,"line":277},2,[267,279,25],{"class":280},"sVt8B",[267,282,15],{"class":283},"s9eBZ",[267,285,286],{"class":280},">5 ",[267,288,104],{"class":289},"sj4cs",[267,291,292],{"class":280}," 3\u003C\u002F",[267,294,15],{"class":283},[267,296,297],{"class":280},">\n",[267,299,301],{"class":269,"line":300},3,[267,302,304],{"emptyLinePlaceholder":303},true,"\n",[267,306,308],{"class":269,"line":307},4,[267,309,310],{"class":273},"\u003C!-- Double-encoded (wrong) -->\n",[267,312,314,316,318,320,322,325,327],{"class":269,"line":313},5,[267,315,25],{"class":280},[267,317,15],{"class":283},[267,319,286],{"class":280},[267,321,76],{"class":289},[267,323,324],{"class":280},"gt; 3\u003C\u002F",[267,326,15],{"class":283},[267,328,297],{"class":280},[267,330,332],{"class":269,"line":331},6,[267,333,334],{"class":273},"\u003C!-- Renders as: 5 &gt; 3 (literal text, not \"5 > 3\") -->\n",[15,336,337],{},"This happens when a framework auto-escapes content that you already encoded manually. Encode once — at the boundary where the data enters HTML context.",[35,339,341],{"id":340},"wrong-encoding-order","Wrong encoding order",[15,343,344],{},"When a URL with query parameters sits inside an HTML attribute, you need both URL encoding and HTML encoding — but the order matters.",[258,346,348],{"className":260,"code":347,"language":262,"meta":263,"style":263},"\u003C!-- WRONG: HTML-encode first, URL-encode second -->\n\u003Ca href=\"\u002Fsearch?q=red%26blue\">Link\u003C\u002Fa>\n\u003C!-- The %26 is URL-safe but the & before it still needs &amp; -->\n\n\u003C!-- CORRECT: URL-encode data values, then HTML-encode the & separators -->\n\u003Ca href=\"\u002Fsearch?q=red%26blue&amp;sort=newest\">Link\u003C\u002Fa>\n",[19,349,350,355,380,385,389,394],{"__ignoreMap":263},[267,351,352],{"class":269,"line":270},[267,353,354],{"class":273},"\u003C!-- WRONG: HTML-encode first, URL-encode second -->\n",[267,356,357,359,362,366,369,373,376,378],{"class":269,"line":277},[267,358,25],{"class":280},[267,360,361],{"class":283},"a",[267,363,365],{"class":364},"sScJk"," href",[267,367,368],{"class":280},"=",[267,370,372],{"class":371},"sZZnC","\"\u002Fsearch?q=red%26blue\"",[267,374,375],{"class":280},">Link\u003C\u002F",[267,377,361],{"class":283},[267,379,297],{"class":280},[267,381,382],{"class":269,"line":300},[267,383,384],{"class":273},"\u003C!-- The %26 is URL-safe but the & before it still needs &amp; -->\n",[267,386,387],{"class":269,"line":307},[267,388,304],{"emptyLinePlaceholder":303},[267,390,391],{"class":269,"line":313},[267,392,393],{"class":273},"\u003C!-- CORRECT: URL-encode data values, then HTML-encode the & separators -->\n",[267,395,396,398,400,402,404,407,409,412,414,416],{"class":269,"line":331},[267,397,25],{"class":280},[267,399,361],{"class":283},[267,401,365],{"class":364},[267,403,368],{"class":280},[267,405,406],{"class":371},"\"\u002Fsearch?q=red%26blue",[267,408,76],{"class":289},[267,410,411],{"class":371},"sort=newest\"",[267,413,375],{"class":280},[267,415,361],{"class":283},[267,417,297],{"class":280},[15,419,420,423,424,426],{},[237,421,422],{},"Rule:"," URL-encode your data values first. Then HTML-encode the ",[19,425,71],{}," characters that separate query parameters when the URL lives inside an HTML attribute.",[35,428,430],{"id":429},"encoding-the-wrong-context","Encoding the wrong context",[15,432,433,434,437],{},"HTML entity encoding protects HTML text and attributes. It does ",[237,435,436],{},"not"," protect JavaScript strings:",[258,439,441],{"className":260,"code":440,"language":262,"meta":263,"style":263},"\u003C!-- WRONG: entity encoding inside a script tag -->\n\u003Cscript>\n  var name = \"Robert&apos;s Company\";  \u002F\u002F Syntax error in JS\n\u003C\u002Fscript>\n\n\u003C!-- CORRECT: use JavaScript string escaping -->\n\u003Cscript>\n  var name = \"Robert's Company\";       \u002F\u002F Or Robert\\'s Company\n\u003C\u002Fscript>\n",[19,442,443,448,457,477,486,490,495,504,522],{"__ignoreMap":263},[267,444,445],{"class":269,"line":270},[267,446,447],{"class":273},"\u003C!-- WRONG: entity encoding inside a script tag -->\n",[267,449,450,452,455],{"class":269,"line":277},[267,451,25],{"class":280},[267,453,454],{"class":283},"script",[267,456,297],{"class":280},[267,458,459,463,466,468,471,474],{"class":269,"line":300},[267,460,462],{"class":461},"szBVR","  var",[267,464,465],{"class":280}," name ",[267,467,368],{"class":461},[267,469,470],{"class":371}," \"Robert&apos;s Company\"",[267,472,473],{"class":280},";  ",[267,475,476],{"class":273},"\u002F\u002F Syntax error in JS\n",[267,478,479,482,484],{"class":269,"line":307},[267,480,481],{"class":280},"\u003C\u002F",[267,483,454],{"class":283},[267,485,297],{"class":280},[267,487,488],{"class":269,"line":313},[267,489,304],{"emptyLinePlaceholder":303},[267,491,492],{"class":269,"line":331},[267,493,494],{"class":273},"\u003C!-- CORRECT: use JavaScript string escaping -->\n",[267,496,498,500,502],{"class":269,"line":497},7,[267,499,25],{"class":280},[267,501,454],{"class":283},[267,503,297],{"class":280},[267,505,507,509,511,513,516,519],{"class":269,"line":506},8,[267,508,462],{"class":461},[267,510,465],{"class":280},[267,512,368],{"class":461},[267,514,515],{"class":371}," \"Robert's Company\"",[267,517,518],{"class":280},";       ",[267,520,521],{"class":273},"\u002F\u002F Or Robert\\'s Company\n",[267,523,525,527,529],{"class":269,"line":524},9,[267,526,481],{"class":280},[267,528,454],{"class":283},[267,530,297],{"class":280},[15,532,533],{},"Each output context — HTML text, HTML attributes, JavaScript, CSS, URLs — requires its own escaping strategy.",[35,535,537],{"id":536},"forgetting-the-semicolon","Forgetting the semicolon",[15,539,540],{},"HTML5 allows some named entities without a semicolon, but this creates ambiguity:",[258,542,544],{"className":260,"code":543,"language":262,"meta":263,"style":263},"\u003Cp>I work at AT&T\u003C\u002Fp>\n\u003C!-- Browser sees &T — not a valid entity, renders as-is, but behavior differs across parsers -->\n\n\u003Cp>I work at AT&amp;T\u003C\u002Fp>\n\u003C!-- Always correct and unambiguous -->\n",[19,545,546,559,564,568,586],{"__ignoreMap":263},[267,547,548,550,552,555,557],{"class":269,"line":270},[267,549,25],{"class":280},[267,551,15],{"class":283},[267,553,554],{"class":280},">I work at AT&T\u003C\u002F",[267,556,15],{"class":283},[267,558,297],{"class":280},[267,560,561],{"class":269,"line":277},[267,562,563],{"class":273},"\u003C!-- Browser sees &T — not a valid entity, renders as-is, but behavior differs across parsers -->\n",[267,565,566],{"class":269,"line":300},[267,567,304],{"emptyLinePlaceholder":303},[267,569,570,572,574,577,579,582,584],{"class":269,"line":307},[267,571,25],{"class":280},[267,573,15],{"class":283},[267,575,576],{"class":280},">I work at AT",[267,578,76],{"class":289},[267,580,581],{"class":280},"T\u003C\u002F",[267,583,15],{"class":283},[267,585,297],{"class":280},[267,587,588],{"class":269,"line":313},[267,589,590],{"class":273},"\u003C!-- Always correct and unambiguous -->\n",[15,592,593],{},"Always include the semicolon. It eliminates parser ambiguity and makes your intent explicit.",[10,595,597],{"id":596},"encoding-in-practice","Encoding in Practice",[35,599,601],{"id":600},"server-side-rendering","Server-side rendering",[15,603,604],{},"Most template engines auto-encode by default:",[606,607,608,619,625,638],"ul",{},[609,610,611,614,615,618],"li",{},[237,612,613],{},"Vue"," — ",[19,616,617],{},"{{ }}"," interpolations auto-escape HTML",[609,620,621,624],{},[237,622,623],{},"React"," — JSX expressions auto-escape",[609,626,627,630,631,633,634,637],{},[237,628,629],{},"Blade"," (Laravel) — ",[19,632,617],{}," auto-escapes; use ",[19,635,636],{},"{!! !!}"," for raw output",[609,639,640,643,644,646],{},[237,641,642],{},"Jinja2"," (Python) — ",[19,645,617],{}," auto-escapes when autoescape is on",[15,648,649],{},"Use raw output directives only when you intentionally trust the content.",[35,651,653],{"id":652},"client-side-javascript","Client-side JavaScript",[258,655,659],{"className":656,"code":657,"language":658,"meta":263,"style":263},"language-javascript shiki shiki-themes github-light github-dark","\u002F\u002F Encoding — safe for HTML text\nfunction encodeHtml(str) {\n  const el = document.createElement('div')\n  el.textContent = str\n  return el.innerHTML\n}\n\n\u002F\u002F Decoding — convert entities back to characters\nfunction decodeHtml(str) {\n  const el = document.createElement('div')\n  el.innerHTML = str\n  return el.textContent\n}\n","javascript",[19,660,661,666,684,709,719,727,732,736,741,754,773,783,791],{"__ignoreMap":263},[267,662,663],{"class":269,"line":270},[267,664,665],{"class":273},"\u002F\u002F Encoding — safe for HTML text\n",[267,667,668,671,674,677,681],{"class":269,"line":277},[267,669,670],{"class":461},"function",[267,672,673],{"class":364}," encodeHtml",[267,675,676],{"class":280},"(",[267,678,680],{"class":679},"s4XuR","str",[267,682,683],{"class":280},") {\n",[267,685,686,689,692,695,698,701,703,706],{"class":269,"line":300},[267,687,688],{"class":461},"  const",[267,690,691],{"class":289}," el",[267,693,694],{"class":461}," =",[267,696,697],{"class":280}," document.",[267,699,700],{"class":364},"createElement",[267,702,676],{"class":280},[267,704,705],{"class":371},"'div'",[267,707,708],{"class":280},")\n",[267,710,711,714,716],{"class":269,"line":307},[267,712,713],{"class":280},"  el.textContent ",[267,715,368],{"class":461},[267,717,718],{"class":280}," str\n",[267,720,721,724],{"class":269,"line":313},[267,722,723],{"class":461},"  return",[267,725,726],{"class":280}," el.innerHTML\n",[267,728,729],{"class":269,"line":331},[267,730,731],{"class":280},"}\n",[267,733,734],{"class":269,"line":497},[267,735,304],{"emptyLinePlaceholder":303},[267,737,738],{"class":269,"line":506},[267,739,740],{"class":273},"\u002F\u002F Decoding — convert entities back to characters\n",[267,742,743,745,748,750,752],{"class":269,"line":524},[267,744,670],{"class":461},[267,746,747],{"class":364}," decodeHtml",[267,749,676],{"class":280},[267,751,680],{"class":679},[267,753,683],{"class":280},[267,755,757,759,761,763,765,767,769,771],{"class":269,"line":756},10,[267,758,688],{"class":461},[267,760,691],{"class":289},[267,762,694],{"class":461},[267,764,697],{"class":280},[267,766,700],{"class":364},[267,768,676],{"class":280},[267,770,705],{"class":371},[267,772,708],{"class":280},[267,774,776,779,781],{"class":269,"line":775},11,[267,777,778],{"class":280},"  el.innerHTML ",[267,780,368],{"class":461},[267,782,718],{"class":280},[267,784,786,788],{"class":269,"line":785},12,[267,787,723],{"class":461},[267,789,790],{"class":280}," el.textContent\n",[267,792,794],{"class":269,"line":793},13,[267,795,731],{"class":280},[35,797,799],{"id":798},"nodejs","Node.js",[15,801,802],{},"Use a dedicated library outside the browser:",[258,804,806],{"className":656,"code":805,"language":658,"meta":263,"style":263},"import { encode, decode } from 'he'\n\nencode('5 > 3 & 2 \u003C 4')  \u002F\u002F \"5 &gt; 3 &amp; 2 &lt; 4\"\ndecode('&copy; 2026')      \u002F\u002F \"© 2026\"\n",[19,807,808,822,826,842],{"__ignoreMap":263},[267,809,810,813,816,819],{"class":269,"line":270},[267,811,812],{"class":461},"import",[267,814,815],{"class":280}," { encode, decode } ",[267,817,818],{"class":461},"from",[267,820,821],{"class":371}," 'he'\n",[267,823,824],{"class":269,"line":277},[267,825,304],{"emptyLinePlaceholder":303},[267,827,828,831,833,836,839],{"class":269,"line":300},[267,829,830],{"class":364},"encode",[267,832,676],{"class":280},[267,834,835],{"class":371},"'5 > 3 & 2 \u003C 4'",[267,837,838],{"class":280},")  ",[267,840,841],{"class":273},"\u002F\u002F \"5 &gt; 3 &amp; 2 &lt; 4\"\n",[267,843,844,847,849,852,855],{"class":269,"line":307},[267,845,846],{"class":364},"decode",[267,848,676],{"class":280},[267,850,851],{"class":371},"'&copy; 2026'",[267,853,854],{"class":280},")      ",[267,856,857],{"class":273},"\u002F\u002F \"© 2026\"\n",[10,859,861],{"id":860},"encoding-checklist","Encoding Checklist",[606,863,864,867,870,873,876,879],{},[609,865,866],{},"Encode all user-supplied data before rendering it in HTML",[609,868,869],{},"Use your framework's auto-escaping by default",[609,871,872],{},"Never double-encode — encode once at the HTML boundary",[609,874,875],{},"Match your encoding to the output context (HTML ≠ JavaScript ≠ CSS ≠ URLs)",[609,877,878],{},"Always terminate named entities with a semicolon",[609,880,881,882,202,884,202,886,202,888,202,890],{},"Test rendered output with characters like ",[19,883,25],{},[19,885,99],{},[19,887,71],{},[19,889,114],{},[19,891,129],{},[10,893,895],{"id":894},"key-takeaways","Key Takeaways",[606,897,898,901,904,907,910,913],{},[609,899,900],{},"HTML encoding replaces markup-significant characters with entity sequences",[609,902,903],{},"Browsers resolve entities during tokenization, before building the DOM",[609,905,906],{},"Double encoding and wrong encoding order are the two most common bugs",[609,908,909],{},"Entity encoding only protects HTML contexts — use context-appropriate escaping elsewhere",[609,911,912],{},"Always include the semicolon on named entities to avoid parser ambiguity",[609,914,915],{},"Frameworks auto-escape by default; prefer that over manual encoding",[10,917,919],{"id":918},"related-guides","Related Guides",[606,921,922,928,934],{},[609,923,924],{},[361,925,927],{"href":926},"\u002Fguides\u002Fhtml-entity-reference","HTML Entity Reference",[609,929,930],{},[361,931,933],{"href":932},"\u002Fguides\u002Fweb-encoding-tools","Web Encoding Tools",[609,935,936],{},[361,937,939],{"href":938},"\u002Fguides\u002Fhtml-encoding-vs-url-encoding","HTML Encoding vs URL Encoding",[10,941,943],{"id":942},"try-it-yourself","Try It Yourself",[15,945,946,947,951],{},"Encode and decode HTML entities instantly with our free ",[361,948,950],{"href":949},"\u002Ftools\u002Fhtml-encoder","HTML Encoder\u002FDecoder"," tool. Paste any text and get properly encoded output in one click.",[953,954,955],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":263,"searchDepth":277,"depth":277,"links":957},[958,959,964,969,975,980,981,982,983],{"id":12,"depth":277,"text":13},{"id":32,"depth":277,"text":33,"children":960},[961,962,963],{"id":37,"depth":300,"text":38},{"id":146,"depth":300,"text":147},{"id":164,"depth":300,"text":165},{"id":171,"depth":277,"text":172,"children":965},[966,967,968],{"id":178,"depth":300,"text":179},{"id":192,"depth":300,"text":193},{"id":215,"depth":300,"text":216},{"id":248,"depth":277,"text":249,"children":970},[971,972,973,974],{"id":252,"depth":300,"text":253},{"id":340,"depth":300,"text":341},{"id":429,"depth":300,"text":430},{"id":536,"depth":300,"text":537},{"id":596,"depth":277,"text":597,"children":976},[977,978,979],{"id":600,"depth":300,"text":601},{"id":652,"depth":300,"text":653},{"id":798,"depth":300,"text":799},{"id":860,"depth":277,"text":861},{"id":894,"depth":277,"text":895},{"id":918,"depth":277,"text":919},{"id":942,"depth":277,"text":943},"2026-05-28","Learn how HTML encoding works, when to use it, and common pitfalls developers face with HTML entities.","md",{"immutable":303},"\u002Fguides\u002Fhtml-encoding-guide",{"title":5,"description":985},"guides\u002Fhtml-encoding-guide","4NiIUynybcrsk1sqGjKEpBXLckCw_edGdA0bNppdNh0",1780401330344]