Sakura: EUC-JPのファイルが文字化けする

Created on 30 Nov 2019  ·  11Comments  ·  Source: sakura-editor/sakura

問題内容

EUC-JPで保存されたファイルを開くと文字化けします。

再現手順

  1. EUC-JPで保存されたファイルを開きます。

再現頻度

100%

問題のカテゴリ

  • プログラムの動作上の問題

    • ローカルビルド版

環境情報

  • OS バージョン
    Windows 8.1 pro 64bit
  • サクラエディタバージョン
    サクラエディタ v2.4.0.2118 32bit dev
    (GitHash 951a0abdaee1a2b664f262cbd8bf4cb801375876)
    (GitURL https://github.com/sakura-editor/sakura.git)

特記事項
システムの表示言語=英語

なんかの改修で壊したか、元々英語環境下に対応していなかったのかは不明。
たぶん後者だと思うんですが、OS設定を日本語に戻すのが面倒で未確認。
「なんどもないぞ、ゴルァッ!」なレスが付いたらちょっと安心できる感じです。

🌏Internationalization 🇯🇵 🇺🇸 🇨🇳 🇹🇼 🐛bug🦋

Most helpful comment

なんかこれが原因っぽい気配・・・
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/mbcjistojms-mbcjistojms-l-mbcjmstojis-mbcjmstojis-l?view=vs-2019

https://github.com/sakura-editor/sakura/blob/e5172cb526f26ad18ec5754282886b6270459588/sakura_core/charset/CEuc.h#L79-L91

Return Value
On Japanese locale, these functions return a converted character or return 0 if no conversion is possible. On a non-Japanese locale, these functions return the character passed in.

超訳:日本語以外のロケールでは、入力された文字コードをそのまま返します。

で、引用したコードの82行目と83行目の間にテストコードを入れてみたんです。

    {
        ctemp = ::GetACP();
    }

戻り値=1252(=西ヨーロッパ言語のコードページ)

というわけで「化ける原因」はこれで確定っぽいです。
ただ、これが「化ける原因」だとすると Windows 10 で「化けない理由」が謎です。
システムの表示言語を英語にすると GetACP() の戻り値は 1252 になるはずなので。
「Windows 10 の表示言語が英語になってない」はないと思っています。
うちの Windows 10 もちゃんと EUC 表示できてるので、そこに疑いはないっす。

あらためてコード眺めて思ったんですが、
EUC-JP⇒Unicode変換の詳細が大変な感じになっていますね。

EUC-JP⇒JIS⇒SJIS⇒SJISのベンダー拡張文字を置き替える⇒Unicodeに変換。

EUC-JPにはWindowsのコードページが割り当てられています。
引用したコードにも記載されています が EUC-JP=51932 です。
Windowsのコードページが存在するということは「MultibyteToWideCharが使える」ということで、EUC-JP ⇒ Unicodeは一発変換できるってことです。一発変換できるのにあえてSJISを経由させているのが原因で文字化けするケースが発生した、と見ることもできるわけです。

知らなかったならともかく、EUC-JPにコードページが割り振られていることを知っていながらあえて EUC⇒JIS⇒SJIS⇒UNICODE としていた理由・・・Windows95対応以外に思いつきませんが、どこかで是正していきたい感じです。名目は「EUC-JPファイルの読込処理の高速化」とかで :smile:

All 11 comments

自分の環境(Windows 10 Pro Version 1903)だとシステムの表示言語を英語にしても文字化けしませんでした。試したファイルは README.md を EUC-JP で保存したものです。

もし差し支えなければ文字化けしたファイルを添付してください。こちらの環境で再現するか見てみます。

windows 8.1だと日本語に戻してもダメな感じでした。 何故だっ!

データは↓で、青空文庫で公開されている「吾輩は猫である」をEUC-JPで保存したものです。
wagahaiwa_nekodearu-euc.txt

vs Code でJapanese(EUC-JP)にすると表示できるので、データが壊れているわけでもなさそう。

Windowsの表示言語切り替えは、再起動一発で適用されないことがあるらしいです。

3回再起動して試しましたが、やはり Windows 8.1 だと日本語でも化けますね。

ステータスバーの文字コード表示は EUC なのでコード判定の問題じゃなさそうです。
あるしたら変換処理で、そこにはUnicode一本化対応による書きっぷりの変更が少し入ってます。

しかし、Windows 10 で問題なくて Windows 8.1 にだけ影響する変更って何だろう?

Windowsの表示言語切り替えは、再起動一発で適用されないことがあるらしいです。

それは初耳ですがもしそうなら不具合ですね。

3回再起動して試しましたが、やはり Windows 8.1 だと日本語でも化けますね。

ステータスバーの文字コード表示は EUC なのでコード判定の問題じゃなさそうです。
あるしたら変換処理で、そこにはUnicode一本化対応による書きっぷりの変更が少し入ってます。

しかし、Windows 10 で問題なくて Windows 8.1 にだけ影響する変更って何だろう?

こちらの環境ではやはり再現しないですね…。

image

ところで説明の環境情報に書かれている GitHash の 951a0abdaee1a2b664f262cbd8bf4cb801375876 なんですが、どうして 2019/08/12 辺りの古いものになってるんでしょうか?master ブランチの HEAD (現時点では e5172cb526f26ad18ec5754282886b6270459588) では確認されてますか?

Windowsの表示言語切り替えは、再起動一発で適用されないことがあるらしいです。

3回再起動して試しましたが、やはり Windows 8.1 だと日本語でも化けますね。

ステータスバーの文字コード表示は EUC なのでコード判定の問題じゃなさそうです。
あるしたら変換処理で、そこにはUnicode一本化対応による書きっぷりの変更が少し入ってます。

しかし、Windows 10 で問題なくて Windows 8.1 にだけ影響する変更って何だろう?

何でしょうね?思いつく手として、

  • コミットログを二分探索して switch してどこらへんのコミットで発生したかを切り分ける
  • システムの表示言語を日本語にする
  • Windows 10 に移行する
  • EUC-JP の存在を無いものと見做す認知バイアスをインストールする

Windowsの表示言語切り替えは、再起動一発で適用されないことがあるらしいです。

それは初耳ですがもしそうなら不具合ですね。

Windows 10 で発生しなくなってるとしたら、Microsoftの企業努力のたまものだと思います。Windows 7 で手軽に言語切替できるようになる前から海外版を使っていまして、Windows7のとき「再インストールしなくてよくなったんだ!」と感動した覚えがあります。7と8.1は一発で変わらないことがよくありましたが、OS再インストールよりは全然マシなので気にしていませんでした。

ところで説明の環境情報に書かれている GitHash の 951a0ab なんですが、どうして 2019/08/12 辺りの古いものになってるんでしょうか?master ブランチの HEAD (現時点では e5172cb) では確認されてますか?

バージョン古いのはたまたまです。
最新masterでも確認しましたが現象は同じです。
EUC文字化け

モバイル用に使っているWindows 10では起こらない現象なので、謎です。

コミットログを二分探索して switch してどこらへんのコミットで発生したかを切り分ける
システムの表示言語を日本語にする
Windows 10 に移行する
EUC-JP の存在を無いものと見做す認知バイアスをインストールする

ぼくが聞き手なら、「とっとと CEuc::CodeToUnicode にブレーク貼ってデバッグしろや」と言うか、「英語環境での利用は想定してないのであきらめてください」と言うか、「Windows 8.1のメインストリームサポートは終了しているのであきらめてください」と言うかですね。

なんかこれが原因っぽい気配・・・
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/mbcjistojms-mbcjistojms-l-mbcjmstojis-mbcjmstojis-l?view=vs-2019

https://github.com/sakura-editor/sakura/blob/e5172cb526f26ad18ec5754282886b6270459588/sakura_core/charset/CEuc.h#L79-L91

Return Value
On Japanese locale, these functions return a converted character or return 0 if no conversion is possible. On a non-Japanese locale, these functions return the character passed in.

超訳:日本語以外のロケールでは、入力された文字コードをそのまま返します。

で、引用したコードの82行目と83行目の間にテストコードを入れてみたんです。

    {
        ctemp = ::GetACP();
    }

戻り値=1252(=西ヨーロッパ言語のコードページ)

というわけで「化ける原因」はこれで確定っぽいです。
ただ、これが「化ける原因」だとすると Windows 10 で「化けない理由」が謎です。
システムの表示言語を英語にすると GetACP() の戻り値は 1252 になるはずなので。
「Windows 10 の表示言語が英語になってない」はないと思っています。
うちの Windows 10 もちゃんと EUC 表示できてるので、そこに疑いはないっす。

あらためてコード眺めて思ったんですが、
EUC-JP⇒Unicode変換の詳細が大変な感じになっていますね。

EUC-JP⇒JIS⇒SJIS⇒SJISのベンダー拡張文字を置き替える⇒Unicodeに変換。

EUC-JPにはWindowsのコードページが割り当てられています。
引用したコードにも記載されています が EUC-JP=51932 です。
Windowsのコードページが存在するということは「MultibyteToWideCharが使える」ということで、EUC-JP ⇒ Unicodeは一発変換できるってことです。一発変換できるのにあえてSJISを経由させているのが原因で文字化けするケースが発生した、と見ることもできるわけです。

知らなかったならともかく、EUC-JPにコードページが割り振られていることを知っていながらあえて EUC⇒JIS⇒SJIS⇒UNICODE としていた理由・・・Windows95対応以外に思いつきませんが、どこかで是正していきたい感じです。名目は「EUC-JPファイルの読込処理の高速化」とかで :smile:

追加報告

これの再現方法わかりました。
windows10 1903で再現するので、8.1の問題じゃないです。

再現手順

  1. powershell を 管理者モード で開く
  2. PS> Set-WinSystemLocale en-US する
  3. Windowsを再起動する
  4. サクラエディタで https://github.com/sakura-editor/sakura/issues/1103#issuecomment-560048969 のファイルを開く

※テスト後に Set-WinSystemLocale ja-JP するのを忘れると悲しい事故が起きます :sob:

分かったこと

  • EUCの文字化けは、おいらのPC(Windows8.1)の「おま環」ではない。
  • サクラエディタの国際化(L18N)には問題がある。(断定

    • 要するに、英語OS使ってる人は 文字コードEUCを使えない ってことだから。

自己レスですが。

EUC-JPにはWindowsのコードページが割り当てられています。
引用したコードにも記載されています が EUC-JP=51932 です。

Windowsのロケール実装におけるEUC-JPのコードページは20932だった気がします。

モチベーションが尽きたので閉じてしまいます。 #1394

Was this page helpful?
0 / 5 - 0 ratings