text/htmlのXHTML(1.0)文書のデフォルトの文字エンコーディングは

XML宣言とDOCTYPE宣言 - vantguarde - web:gをきっかけにXHTML Media Types - Second Editionを見て、XHTML Media Types(FE, SE)のtext/htmlの項とXHTML 1.0 SEやXHTML Media Types FEのHTML互換性ガイドラインはデフォルトの文字エンコーディングの点で矛盾があるのでは、と思いました。

  • XHTML Media Types(FE, SE)のtext/htmlの項(これをAとする)ではまた、制作者は文字エンコーディングに関する問題についても注意すべきである。「XHTML 文書は XML 文書であるから、明示的に文字エンコーディングが宣言されていない場合には、UTF-8 ないし UTF-16エンコードされているものとして扱うべきである」というのは典型的な誤解である。この文言は、XHTML 文書が text/html として提供されている場合には適切ではない*1...(Authors should also be careful about character encoding issues. A typical misunderstanding is that since an XHTML document is an XML document, the character encoding of an XHTML document should be treated as UTF-8 or UTF-16 in the absence of an explicit character encoding information. This is NOT the case when an XHTML document is served as 'text/html'....)などと言っている
  • XHTML Media Types(SE)のHTML互換性ガイドラインの処理命令とXML宣言の項(これをBとする)では、文書にXML宣言が含まれず文字エンコーディングがHTTPのようなより高いレベルのプロトコルで指定されていないとき、文書はデフォルト文字エンコーディングUTF-8UTF-16だけを使うことが出来る...などと言っている (Remember, however, that when the XML declaration is not included in a document, AND the character encoding is not specified by a higher level protocol such as HTTP, the document can only use the default character encodings UTF-8 or UTF-16. XHTML 1.0 SEではHTTPなどを考慮していない文言)

なのでデフォルトの文字エンコーディングを仮定するべきでないというAとUTF-8/UTF-16で書けるというBで矛盾しているのではないか、という。

追記 (2008-05-28, 北村さん(id:kits)へ)

text/htmlではデフォルトcharsetを仮定すべきでない(RFC 2854)、という話と、XML文書ではUTF-8/UTF-16がデフォルト(XML仕様)、という話だと思う。

はてなブックマーク - kitsのブックマーク / 2008年5月26日

それについては異論ありませんが、ではHTML互換性ガイドラインが仕様(XHTML 1.0 SE, XHTML Media Types SE (Editor's Draft, 2008-04-23))の言うように文書をHTML UAでもレンダリングしたい文書作成者のための設計ガイドラインだとして、何故HTML(text/html)には適用されないルールを何の注釈もなしに記述しているのでしょうか。HTML互換性ガイドラインを特に参照する文書作成者に対して「HTML(text/html)として扱われるXHTML文書でも、XML宣言を省略したり文字エンコーディングを明示しない場合にはUTF-8UTF-16で書けば何の問題も無い」といった認識を誘わないでしょうか?(というのは自分が誤読した経験があるからなのですが…)

追記 (2008-06-02, 北村さん(id:kits)へ)

確かにcrndさんの引用箇所(Remember, however, that ...)に注目すると「UTF-8, UTF-16で書ける」という話にとれなくもないですが、そのもう少し前からの文章の流れを読むと、そもそもこの箇所は「XML処理命令・XML宣言を省略する」ということが主題となっているものと思います。見出しも Processing Instructions and the XML Declaration となっていますし。

文字エンコーディングについて、text/htmlの事情とXMLの事情 - 徒書

Processing Instructions and the XML Declarationに対して自分は「XML仕様またはXMLとして扱われる文書として」という前提が弱いような印象を持ったので(HTML互換性ガイドライン全体が「HTMLとして扱うXHTML文書として」という前提を持っている印象が強いのもあり…)、XML処理命令・XML宣言を省略する」ということが主題となっていても「XML仕様、XML文書としてはこうだよ」と範囲を狭めて述べているといまいち受け取れなかった、というのが今回の疑問に繋がっていました。

互換性を考慮するにあたっては、単にHTMLの側の事情のみを考えるのは不十分で、XML側の事情にも配慮してはじめて互換が達成できるわけですから、「XML宣言を外す」という命題において「XML側ではこのような事情がある」という点に言及することは、やはり必要なことだと思います。

文字エンコーディングについて、text/htmlの事情とXMLの事情 - 徒書

この点は全くその通りだと思います。仕様にはもう少しそれを明確に書いてもらえると…という希望を持つ自分は読解力が足りないのだと感じました。

*1:FEとSEで文言が同じなのでXHTML Media Types (ja)から引用

韻踏合組合 - SUPERSTAR

SUPERSTAR

SUPERSTAR

inputイベントのブラウザの対応が意外と進んでいる?

  • inputイベントはWeb Forms 2.0の草案で定義されているイベントで、フォームコントロールに入力されている値がユーザの入力によって変更されたときに発生するイベント
    • changeイベントと違ってフォーカスが外れることがイベント発生条件ではない
    • キャレットを動かしただけ、などの場合は入力による変更がないのでイベントは発生しない
    • キーボード入力だけが対象というわけではないのでコピー&ペーストやドラッグ&ドロップなどで入力がされた場合でもイベントが発生する、かもしれない
  • テキスト入力欄上であれば、試した限りではFirefox(2.0.0.14 - 3 beta 5), Opera(9.0 - 9.5 beta 2), Safari(3.1) (windows)で一応使える

テスト

<!DOCTYPE html>
<html><head><title>input event test</title>
<script type="text/javascript">
function log(value){
  var count = document.getElementById("count");
  count.firstChild.data = +count.firstChild.data + 1;
  var log = document.getElementById("log");
  var logtext = (log.firstChild || log.appendChild(document.createTextNode("")));
  logtext.data += value + "\n";
}
</script></head><body>
<h1>input event test</h1>
<p>Input: <input type="text" oninput="log(value)"></p>
<p>Count: <span id="count">0</span></p>
<pre id="log"></pre>
</body></html>
  • DOM Eventsのtarget.addEventListener("input", ...);でも可
  • このテストの場合、IEではonpropertychange="if (event.propertyName=='value') log(value)"などとして擬似的な対応が出来る、かもしれない

File I/O

Dragonfly

汎用メソッドの簡易記法の擬似対応

  • いろいろ参考にしつつ自分で書いてみる
  • 関数のlengthを本物と同じにする(例えばArray.forEach.length == 2)

コード

(function(){
  var objects = {
    String: [
      "charAt", "charCodeAt", "concat", "indexOf", "lastIndexOf",
      "localeCompare", "match" /*, "quote"*/, "replace", "search",
      "slice", "split", "substr", "substring", "toLocaleLowerCase",
      "toLocaleUpperCase", "toLowerCase", "toUpperCase" //, ...
    ],
    Array: [
      "pop", "push", "reverse", "shift", "sort",
      "splice", "unshift", "concat", "join", "slice",
      "indexOf", "lastIndexOf", "filter", "forEach", "every", "map", "some"
      //, "reduce", "reduceRight" //, ...
    ]
    //, ... 
  };
  var global = this;
  for (var name in objects) if (objects.hasOwnProperty(name)) {
    var methods = objects[name];
    for (var i = 0, len = methods.length, m, o; i < len; i++) {
      m = methods[i];
      o = global[name];
      if (!(m in o.prototype) || m in o) continue;

      //Array.forEach = function($,$){
      //return Function.prototype.call.apply(Array.prototype.forEach, arguments);
      //}
      o[m] = new Function(
        new Array(o.prototype[m].length + 2).join("$,").slice(0, -1),
        "return Function.prototype.call.apply(" +
          name + ".prototype." + m + ", arguments);"
      );
    }
  }
})();

問題

  • 関数を呼び出すと合計3回関数が呼ばれる (擬似メソッド→apply()→call())
    • Function.prototype.call.apply(functionObject, arguments)functionObject.apply(arguments[0], Array.prototype.slice.call(arguments, 1))、どちらが良い?

メモ

  • (仕様による言及があるので)重複する引数名を持つ関数を定義しても一応良いらしい
    • 2 つ以上の仮引数が同じ名前のために同じプロパティを共有する場合、該当するプロパティは、後出のパラメータに供給された値を与えられる
  • 本物の場合、toString()などは汎用メソッドのものにはなっていない
    • 例えばArray.toString([1,2,3])としても"1,2,3"とはならない