XMLにおける文字

XML における文字

[17] XML生成規則 Char は、XML で用いられる文字を表しています。 本項では Char やより一般に XML における文字の扱いについて扱います。

仕様書

定義

[23] 文字 (character) は、テキスト原子 (アトミック) な単位であり、 ISO/IEC 10646 によって規定されるものです。 >>18

[24] XMLISO/IEC 10646文字の定義としていますが、 Unicode にも言及していて、 両者を同じものとみなしているようです。
[25] 非文字文字に含まれるのか定かではありませんが、後述の通り XML で使えるものもあれば、使えないものもあります。サロゲートは使えません。

適合性

XML 1.0 (文字)XML 1.0 (文字参照)XML 1.1 (文字)XML 1.1 (文字参照)HTML (文字)HTML (文字参照)
U+0000 (NULL)×× (置換)
U+0001-U+0008×○ (非推奨)×
U+0009 (タブ)
U+000A (LF)
U+000B×○ (非推奨)×
U+000C (FF)×○ (非推奨)
U+000D (CR)○ (正規化)○ (正規化)○ (正規化)×
U+000E-U+001F×○ (非推奨)×
U+007F (DEL)○ (非推奨)×○ (非推奨)×
U+0080-U+0084○ (非推奨)×○ (非推奨)×× (置換)
U+0085 (NEL)○ (正規化)×× (置換)
U+0086-U+009F○ (非推奨)×○ (非推奨)×× (置換)
U+2028 (LS)○ (正規化)
U+D800-U+DFFF (surrogate)×× (置換)
U+FDD0-U+FDEF (非文字)○ (非推奨)×
U+FFFE-U+FFFF (非文字)×
U+???FE-U+???FF (非文字)○ (非推奨)×
U+10FFFE-U+10FFFF (非文字)○ (非推奨)×
U-00110000-×× (置換)

RestrictedChar

[19] XML 1.1 では Char の一部は RestrictedChar とされ、文字参照として XML で利用することはできるものの、直接含めることはできないとしていました。

[21] この RestrictedChar には、 XML 1.0 で利用できる文字も利用できない文字も含まれています。 XML 1.1 の実質的な後継である XML 1.0 5e にこの扱いは受け継がれていません。

互換性文字

[30] XMLNote は、著者に対し、 Unicode 2.3節に従い「compatibility characters」を避けることを勧めて (encourage) います。 >>18

[31] RFC 2119 助動詞は用いていないのですが、 「Note」が規定の一部かどうかは明記されておらず、 本項がどのような意義を持つのかはよくわかりません。

[35] 制御文字の多くや非文字も同じような扱いを受けています。 この部分は XML 1.0XML 1.1 でやや異なります。

[33] この条項は、日本の専門家と名乗る人々からの半角カナ排除の陳情 >>32 により追加されたようです。

XML における文字の好ましい扱い

[1] Unicode in XML and other Markup Languages という W3C WG Note http://www.w3.org/TR/unicode-xml/ / UTR #20 http://www.unicode.org/reports/tr20/ は、マーク付け言語で使うべきではない文字などを解説しています。

[37] 平成時代中頃に作られ、 「マーク付け言語」と言っていますが具体的には主に XML 1.0、 ある程度は HTML4 が想定されていました。

[39] UnicodeW3C国際化の専門家を称する人々によって開発されました。

[38] その後メンテナンスされずに放置され、 平成時代の末に正式に廃棄されました。 この仕様書について、開発の過程については unicode-xml 参照。

[40] 仕様書としての位置付け、対象読者はいまいちよくわからず、 標準技術の開発者にも著者にもあまり参照されることなく、 標準仕様や実装の状況ともあまり関係していません。

[41] W3C国際化の専門家を称する人々の文書にはよくあることですが、 専門家の間でだけ盛り上がって外部からはスルーされるパターンのやつです。
[42] 従って役に立つか立たないかでいうと微妙なラインですが、一応は参考くらいになると思って、 軽く眺めておくといいこともあるかもしれませんしないかもしれません。

マーク付け言語で不適切な文字

[2] 次の文字はマーク付け言語と一緒に使用するのは不適当です。 行分離子 LS, 段落分離子 PS, バイト順印 BOM を除いては、 UA は無視するのもよし。 適当なマークに変換するのは著述工具の責任だそうです。

符号位置名前HTML での代替メモ
U+2028LINE SEPARATORbr>>4
U+2029PARAGRAPH SEPARATORp>.4
U+202ALEFT-TO-RIGHT EMBEDDINGdir=ltr>>3
U+202BRIGHT-TO-LEFT EMBEDDINGdir=rtl>>3
U+202CPOP DIRECTIONAL FORMATTING</bdo>>>3
U+202DLEFT-TO-RIGHT OVERRIDE<bdo dir=ltr>>>3
U+202ERIGHT-TO-LEFT-OVERRIDE<bdo dir=rtl>>>3
U+206AINHIBIT SYMMETRIC SWAPPINGUnicode で非推奨 >>5
U+206BACTIVATE SYMMETRIC SWAPPINGUnicode で非推奨 >>5
U+206CINHIBIT ARABIC FORM SHAPINGUnicode で非推奨 >>5
U+206DACTIVATE ARABIC FORM SHAPINGUnicode で非推奨 >>5
U+206ENATIONAL DIGIT SHAPESU+0660U+0669Unicode で非推奨 >>5
U+206FNOMINAL DIGIT SHAPESU+0030U+0039Unicode で非推奨 >>5
U+FEFFZERO WIDTH NO-BREAK SPACEU+2060Unicode で非推奨 >>6
U+FFF9INTERLINEAR ANNOTATION ANCHOR<ruby><rb>>>7
U+FFFAINTERLINEAR ANNOTATION SEPARATOR</rb><rt>>>7
U+FFFBINTERLINEAR ANNOTATION TERMINATOR</rt></ruby>>7
U+FFFCOBJECT REPLACEMENT CHARACTERobject など>>8
U+1D173U+1D17Aタイ, スラーなど>>9
U+E0000U+E007FTagsxml:lang, lang>>9

参考: http://www.w3.org/TR/unicode-xml/#Suitable

[4] LSPS は、 ブラウザは空白とし、編集時は適当なマークに置き換えるのが適切です。

[3] BIDI 系は Strongly discouraged in [HTML 4.0] などと書かれていますが、 HTML 4 が激しく非推奨しているように読めて紛らわしい。 (IW:HTML4:"struct/dirlang.html#h-8.2.4" にはそんなことは書かれていません。)

http://www.w3.org/TR/unicode-xml/#Bidi で、 HTML 4 は文字コードによる書字方向指定と HTML のマークによる指定のいずれかだけを使うように求めているが、 文字コードによる指定は処理が複雑になってよくないのでマークを使えと言っています。

ブラウザは無視し、編集時はマークに変換するのがいいそうです。

[5] DIS10646 の遺産。ブラウザは無視したらよく、 編集時は警告でもして削除するのがよいですが、 適当に変換してもいいでしょう。ということです。

[6] U+FEFF は、 ZERO WIDTH NO-BREAK SPACEBYTE ORDER MARK の二つの機能を一つの符号位置に押し込んで、 あとから都合が悪くなったので ZWNBSP の機能を U+2026 WORD JOINER として分離したという恥ずかしい前歴があります。

従って今では U+FEFFZWNBSP として使用することは Unicode が非推奨としています。

ブラウザは文中の U+FEFFZWNBSP として扱い、編集時は ZWJ に置き換えてしまう及び/又は警告を発してよいとされています。

[7] Unicode に通称 ruby tag が入った経緯は http://www.kobysh.com/tlk/digitalculture/1998-ruby.html でも見てください。阿呆らしい。

ブラウザは無視してかまいません。 編集時は次のひとつ以上の動作を取ってかまいません。

(ブラウザも完全に無視したら駄目だと思うのだけどなあ。 rt 部分を削除しないと。)

[8] ブラウザは無視してかまいません。 編集時は適当なマークに置換可能ならそうしてもいいし、 警告を出せるなら出して、削除してしまってかまいません。

[9] ブラウザは無視してかまいません。 編集時には削除しても適当なマークに置換してもかまいません。

マーク付け言語で適当な書式文字

[10] http://www.w3.org/TR/unicode-xml/#Format がマーク付け言語で使うのは適切だと言っている文字と、 その説明をどうぞ:

符号位置名前メモ
U+00A0NO-BREAK SPACE
U+00ADSOFT HYPHEN
U+034FCOMBINING GRAPHEME JOINER>>11
U+0600ARABIC NUMBER SIGN
U+0601ARABIC SIGN SANAH
U+0602ARABIC FOOTNOTE MARKER
U+0603ARABIC SIGN SAFHA
U+06DDARABIC END OF AYAH
U+070CSYRIAC HARKLEAN METOBELUS
U+0F0CTIBETAN MARK DELIMITER TSHEG BSTAR
U+180BMONGOLIAN FREE VARIATION SELECTOR ONE
U+180CMONGOLIAN FREE VARIATION SELECTOR TWO
U+180DMONGOLIAN FREE VARIATION SELECTOR THREE
U+180EMONGOLIAN VOWEL SEPARATOR
U+200CZERO WIDTH NON-JOINER
U+200DZERO WIDTH JOINER
U+200ELEFT-TO-RIGHT MARK
U+200FRIGHT-TO-LEFT MARK
U+2011NON-BREAKING HYPHEN
U+202FNARROW NO-BREAK SPACE
U+2044FRACTION SLASH
U+2060WORD JOINER
U+2061FUNCTION APPLICATION
U+2062INVISIBLE TIMES
U+2063INVISIBLE SEPARATOR
U+2FF0U+2FFBIdeographic Description Characters
U+303EIDEOGRAPHIC VARIATION INDICATOR
U+FE00U+FE0F, U+E0100U+E01DFVariation Selectors

[11] http://www.w3.org/TR/2003/NOTE-unicode-xml-20030613/#Format では Combining Grapheme JoinerU+0363 になっていますが、 U+0363COMBINING LATIN SMALL LETTER A だったりします。

[12] ここに挙がっている文字は、大体は、純粋(謎)な文字としての表現と書式 (極端に言えば飾り) との区別が難しい表現を実現するためのものです。 ハイフン付け関係などは本来マーク + スタイル言語で実現するべきだとは思いますが、 スタイル言語の規格および実装が完成していない現状ではマーク付け言語で使っても仕方がないでしょう。 (といっても文字としても実装されている例はさほどないのだけど。)

ただし、 FRACTION SLASH などは、 MathML で実現できると書いているくらいですから、 不適当に分類するべきではないですか。

互換写像を持つ文字

[13] 互換写像を持つ文字を含む文章をマークするときの処遇が http://www.w3.org/TR/unicode-xml/#Compatibility に書かれています。

互換写像を持つ文字には、丸付き文字、片仮名の組み文字、 全角文字、半角文字などが含まれます。 いずれも、本来は組版の機能により実現されるべきものですが、 文字コードの闇歴史で次々と実用化(wされてきました (そして Unicode はそれを貪欲に取込んでいます)。

互換写像を持つ文字は、一般には機械的にマークに置き換えることはできません。 (不思議マーク付けを機械的に Strict 化できないのと同じ理由。) http://www.w3.org/TR/unicode-xml/#Compatibility はどれは機械的に変換できて、どれはとりあえず残すべきかをまとめています。

互換写像を持つ文字は、マーク付けとスタイル指定で置き換えることができます。 ただし、 CSS ですべてを表現できるわけではありません。 たとえば丸付きは CSS では実現できません。 組み文字のように CSS 3 で実現しそうなものもあります。

[36] XML 1.0 / XML 1.1 の附属書には、互換写像があっても常用される文字がいくつかあると書いてあります。 一律で制限するのは危険です。

表現情報付きの文字

[14] http://www.w3.org/TR/unicode-xml/#Generating によれば、「斜体の hello」はマークで実現するべきだが、 プランク定数 (斜体の h) は U+210E を使うべきだと言っています。

[15] しかし >>14 のようなやり方には批判的な意見もあります。 文字コードが深い意味まで介入した結果が U+1D400U+1D7FF (Mathematical Alphanumeric Symbols) です。 (数式では普通の a と太字の a と 斜体の a と・・・は意味が違うかもしれないから云々の結果、 数学用と称して太字だの斜体だの sans serif だの、 沢山の a が符号化されています。)

非文字

[16] 非文字符号位置は、応用が内部で使ってもかまいませんが、情報交換に用いるべきではありません。 http://www.w3.org/TR/unicode-xml/#Noncharacters

XML1.1 では非文字は除外されていますが、 XML1.0 は制定時期の関係から多くの非文字は除外されていません。

[34] これに関する XML 本体規格の記述には問題がありました。 非文字

応用

[3]

The use of the word "character" in this document is in the sense of production [2] of [Extensible Markup Language (XML) 1.0 Recommendation (Third Edition)].

[15] XQuery 1.0 and XPath 2.0 Functions and Operators (Second Edition) http://www.w3.org/TR/2010/REC-xpath-functions-20101214/#string-types

歴史

[26] 適合するものの非推奨 (discouraged) である符号位置のリストは、 XML 1.0 2e に対する正誤表で2003年3月に追加されました >>27

[28] この時既に U+0085 が除外されています。

関連

[22] XMLにおける文字コードXMLにおける名前の項も参照してください。

メモ

[29] RFC 6241 - Network Configuration Protocol (NETCONF) () https://tools.ietf.org/html/rfc6241#section-2.2

The

authenticated identity of a client is commonly referred to as the

NETCONF username. The username is a string of characters that match

the "Char" production from Section 2.2 of [W3C.REC-xml-20001006].