11

XHTML5は、 やなどの文字エンティティをサポートしていますか—。職場では、サイトの管理者側にアクセスするために特定のソフトウェアを要求することができ、人々はマルチファイルのアップロードを要求しています。私にとって、これはFF 3.6+への移行を要求する簡単な理由なので、すぐに実行します。現在XHTML1.1を使用していますが、HTML5に移行すると、文字エンティティ名にのみ問題が発生します...これに関するドキュメントはありますか?

WHATWG仕様にリストがあるようですが、それがとして提供されるファイルに影響するかどうかはわかりませんapplication/xhtml+xml。いずれにせよ、ChromiumnightlyとFF3.6の両方で前述の2つのトリガーエラーが発生します。

4

5 に答える 5

13

XHTML5にはDTDがないため、XMLパーサーはエンティティ定義(事前定義されたものを除く)を認識しません。エンティティを使用する場合は、内部サブセットでエンティティを自分で定義する必要があります。

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

(もちろん、内部サブセットを使用すると、ブラウザーを次のように提供すると、ブラウザーがトリップする可能性がありますtext/html。XHTML以外のHTML5ドキュメントで内部サブセットを送信することは許可されていません。)

HTML5 wikiは現在、以下を推奨しています。

XHTMLでエンティティ参照を使用しないでください(5つの事前定義されたエンティティを除く:&amp;、、、、および)&lt;&gt;&quot;&apos;

そして、私はXHTML5だけでなく、XMLとHTML全般についてもこのアドバイスに同意します。今日、HTMLエンティティを何かに使用する理由はほとんどありません。直接入力されたUnicode文字は、誰にとってもはるかに読みやすく&#...;、8ビット/エンコーディングクリーンなトランスポートを保証できない悲しいケースでは、文字参照を利用できます。(HTMLエンティティはほとんどのUnicode文字に対して定義されていないため、とにかくそれらが必要になります。)

于 2010-07-09T17:57:57.647 に答える
6

潜在的にHTML5のXML検証が必要でした。HTML4とXHTMLには平凡な250程度のエンティティしかありませんでしたが、現在のドラフト(2012年1月)には2000以上あります。

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.

最終的に2114個のエンティティを含むファイルになります。

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

これをXMLパーサーに接続すると、XMLパーサーがこれらの文字エンティティを解決できるようになります。

2012年10月の更新:作業ドラフトにJSONファイルが含まれるようになったため(はい、まだ正規表現を使用しています)、単一のsedに絞り込みました。

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

もちろん、同等のjavascriptの方がはるかに堅牢ですが、すべての人がノードをインストールしているわけではありません。誰もがsedしましたよね?ランダムサンプル出力:

<!ENTITY subsetneqq "&#10955;">
<!ENTITY subsim "&#10951;">
<!ENTITY subsub "&#10965;">
<!ENTITY subsup "&#10963;">
<!ENTITY succapprox "&#10936;">
<!ENTITY succ "&#8827;">
于 2012-01-25T14:00:56.410 に答える
2

正解(現代的な方法)

私は5年前にこの質問をしました。現在、すべてのブラウザがUTF-8をサポートしています。また、UTF-8のすべての開始には、すべての名前付き文字エンティティのグリフサポートが含まれています。この問題に対する現在の最も適切な解決策は、名前付きエンティティをまったく使用せず、 UTF-8(厳密)のみを提供し、その中で実際に文字を使用することです。

これは、すべてのXMLエンティティのリストです。これらはすべてUTF-8文字の選択肢があり、とにかく通常はそのようにレンダリングされます。

たとえば、

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

私はあなたが持っているかもしれないxmlのいくつかの変種&b.chiか何かで、MATHEMATICAL BOLD SMALL CHIあなたを検索すると、fileformat.info文字がリストされているページが見つかると思います。

または、WindowsではAlt+ 1 D 6 D 8(1d68dはXMLエンティティのテーブルから取得)と入力するか、LinuxではCtrl++Shiftと入力しu 1 D 6 D 8ます。

これにより、キャラクターがドキュメントに正しく配置されます。

于 2015-12-03T18:50:58.033 に答える
1

私の最善のアドバイスは、文字エンティティ名のサポートが提供されるまで、HTML5またはXHTML5にアップグレードしないことです。

それが頭脳のアップグレードを必要と&#12345;するよりも理にかなっていると思う人は誰でも。&mdash;ほとんどの人は膨大な数の表を思い出せません。

既存の科学、リアルタイム、またはPOSハードウェア(または政府のネットワーク)と互換性を持たせるために古いオペレーティングシステムを使用し続ける必要がある人は、文字を入力したり、リストから選択したりすることはできません。ファイルに正しく保存されません。

これが私たちに課せられた理由は、w3cがDTDファイルを提供する費用をもはや必要としないため、石器時代に戻らなければならないからです。

提供されているこのようなものは、廃止されるべきではありません。

于 2015-12-03T15:00:47.303 に答える
0

次の回答を使用して:https ://stackoverflow.com/a/9003931/689044 、ファイルを作成し、GitHubにGistとして投稿しました:https //gist.github.com/cerkit/c2814d677854308cef57ファイル内のエンティティが必要です。

テキストファイルをApplicationオブジェクトにロードし、その値を(整形式の)HTMLで使用してSystem.Xml.XmlDocumentを解析することにより、ASP.NETMVCで正常に使用しました。

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は、テキストファイルからエンティティをロードしてApplicationオブジェクトに格納する静的プロパティです。または、すでにApplicationオブジェクトにロードされている場合は、値を使用します。

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;
        }
    }
}

値を保持するために長い文字列を作成しようとしましたが、Visual Studioがクラッシュし続けたため、実行時にテキストファイルを読み込んで、Applicationオブジェクトに保存するのが最善の方法であると判断しました。

于 2015-05-19T21:15:29.280 に答える