• ベストアンサー

encoding="UTF-16" ってUTF-16で書かれても。

 以前からずっと疑問だったのですが。。。  XML宣言の中に、エンコーディングを記述するところがありますが、その宣言文字列自体をそのエンコーディングで記述するというのはおかしくないでしょうか。  たとえば、UTF-16だったら、 encoding="UTF-16" と書くわけですが、これ自体がUTF-16で書かれているわけですよね? UTF-16で書かれているとわかっていたら宣言する必要はないし、宣言読まないとわからないんだったら、この宣言自体も読めないはずです。  今実際に、UTF-16で書かれていて、エンコーディング宣言もしているXML文書をあるソフトで読もうとしているのですが、1バイト目を読んだところで「Unexpected character. position = 0 」と出力されてエラーになります。  強制的にUTF-16で読ませる昨日もあるので、そうすればエラーは起こりませんが、それじゃエンコーディング宣言の存在自体に意味がないのでは? これは、最初の時点で読めないこと自体がこのソフトの不具合なのでしょうか?  これってどういうことなんでしょう。解決できるんでしょうか。

  • XML
  • 回答数7
  • ありがとう数10

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

参考書の受け売りでスイマセン。O'Reilly から出ている "XML in a nutshell" というリファレンス本に、XML パーサのエンコーディング想定処理についての記述がありました。以下、拙訳ですが、当該部分の引用です。 -- * -- * -- (略) XML パーサは、文書の最初の数バイトからその文字セットの想定を試みるだろう。パーサによる基本的なチェックは以下の処理を含む: ・もし最初の2バイトが #xFEFF の場合、パーサはそのバイト列をユニコードのバイトオーダーマーク(BOM)と認識するであろう。そして、その文章はビッグエンディアンのユニコードの UCS-2 (訳注; UTF-16)で記述されていると想定される。その知識に基づいて、残りの文章を読み進める。 ・もし最初の2バイトが #xFFFE の場合、パーサはそのバイト列をユニコードのバイトオーダーマーク(BOM)と認識するであろう。そして、その文章はリトルエンディアンのユニコードの UCS-2 (訳注; UTF-16)で記述されていると想定される。その知識に基づいて、残りの文章を読み進める。 ・もし最初の4バイトが #x3C3F786D の場合、つまりこれは ASCII 文字の "<?xml" だが、その場合そのファイルは ASCII 文字の上位セットで記述されていると想定される。特にユニコードの UTF-8 で記述されていると仮定するかもしれない。仮にそれが間違いだったとしても、この情報は、どの文字セットを実際に使っているかの宣言に辿り着く迄は、残りの文章を読み進める上では十分と言えよう。 -- * -- * -- 他にも、XML パーサは UTF-8 と UTF-16 には対応していなければならないような記述もありますので、上記のような UTF-16 を前提とした処理も必要なのではないでしょうか。

参考URL:
http://www.oreilly.com/catalog/xmlnut3/
annyGrace
質問者

お礼

ありがとうございました。 つまり、xmlというのは、 ・UTF-16 ・ASCIIの上位文字セット だけでしか記述できないという仕様である、というわけですね。やはり、基本的には「汎用機の文字セットなどではXMLは記述できない」となりますね。少なくとも規格としてはサポートできない。FEFFなどを文字として扱う処理系があったらもうダメですからね。 そして、「encoding=」で記述するのは、ASCIIの上位セットの判別のためだけ、ということになるんでしょうか。つまり、UTF-16で書いている場合には、最初の2バイトで判別しているので、「encoding=」で指定しても意味がない、ということになるわけですからね。 それでしたら納得です。やっぱり「encoding='UTF-16'」は意味がないみたいですね。ダブルチェックのためくらいには使えるかもしれないですけど、それを読んで判別しているわけではないのですね。 どうもありがとうございました。長年の謎が(釈然とはしないながらも)理解できました。

annyGrace
質問者

補足

あ、訳までして頂いたんですね! 本当に本当にありがとうございました。とても役に立ちました。<(_ _)>

その他の回答 (6)

  • UKY
  • ベストアンサー率50% (604/1207)
回答No.7

> そのXMLのエンコーディングが「必ずasciiで記述されている」別のファイルを用意するような仕様にするとか うーん、それだったら最初から「XML は UTF-8/16 でしか書いてはいけない」って決めちゃったほうが楽ですよね。実際、仕様策定者たちも本音としてはそうしたかったんじゃないでしょうか。 でもさすがに UTF-8/16 だけっていうわけには行かないから、「UTF-8/16 は必ず対応し、他のエンコーディングは各プロセッサが任意に対応する」という仕様に落ち着いたと。

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.6

>と思ったのですが、考えてみたらエンコーディングを指定して >読ませれば読めるので、先頭のバイトオーダーマークについて >はきちんと解釈しているようです。 憶測のみで申し訳ありませんが、そうとも限りません。 「エンコーディングを指定された時は、指定のフォーマットでのデコードを試み、デコードされた文字のみ読み込む」と言う処理をする筈です。 ですので「先頭のバイトオーダーマークを無視して読み込んでいる」と言う可能性があります。 たぶん、該当ソフトは「リトルエディアンとビックエディアンの両方でコード変換を試してみて、上手く行った方で、リトルかビックかエディアンを決めている」と言う事をしているのでしょう。 で、ファイルの先頭のバイトオーダーマークは ff fe と fe ff の片方だけを正常と判定し、もう片方をエラーにしちゃってる可能性が高いです。 つまり「バイトオーダーマーク」を「UTF-16ファイル固有の固定のマーク」と勘違いしちゃってる、のではないかと。

回答No.5

ちょっと補足です。XMLパーサは、ASCIIの上位セットとUTF-16は対応する必要がありそうですが、それ以外の文字セットに対応していけないワケではなく、先ほどの例のように文字セット毎の判定処理が必要になる、というだけかと思ってます。 件の本でも「(例えば)EBCDIC や UCS-4 を理解できるパーサは、同様のヒューリスティックなエンコーディング判定処理が必要になる」という記述があります。 いずれにせよ、annyGrace さんの疑問についてはパーサにて UTF-16 を想定した BOM 周辺処理(実際は BOM がない場合でも UTF-16 かどうか判定可能でないとまずそうですが)が必要ではないかと思います。

  • UKY
  • ベストアンサー率50% (604/1207)
回答No.3

まあたしかに、おっしゃるとおりですね。 UTF-8 や Shift_JIS のように ASCII と互換性のあるエンコーディングなら XML 宣言を見てから判断するということもできますが、UTF-16 だとそういうわけには行きませんね。 UTF-16 であることを示す記述を UTF-16 でエンコードした状態で読み込ませても意味がないというのはもっともですが、これは UTF-16 に限らずどのエンコーディングを使った場合にも言えることで、それは XML 文書がもともとテキストファイルである以上どうしようもないことです。 ただ、エンコーディングを判別するための手がかりとしては、XML 宣言は決して無駄ではないと思います。とりあえず XML 宣言の部分だけでも読み込めれば後は何とかなるんですから。 ところで、ソフトで読み込めないのはたぶんそのソフトに不具合があるか、ソフトのエンコーディング判別機能があまり賢くないからだと思います。

annyGrace
質問者

補足

むー、そうでしょうか。 たとえば僕だったら、そのXMLのエンコーディングが「必ずasciiで記述されている」別のファイルを用意するような仕様にするとか、まあそんなカンジにするんじゃないかと思います。今でもXMLはそれ単体で機能することはまれで、DTDやらXMLスキーマなんかの別のファイルを必要とするんですから。 いずれにせよ、目的地までの地図を、その目的地だけでしか配ってないような、こんな**な仕様がなんで平然とまかり通っているのか不思議でなりません。KEISとかJEFとかでXMLって書けるのだろうか。

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

宣言自体が何で書かれているにせよ「宣言がある」と言うのが重要です。 例えば「『あいうえお』をUTF-16にエンコードしたバイト列」と「画像データの先頭数バイト」が偶然に一致してしまった場合を考えて下さい。 もし「宣言」が無ければ「UTF-16にエンコードしたバイト列」なのか「画像データの先頭数バイト」なのか、判断する事が出来ません。なぜなら、どちらも「あいうえお」を示す文字列と同じデータ列な訳ですから。 その為、宣言自体が何で書かれているにせよ「宣言されている事が重要」なのです。 それと、最初の1バイト目を読んでエラーになるソフトの件ですが、たぶん、ソフト側の不具合です。 UTF-16のエンコードでは「16ビットデータのバイト並び」がリトルエディアンとビックエディアンの2種類あります(上位バイトと下位バイトのどちらが先に来るか、で2種) そこで、データがリトルエディアンなのかビックエディアンなのか判断する為、ファイルの先頭1バイトに「バイトオーダーマーク」を入れて、エディアンがどちらか判断出来るようになっています。 あくまで予想ですが、不具合が出ているソフトは「先頭にバイトオーダーマークがあった時の事」を考慮していないのでしょう。 このソフトがエラーを起こすのは「宣言の有無」は無関係で、単純に「2つある形式のうち、1つの形式でしか読めない。もう1つの形式をサポートしてない。つまり、ソフト開発者がUTF-16を良く判ってない」だけなのでしょう。 ソフトの開発元に「UTF-16のリトルエディアンとビックエディアンのうち片方しか読めない不具合がある。両方のUTF-16を読めるように修正してくれ」と不具合報告、修正要望を出してみては如何でしょう?

annyGrace
質問者

お礼

うーん、どうなんでしょう。 「偶然一致する可能性」という話であれば、「encoding='UTF16'」という文字列と「偶然一致する可能性」もありますから。可能性が高いからダメ、低いからOK、なんて、まあ大学生が作ってるフリーウェアの仕様であればまだしも、国際的な標準化団体の規格として策定してしまっていいものかという気はしますが。 ただ、UTF-16の先頭のエンディアン判別記号の問題については了解しました。どうやらそうみたいですね。おっしゃるとおりにしてみたいと思います。ありがとうございました。

annyGrace
質問者

補足

と思ったのですが、考えてみたらエンコーディングを指定して読ませれば読めるので、先頭のバイトオーダーマークについてはきちんと解釈しているようです。 やはり「UTF-16で書かれている」ということ自体を認識できないのではないかという気がしてきました。

  • TT414
  • ベストアンサー率18% (72/384)
回答No.1

>これ自体がUTF-16で書かれているわけですよね? 違いますよ encoding="UTF-16" この部分はASCIIで書かれています。

annyGrace
質問者

補足

え?そうなんですか? ということは、たとえば秀丸なんかではUTF-16でファイルを保存する機能はありますが、一部だけをASCIIにする機能はないので、XMLが書けない、ということになるのでしょうか。 UTF-16でXMLを書こうとしたら、それ専用のアプリケーションを使う必要がある、ということですか? これってXMLの思想に反しているような気がするのですが。。。

関連するQ&A

  • phpと<?xml version="1.0" encoding="utf-8"?>

    phpファイルの頭に<?xml version="1.0" encoding="utf-8"?>を入れると Parse error: syntax error, unexpected T_STRING in ・・・ というエラーが出ます。 なぜでしょう?

    • ベストアンサー
    • PHP
  • encoding="unicode"について

    ものすごい初歩的な質問で申し訳ないのですが、回答をお願いします。 <?xml version="1.0" encoding="Unicode" ?> と宣言したうえで、 UTF-16でエンコードして保存します(utf16_1.xml)。 このutf16.xmlをIE7で表示しようとすると正しく表示されますが、 UTF-8でエンコードして保存(utf8_1.xml)したものを IE7で表示しようとすると解析エラーとなります。 続いて<?xml version="1.0" encoding="UTF-16" ?>と宣言して、 UTF-16でエンコードして保存(utf16_2.xml)したものはIE7で正しく表示され、 <?xml version="1.0" encoding="UTF-8" ?>と宣言して、 UTF-8でエンコードして保存(utf8_2.xml)したものはIE7で正しく表示されます。 (まぁ、これは当たり前ですけど) ここからが本題なのですが、共にUTF-16で保存したとして、 encodingの指定でUnicodeと指定した場合と、UTF-16とした場合では、 表示結果は同じに見えますが、同じ意味となるのでしょうか? 両者間で文字化けなどが発生しないのかを確認したいです。 Unicodeの知識もあまりないので、その辺を踏まえて、 回答いただけますと幸いです。

    • 締切済み
    • XML
  • エンコーディングについて

    初歩的な質問で申し訳ありません。 XML文書の最初に <?xml version="1.0" encoding="UTF-8"?> と宣言して、XML文書を書いたのですが、日本語が出てきたところで 「テキストの内容に無効な文字が見つかりました。」 というエラーメッセージが出て表示出来ませんでした。 encodingを"Shift_JIS"に変更すると表示出来たのですが、同じ構造のファイルを同一フォルダで作成してるのですが、こちらはUTF-8という宣言で問題ないようです。 UTF-8に統一して表示させたいのですが、どなたか解決方法をご教授願えないでしょうか。 宜しくお願いいたします。 (仕事の書類上全ソースは公開出来ません。ご了承のほどお願いします。)

    • ベストアンサー
    • XML
  • xhtmlについて

    xhtmlについて2点質問があります。 1.xmlの先頭1行のような記述は必要ですか? xmlは<?xml version="1.0" encoding="UTF-8" ?>のような宣言を1行目に必ず記述する必要がありますが、xhtmlもそうなのでしょうか?W3CのValidatorを使ってみましたが、あってもなくても違いが無かったようです。厳密には在った方が良いのですかね? 2.エンコードはUTF-8にするべき? xmlは基本的にencoding="UTF-8"ですが、UTF-8だと日本語表示が出来ません。しかしshift-jisはあまり推奨されないという話も聞いたことがあります。質問1の記述が必要になった場合、encoding="UTF-8"にするべきなのでしょうか?UTF-8がどれだけ普及しているのかも気になります。

    • ベストアンサー
    • HTML
  • XMLで特殊文字を扱うにはどうしたらいいのでしょうか?

    XMLに記述した特殊文字(記号)をブラウザに表示させるにはどうしたらいいのでしょうか? <?xml version="1.0" encoding="UTF-8" ?> <文書>  <タイトル>   サンプル  </タイトル>  <内容>     ←ここで記述したいです。   </内容> </文書> 申し訳ありませんがご教授いただけませんでしょうか? 宜しくお願いします。

    • ベストアンサー
    • XML
  • XHTML1.1でのXML宣言とDTD宣言の書き方

    XML宣言によるレイアウトの崩れ等の質問はありましたが今回の質問と同じ内容は私には見当たらなかったため質問させて頂きます。 XHTMLでのXML宣言を <?xml version="1.0" encoding="utf-8"?> と記述しています。 上記の記述と <?xml version="1.0" encoding="UTF-8"?> とで、文字コードの大文字か小文字かの違いだけなのですがどちらの方が良いのでしょうか。 同じくDTD宣言を <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> と記述しています。 XMLでは大文字と小文字を区別して扱うため必ず半角で書かなければならないとされていますが、XHTMLでマークアップされているサイトのソースを見るとどこもXML宣言での文字コードとDTD宣言では大文字が使用されています。 細か過ぎるというのは分かっているのですが厳密にはどのような記載が正しいのでしょうか。 ※今回投稿カテゴリーの小カテゴリーにて”XML”を選択致しましたがXHTMLについての質問の場合”XML”と”HTML”どちらにするべきでしょうか。 合わせてご返答、又はご意見を頂戴できれば幸いです。

    • 締切済み
    • XML
  • ASP.NETでのオラクルAL16UTF16について

    ASP.NETでのオラクルAL16UTF16について OS WindowsXP VisualStudio .NET 2003 + Oracle 10g にてASP.NET 2.0 の 開発を行っています。 オラクルではキャラクタセットでAL16UTF16を指定しています。 ASP.NETでは、web.configで <?xml version="1.0" encoding="utf-8" ?> と <globalization requestEncoding="UTF-8" responseEncoding="UTF-8" /> を指定しています。 このように設定して、特に今のところ不具合があるわけではないのですが オラクルではUTF-16、ASP.NETではUTF-8となっていて 違うものを指定していても不具合等はないのでしょうか。 または、不具合がまだ見つかっていないだけでしょうか。 以上、ご教授をお願いします。

  • Fatal error: Call to undefined function mb_internal_encoding()

    CAPTCHAのサンプルプログラムを動かそうと思ったのですが Fatal error: Call to undefined function mb_internal_encoding() in ”プログラムのパス” のようなエラーがでて実行することができません。 そこで、このエラー文で検索したところphpの日本語利用の環境ができていないのでは? との回答を見つけたので、参考ページを見て設定を行ったのですが、いまだにエラーが出て実行することができません。 ちなみにこのようなmb_internal_encodingのサンプルを動かすと <?php /* 内部文字エンコーディングをUTF-8に設定 */ mb_internal_encoding("UTF-8"); /* カレントの内部文字エンコーディングを表示 */ echo mb_internal_encoding(); ?> Fatal error: Call to undefined function mb_internal_encoding() in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\mbtest.php on line 2 この様なエラーが出ます。 日本語利用の為の設定で参考にしたサイトは http://www.phpbook.jp/install/phpini/index3.html こちらです。 phpのバージョンは5.2.6でOSはXPSP2です

    • ベストアンサー
    • PHP
  • mb_convert_encoding() エラー

    http://www18.tok2.com/home/koumori27/xml/pxml/pxml2.htmlのxmlpaser_sample1.php3を自分のパソコンで試したら、Fatal error: Call to undefined function: mb_convert_encoding() in c:\php\xmlpaser_sample1.php on line 99と出ました。 http://www.php.net/manual/ja/ref.mbstring.php#ini.mbstring.languageに書いてある 例 1. php.ini 設定の例 mbstring.language = Japanese; mbstring.internal_encoding = UTF-8 ; mbstring.encoding_translation = On mbstring.http_input = auto ; mbstring.http_output = UTF-8 ; mbstring.detect_order = auto ; mbstring.substitute_character = none ; と http://oshiete1.goo.ne.jp/kotaeru.php3?q=293266 に書いてある方法を試しましたが Fatal error: Call to undefined function: mb_convert_encoding() in c:\php\xmlpaser_sample1.php on line 99 が直りません。 どうすれば直るのでしょうか?

    • ベストアンサー
    • PHP
  • htaccessの記述方法??

    携帯サイトでドコモ対応で <?xml version="1.0" encoding="shift_jis"?> をhtml内で記述しています。 しかし、htmlファイル内でphpを動作させたいのでhtaccessに AddType application/x-httpd-php .html を記述している為 Parse error: syntax error, unexpected T_STRING in ~~~~ エラーが出てしまいます。 ドコモ対応もしたいので<?xml version="1.0" encoding="shift_jis"?>は必須で htmlファイル内でphpを動作もさせたいです。 解決方法はございますでしょうか?

    • ベストアンサー
    • PHP

専門家に質問してみよう