86397


[以前解決とした質問](https://ja.stackoverflow.com/a/86384/9873)の一部なのですが、海外の方が作ったツールを日本語のWindowsで動かすと、次のようにエラーメッセージの文字がすべてクエスチョンマークに化けてしまい、いったい何のエラーなのかわからないことがよくあります。

[code]

    PS C:\tmp> .\stracent.exe .\hello.exe
    
    System Call Tracer for Windows XP - Windows 10. (Version: 0.9.3.0)
    Copyright (c): Pankaj Garg <pankaj@intellectualheaven.com>.       
    All rights reserved.
    
    Tracing command: [".\hello.exe"]
    
    Error: ?????????????????
    
[/code]

この `?????????????????` は実際にはWindows
OSに含まれる標準のエラーメッセージの日本語で、`この要求はサポートされていません。`のようです。どちらも文字数が17で長さが一致しています。

Windowsにおいて、このような文字化けはなぜ発生するのでしょうか。

また、このような文字化けを起こすプログラムの実行ファイルのみがあって再コンパイルなどは不可能な場合に、人間が理解できるエラーメッセージ(英語でも日本語でもよい)を得る一般的な方法はありますでしょうか。

かつて試した別のコンソールアプリでは `chcp 437` や `chcp 65001`
などでコードページを変更することで英語のエラーメッセージにすることができた場合がありましたが、この `stracent.exe` にそれは効きませんでした。


CC BY-SA 4.0
2022-02-16T11:33:03.473
86393
2022-02-16T23:26:33.870
2022-02-16T22:03:37.383
4236
9873
question
windows 文字化け
日本語Windowsの文字化けの原因と回避方法


「文字化け」はある特定の一つの要因で発生するものではありません。文字化けを引き起こす原因は複数あり、それぞれの事象を個別に調査し、原因を特定する必要があります。  
ですので、このスレッドでは一般論ではなく `stracent.exe` に限定した話題と考えてください。

原因の切り分けとしては

  * PowerShellではなくコマンドプロンプトで実行した場合はどうか？
  * コマンドプロンプトで更に出力結果をファイルにリダイレクトした場合はどうか？  
（PowerShellのリダイレクトはこれはこれでまた特殊な挙動をし文字化けの一因足ります）

辺りは試してほしいです。

* * *

StraceNTのソースコードを追いかけたところ、未初期化の状態で[`vwprintf`が使われて](https://github.com/ipankajg/stracent/blob/v0.9.3/src/app/cli/stcliview.cpp#L71)おり、どうにも日本語が表示できないことが判明しました。[Windowsのwprintf関数はUnicodeを出力できない？](https://blogs.osdn.jp/2020/04/24/wprintf.html)などが参考になりますが、`setlocale`を実行する必要があります。  
メッセージを作成している部分も[`LANG_NEUTRAL`が指定されて](https://github.com/ipankajg/stracent/blob/v0.9.3/src/app/strace.cpp#L236-L243)おり、日本語Windowsである限り日本語メッセージが取得されてしまいます。


CC BY-SA 4.0
2022-02-16T11:55:22.913
86397
2022-02-16T23:26:33.870
2022-02-16T23:26:33.870
4236
4236
86393
answer