読者です 読者をやめる 読者になる 読者になる

IronPythonのスクリプトのエンコーディング判定がおかしい件

IronPythonSilverlight開発をはじめたときから、どうもスクリプトのエンコード指定(# -*- coding: utf-8 -*- とか)のあたりがおかしいと思ってたけど、良さげな情報をみつけた。

IronPython2.0B5 の Src/IronPython/Runtime/PythonContext.cs をデバッグしてみて分かったことですけど、スクリプトにエンコーディングを指定した場合のPythonContext.GetSourceReaderの動作が原因で、以下の問題が生じます。

  1. BOMが付いたUTF-8のスクリプトの場合、Tokenizer.TryGetEncodingの返すエンコーディングが独自の StringOps.EncodingWrapperになってしまい、sr.CurrentEncodingのUTF8Encodingと一致しなくなって"file has both Unicode marker and PEP-263 file encoding"エラーになる
  2. BOMが付いたUTF-16のスクリプトの場合、stream.Seek(bytesRead, SeekOrigin.Begin)のbytesReadの値が実はchar単位の数値になっているため、シークする位置が正しくない (PythonContext.ReadOneLineでsr.Readの戻り値をbytesRead変数に入れていることがおかしい)
  3. BOMのないUTF-16スクリプトはsr.CurrentEncodingがPythonAsciiEncodingなので coding: を判別できない
  4. 上記以外の場合、coding: 行をstream.Seek(bytesRead, SeekOrigin.Begin)でスキップしてしまうため、スクリプトのParserは1行目または2行目を知らないでスクリプトを読み込んでしまい、PythonスクリプトをVisual Studioのデバッガでデバッグすると実際の停止位置と異なる行がハイライト表示になる(黄色く染まる)
http://homepage3.nifty.com/yamakox/Scrabbles/index.html

このページ、リンク構造があんまりよくないな…。上の引用元のURLはそのうち以下のURLに移動されそう。
http://homepage3.nifty.com/yamakox/Scrabbles/200809.html

リンク構造はともかくとして、今後の事を考えた上で現状妥当そうな方法は以下になるか…。

  • スクリプトは UTF-8N 固定
  • スクリプトの先頭に # -*- coding: utf-8 -*-
  • エラー時に1行ずれて通知されるのはエンジンが修正されるまで諦める