11 Stimmen

XHTML5- und HTML4-Zeicheneinheiten

Unterstützt XHTML5 Zeichenentitäten wie   y — . Bei der Arbeit können wir eine spezielle Software für den Zugriff auf die Verwaltungsseite der Website verlangen, und die Leute verlangen den Upload mehrerer Dateien. Für mich ist das eine einfache Rechtfertigung, um auf FF 3.6+ zu migrieren, also werde ich das bald tun. Wir verwenden derzeit XHTML 1.1, und wenn wir auf HTML5 umsteigen, werde ich sólo Ich habe Probleme mit den Namen der Entitäten... Hat jemand ein Dokument zu diesem Thema?

Ich sehe, es gibt eine Liste auf der WHATWG Spezifikation, aber ich bin mir nicht sicher, ob es Dateien betrifft, die als application/xhtml+xml . Auf jeden Fall lösen die beiden genannten Fehler sowohl in Chromium nightly und FF 3.6.

13voto

bobince Punkte 512550

Es gibt keine DTD für XHTML5, so dass ein XML-Parser keine Entity-Definitionen (außer den vordefinierten) sieht. Wenn Sie eine Entität verwenden möchten, müssen Sie sie selbst in der internen Untermenge definieren.

<!DOCTYPE html [
    <!ENTITY mdash "—">
]>
<html xmlns="http://www.w3.org/1999/xhtml">
    ... &mdash; ...
</html>

(Natürlich wird die Verwendung der internen Teilmenge die Browser wahrscheinlich stören, wenn Sie sie als text/html . Die Übermittlung einer internen Teilmenge in einem Nicht-XHTML-HTML5-Dokument ist nicht zulässig).

Die HTML5 wiki empfiehlt derzeit:

Verwenden Sie keine Entity-Referenzen in XHTML (außer für die 5 vordefinierten Entities: &amp; , &lt; , &gt; , &quot; y &apos; )

Und ich stimme diesem Rat zu, nicht nur für XHTML5, sondern für XML und HTML im Allgemeinen. Es gibt kaum noch einen Grund, die HTML-Entitäten für irgendetwas zu verwenden. Direkt eingegebene Unicode-Zeichen sind für jedermann viel besser lesbar, und &#...; Zeichenreferenzen stehen für die traurigen Fälle zur Verfügung, in denen ein 8-Bit/kodierungssauberer Transport nicht garantiert werden kann. (Da HTML-Entities für die meisten Unicode-Zeichen nicht definiert sind, werden Sie diese ohnehin benötigen).

6voto

mogsie Punkte 3807

Ich benötigte eine XML-Validierung von potenziell HTML 5. HTML 4 und XHTML hatten nur etwa 250 Entitäten, während der aktuelle Entwurf (Januar 2012) mehr als 2000 enthält.

GET 'http://www.w3.org/TR/html5-author/named-character-references.html' |
xmllint --html --xmlout --format --noent - | 
egrep '<code|<span.*glyph' |  # get only the bits we're interested in
sed -e 's/.*">/__/' | # Add some "__" markers to make e.g. whitespace
sed -e 's/<.*/__/' |  #  entities work with xargs
sed 's/"/\&quot;/' | # xmllint output contains " which messes up xargs
sed "s/'/\&apos;/" | # ditto apostrophes. Make them HTML entities instead.
xargs -n 2 echo |  # Put the entity names and values on one line
sed 's/__/<!ENTITY /' | # Make a DTD
sed 's/;__/ /' |
sed 's/ __/"/'  |
sed 's/__$/">/' |
egrep -v '\bapos\b|\bquot\b|\blt\b|\bgt\b|\bamp\b' # remove XML entities.

Das Ergebnis ist eine Datei mit 2114 Entitäten.

<!ENTITY AElig "&#xC6;">
<!ENTITY Aacute "&#xC1;">
<!ENTITY Abreve "&#x102;">
<!ENTITY Acirc "&#xC2;">
<!ENTITY Acy "&#x410;">
<!ENTITY Afr "&#x1D504;">

Wenn man dies in einen XML-Parser einfügt, sollte der XML-Parser in der Lage sein, diese Zeicheneinheiten aufzulösen.

Aktualisierung Oktober 2012 : Da der Arbeitsentwurf nun eine JSON-Datei enthält (ja, ich verwende immer noch reguläre Ausdrücke), habe ich ihn auf ein einziges sed reduziert:

curl -s 'http://www.w3.org/TR/html5-author/entities.json' |
sed -n '/^  "&/s/"&\([^;"]*\)[^0-9]*\[\([0-9]*\)\].*/<!ENTITY \1 "\&#\2;">/p' |
uniq

Natürlich wäre ein Javascript-Äquivalent viel robuster, aber nicht jeder hat Node installiert. Jeder hat sed, richtig? Zufällige Beispielausgabe:

<!ENTITY subsetneqq "&#10955;">
<!ENTITY subsim "&#10951;">
<!ENTITY subsub "&#10965;">
<!ENTITY subsup "&#10963;">
<!ENTITY succapprox "&#10936;">
<!ENTITY succ "&#8827;">

2voto

Evan Carroll Punkte 1

Die richtige Antwort (der moderne Weg)

Ich habe diese Frage schon vor fünf Jahren gestellt. Jetzt jede Browser unterstützt UTF-8. Und jede Inception von UTF-8 enthält Glyphenunterstützung für alle benannte Zeicheneinheiten. Die derzeit beste Lösung für dieses Problem ist, überhaupt keine benannten Entitäten zu verwenden, sondern die nur UTF-8 (strict) und darin tatsächlich Zeichen zu verwenden.

Dies ist eine Liste aller XML-Entitäten . Alle diese haben UTF-8-Zeichenalternativen - und so werden sie normalerweise auch gerendert.

Nehmen wir zum Beispiel

U+1D6D8, MATHEMATICAL BOLD SMALL CHI            , b.chi

Ich nehme an, in einer Variante von xml könnte man &b.chi oder so, auf der Suche nach MATHEMATICAL BOLD SMALL CHI finden Sie eine Seite auf fileformat.info die die Zeichen aufgelistet.

Alternativ können Sie unter Windows auch Folgendes eingeben Alt + 1 D 6 D 8 (die 1d68d stammt aus der Tabelle der XML-Entitäten), oder unter Linux Ctrl + Shift + u 1 D 6 D 8 .

Dadurch wird das Zeichen richtig in Ihr Dokument eingefügt.

2voto

midimagic Punkte 25

Mein bester Rat ist, nicht auf HTML5 oder XHTML5 zu aktualisieren, bis die Unterstützung für Character Entity Names bereitgestellt wird.

Jeder, der glaubt, dass &#12345; macht mehr Sinn als &mdash; braucht ein Gehirn-Upgrade. Die meisten Menschen können sich keine riesigen Zahlentabellen merken.

Diejenigen von uns, die mit älteren Betriebssystemen arbeiten müssen, um mit bestehender Hardware für Wissenschaft, Echtzeit oder Verkaufsstellen (oder Regierungsnetzwerken) kompatibel zu sein, können das Zeichen nicht einfach eintippen oder aus einer Liste auswählen. Es wird nicht korrekt in der Datei gespeichert.

Der Grund, warum uns dies aufgezwungen wurde, ist, dass das W3C die Kosten für die Bereitstellung von DTD-Dateien nicht mehr tragen will, so dass wir in die Steinzeit zurückkehren müssen.

Nichts von dem, was zur Verfügung gestellt wurde, sollte jemals veraltet sein.

0voto

Michael Earls Punkte 1307

Verwenden Sie die folgende Antwort: https://stackoverflow.com/a/9003931/689044 Ich habe die Datei erstellt und sie als Gist auf GitHub veröffentlicht: https://gist.github.com/cerkit/c2814d677854308cef57 für diejenigen unter Ihnen, die die Entitäten in einer Datei benötigen.

Ich habe es erfolgreich mit ASP.NET MVC verwendet, indem ich die Textdatei in das Application-Objekt geladen und diesen Wert zusammen mit meinem (wohlgeformten) HTML verwendet habe, um ein System.Xml.XmlDocument zu parsen.

XmlDocument doc = new XmlDocument();

// load the HTML entities into the document and add a root element so it will load
// The HTML entities are required or it won't load the document if it uses any entities (ex: &ndash;)
doc.LoadXml(string.Format("{0}<root>{1}</root>", Globals.HTML_ENTITIES, control.HtmlText));
var childNodes = doc.SelectSingleNode("//root").ChildNodes;
// do your work here    
foreach(XmlNode node in childNodes)
{
    // or here
}

Globals.HTML_ENTITIES ist eine statische Eigenschaft, die die Entities aus der Textdatei lädt und im Application-Objekt speichert oder die Werte verwendet, wenn sie bereits im Application-Objekt geladen sind.

public static class Globals
{   
    public static readonly string APPLICATION_KEY_HTML_ENTITIES = "HTML_ENTITIES";

    public static string HTML_ENTITIES
    {
        get
        {
            string retVal = null;
            // load the HTML entities from a text file if they're not in the Application object
            if(HttpContext.Current.Application[APPLICATION_KEY_HTML_ENTITIES] != null)
            {
                retVal = HttpContext.Current.Application[APPLICATION_KEY_HTML_ENTITIES].ToString();
            }
            else
            {
                using (StreamReader sr = File.OpenText(HttpContext.Current.Server.MapPath("~/Content/HtmlEntities/RootHtmlEntities.txt")))
                {
                    retVal = sr.ReadToEnd();
                    HttpContext.Current.Application[APPLICATION_KEY_HTML_ENTITIES] = retVal;
                }
            }

            return retVal;
        }
    }
}

Ich habe versucht, eine lange Zeichenkette zu erstellen, um die Werte zu speichern, aber Visual Studio stürzte immer wieder ab, so dass ich beschloss, dass es am besten wäre, die Textdatei zur Laufzeit zu laden und im Application-Objekt zu speichern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X