-
Notifications
You must be signed in to change notification settings - Fork 165
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
デフォルトの文字コードが反映されない。SJISに設定してもUTF-8で読み込まれる。 #1418
Comments
本文に記載すると長くなりそうなので、コメントに分けました patchunicode#1050を確認するにあたって、XMLの仕様を見てみました。
UTF-8/UTF-16のほかに、IANAが定義するものと"x-"接頭辞から始まるもので上記のフォーマットを満たしたものが使えるようです。 IANAの定義とpatchunicode#1050の変更を突き合せたところ、「MS_Kanji」と"cs"で始まるもの以外は含まれていませんでした。 |
困ったこと問題が 2つ 書いてあるように見えます。 問題1
原因: 普通に考えて、対策3の一択ですよね 😄 問題2
原因: エンコーディング名を認識できないときにエンコーディングを判定するロジックが誤っている?
修正対象はこの関数なんですけど、全体的にリファクタリングしたほうが良さそうな雰囲気です。 sakura/sakura_core/charset/CESI.cpp Lines 879 to 884 in 8f58ec8
修正するのは簡単だけど、レビューするのがしんどそう・・・ |
ん?ちょっと読み違っているかも。
要するに、問題2であげたエンコーディングの判定表が正しくないですね 😭
現状、タイプ別設定はファイルの拡張子で行っていますが、XML文書内容に基づくエンコーディング判定の処理のコンテキストには解析中データのタイプ別設定を参照できません。 なのでまぁ、ファイルの拡張子に基づいてタイプ別設定のデフォルトエンコーディングを適用するのは、設計的に不可能です。 |
お疲れ様です。
自分はsf.netのページをそう解釈しました。 「SJISを設定しても」のくだりはタイプ別設定の画面の話だと思います。 問題①については、追加対応で良いと思います。 |
あ、持ってました。 sakura/sakura_core/charset/CESI.h Lines 216 to 217 in 8f58ec8
|
問題②について(コメントを分けました)ですが、試したところUTF-16でencoding指定無しのパターンでは、懸念していた問題は発生しませんでした。自分の杞憂に終わったようです。 CESI::DetectUnicodeBomがCESI::AutoDetectByXMLよりも先に呼ばれており、BOMがある場合はこの段階でUnicodeであると決まってしまうので正しく処理されます。 ちなみに、当時の担当者であるMocaさんの対処方法をパッチから読み取ると、次のようになっていました。
コードからだと、CODE_NONEのまま文字コード判定処理が終わってしまった場合は、デフォルト設定の文字コードが使われるように見えます。そうであればタイプ別設定の文字コードが反映されそうです。 |
この内容で問題なさそうに思います。 |
追加する別名ですが、
とりあえずこの2点を満たすものを抽出してみました。それでも39個あります。
|
39個くらいならそのまま入れてもいいんじゃないかと思います。
問題はサクラエディタが サクラエディタには、CPチェックボックスにより Windowsのコードページリスト に含まれるすべてのコードページに対応することができます。なので、エンコーディング名を Windowsのコードページ に変換することができれば、かなりたくさんのエンコーディングに対応することができるはずです。 |
パッチを読み返したらshift_jisは重複していませんでした。すみませんでした。 CPの機能を知らなかったので、いろいろと試してみました。
実際にwindows-1252という宣言に遭遇した場合、CODE_LATIN1と判定されるようです。 |
Windows-1252(=ISO-8859-15、ISO-8859-1の改訂版)です。 sakura/sakura_core/charset/CLatin1.cpp Lines 80 to 81 in 8f58ec8
この記述の意味は、わずかに異なります。
両者の違いは、独自にカスタムした変換を使うかどうかで、実際どっちが速いのか?はぼくも知らないっす。 |
Windows-1252 は ISO-8859-15 とは異なります。 |
https://ja.wikipedia.org/wiki/Windows-1252 符号位置が異なるのでベツモノらしいです。 |
#1422 を提出しました。 |
タイプ別設定にある文字コード設定が反映されるようにする変更を、#1428で提出しました。 |
ご対応ありがとうございました。 |
問題内容
BugReport/195
再現方法
この時、文字コードとしてSJISを使うように指定しておきます。
この手順において、当該ファイルはUTF-8で読み込まれます。
これを正しい文字コードで開き直した後は、履歴に残っている限り問題は発生しません。
なお、初回起動の状態でもUTF-8で読み込まれました。
再現頻度
SJISを使うように設定したXMLのタイプ別設定がある状態で、一度も開いたことのないXML文書を扱うときは必ず遭遇することになると思います。
問題の原因
XML宣言から文字コードを判別する処理に問題があると思われます。
当該ファイルを開く際の文字コード判別処理ではCESI::AutoDetectByXMLが実行されていました。
この中で読み取った文字列を文字コードの定義(encodingNameToCode)と比較する処理において、どの定義とも一致しなかった場合はループが終了してしまいます。
このループの後に実行されるコードは「encoding指定無しでxml宣言が終了した」と判断して呼び出し元にUTF-8である旨を返答しており、これによって誤った文字コードでファイルを開いていました。
また、「encoding指定が無い」XML文書はUTF-8またはUTF-16のどちらかとして取り扱うことがXMLの仕様書で規定されていますが、このコードはUTF-16である可能性を考慮していませんので、もしUTF-16で作成されながらencoding指定を省略していた場合(仕様上は可能です)、同様の問題が発生します。
環境情報
手元では現時点で最新のmasterでも再現できました。
このバグに対するパッチについて
sf.netには、本件に対するパッチとしてpatchunicode#1050がすでに提案されていますが、UTF-16でエンコーディング宣言を省略したパターンに対する考慮がありません。
また、文字コード名の別名を追加する変更も行われていますが、追加される別名はXMLの仕様的に正しくないようです。
なお余談になりますが、encodingNameToCodeには重複が1件(windows-1252)あります。patchunicode#1050ではさらに1件(shift_jis)増えています。
以上、BugReport/195及びpatchunicode#1050からの転記と、自分なりの調査の報告をさせていただきます。
The text was updated successfully, but these errors were encountered: