I have a Dynamics 365 API which is FetchXML & Liquid.
Nothing wrong with API, that all works well. Most of the fields the API pulls from in Dataverse are text fields. So when staff do (stupid) things like copy\paste from a Word document (as the text field might support 1000 characters for a 'description'). We've got the liquid handling line breaks & quotation marks, but I'm trying to get it handle list items.
So lets say i copy across this into the text field (screen capture from MS word in dark mode)
I'm converting line breaks to <br>, im changing the quotation marks from """ to "\"" to escape it - these both work. Then trying to change a "&tab;" to a line break <br> (as i assume the bullets have tabs) & changing the bullet "•" to "−"... but i appear to be missing something as the JSON response is still broken.
Here's my liquid code. at the moment im just testing & trying to get the "nxn_edmspeakerabout" field to work.
{ "Entity" :
[
{% for result in my_query.results.entities %}
{
"msevtmgt_name" : "{{ result['msevtmgt_name'] }}",
"ceda_speakerrole" : "{{ result['ceda_speakerrole'].value }}",
"ceda_speakerrole_label" : "{{ result.ceda_speakerrole.label }}",
"msevtmgt_eventid" : "{{ result['msevtmgt_event'].id }}",
"msevtmgt_event_label" : "{{ result['msevtmgt_event'].name }}",
"msevtmgt_speakerid" : "{{ result['msevtmgt_speaker'].id }}",
"msevtmgt_speaker_label" : "{{ result['msevtmgt_speaker'].name }}",
"nxn_edmspeakerabout" : "{{ result['nxn_edmspeakerabout'] | replace: "\n", "<br>" | replace: """, "\"" | replace: "&tab;", "<br>" | replace: "•", "−" | escape }}",
"nxn_edmspeakercompany" : "{{ result['nxn_edmspeakercompany'] }}",
"nxn_edmspeakerposition" : "{{ result['nxn_edmspeakerposition'] }}",
"msevtmgt_description" : "{{ result['msevtmgt_description'] | replace: "\n", "<br>" | replace: """, "\"" | escape }}",
"nxn_edmimageurl" : "{{ result['nxn_edmimageurl'] }}",
"ceda_order" : "{{ result['ceda_order'] }}"
}
{% unless forloop.last %},{% endunless %}
{% endfor %}
]
}
This is the API JSON response in my browser
{ "Entity" : [
{
"msevtmgt_name" : "The Hon. Chris Bowen MP",
"ceda_speakerrole" : "2",
"ceda_speakerrole_label" : "Speaker",
"msevtmgt_eventid" : "542b064e-7616-428c-8b9b-12e941be4d46",
"msevtmgt_event_label" : "Livestream: Rewiring the Nation – The Hon. Chris Bowen",
"msevtmgt_speakerid" : "a8d51ab4-cf1a-ee11-8f6c-000d3a7943d3",
"msevtmgt_speaker_label" : "The Hon. Chris Bowen MP",
"nxn_edmspeakerabout" : "This is “quote”<br>This is bullet points:<br>− Item 1<br>− Item 2<br>− Item 3",
"nxn_edmspeakercompany" : "",
"nxn_edmspeakerposition" : "",
"msevtmgt_description" : "The is the "Speaker Description" quote test",
"nxn_edmimageurl" : "https://assets-oce.mkt.dynamics.com/7b7fa636-f815-4880-b15d-77d70348ee1e/digitalassets/images/11491d16-da34-ee11-bdf4-6045bd3d3194?ts=638269789794222007",
"ceda_order" : ""
}
] }
If i get the source of the browser JSON & paste it in Notepad++, i can see there's a character there (highlighted) but no idea what it is, as its not a tab or a space.

Update:
So looking in a hex editor apparently the character is (hex) 09, which as unicode is "	", but if i add replace: "	", " " to my liquid, the character is still there.

I worked it out myself...
The tab on the left side of the bullet point can only be addressed with
&tab;The tab on the right side of the bullet point can only be addressed with\tBoth
&tab;&\thave a hex value of 09 ~ thus the unicode version of"	", but apparently these aren't equal to each other (or the same thing)... at least in this Microsoft world.So liquid filtering all working, and code looks like this: