EUC-JPで保存されたファイルを開くと文字化けします。
100%
特記事項
システムの表示言語=英語
なんかの改修で壊したか、元々英語環境下に対応していなかったのかは不明。
たぶん後者だと思うんですが、OS設定を日本語に戻すのが面倒で未確認。
「なんどもないぞ、ゴルァッ!」なレスが付いたらちょっと安心できる感じです。
自分の環境(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 にだけ影響する変更って何だろう?
こちらの環境ではやはり再現しないですね…。

ところで説明の環境情報に書かれている GitHash の 951a0abdaee1a2b664f262cbd8bf4cb801375876 なんですが、どうして 2019/08/12 辺りの古いものになってるんでしょうか?master ブランチの HEAD (現時点では e5172cb526f26ad18ec5754282886b6270459588) では確認されてますか?
Windowsの表示言語切り替えは、再起動一発で適用されないことがあるらしいです。
3回再起動して試しましたが、やはり Windows 8.1 だと日本語でも化けますね。
ステータスバーの文字コード表示は
EUCなのでコード判定の問題じゃなさそうです。
あるしたら変換処理で、そこにはUnicode一本化対応による書きっぷりの変更が少し入ってます。しかし、Windows 10 で問題なくて Windows 8.1 にだけ影響する変更って何だろう?
何でしょうね?思いつく手として、
Windowsの表示言語切り替えは、再起動一発で適用されないことがあるらしいです。
それは初耳ですがもしそうなら不具合ですね。
Windows 10 で発生しなくなってるとしたら、Microsoftの企業努力のたまものだと思います。Windows 7 で手軽に言語切替できるようになる前から海外版を使っていまして、Windows7のとき「再インストールしなくてよくなったんだ!」と感動した覚えがあります。7と8.1は一発で変わらないことがよくありましたが、OS再インストールよりは全然マシなので気にしていませんでした。
ところで説明の環境情報に書かれている GitHash の 951a0ab なんですが、どうして 2019/08/12 辺りの古いものになってるんでしょうか?master ブランチの HEAD (現時点では e5172cb) では確認されてますか?
バージョン古いのはたまたまです。
最新masterでも確認しましたが現象は同じです。

モバイル用に使っている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
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の問題じゃないです。
PS> Set-WinSystemLocale en-US する※テスト後に Set-WinSystemLocale ja-JP するのを忘れると悲しい事故が起きます :sob:
自己レスですが。
EUC-JPにはWindowsのコードページが割り当てられています。
引用したコードにも記載されています が EUC-JP=51932 です。
Windowsのロケール実装におけるEUC-JPのコードページは20932だった気がします。
モチベーションが尽きたので閉じてしまいます。 #1394
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
超訳:日本語以外のロケールでは、入力された文字コードをそのまま返します。
で、引用したコードの82行目と83行目の間にテストコードを入れてみたんです。
戻り値=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: