91768


Qt5 と Visual C++ 2022
の環境では問題なくコンパイル/実行できているプロジェクトを、Qt6に移植しようとしていますが、日本語文字列でいくつかコンパイルエラーが出ます。

メッセージ等より、sjisでエンコードされているソースファイルをUTF-8だと思ってコンパイルしてソース中の日本語文字列でエラーを出しているようです。さらに調べるとコンパイルのコマンドラインに
`/utf-8` というオプションを勝手に追加してこのような動作になっているようです。ソースファイルをUTF-8で保存しなおすとエラーが出なくなります。

プロジェクトのプロパティーのC/C++->すべてのオプションやコマンドラインをチェックしたのですが、`/utf-8`
を指定している場所が分かりません。ただ、追加のオプションに `/source-charset:utf-8` とか指定すると、このオプションは
`/utf-8` と一緒に使えませんというエラーになるので、`/utf-8` がどこかで指定されているのは間違いないように思います。Qt VS
Toolsとかが悪さをしているのかなとも思ってます。

`/utf-8` をオプションから外し、sjisファイルをQt5の時のようにコンパイルできるようにするにはどうしたらよいでしょうか？

まっとうな手段はすべてのソースをUTF-8に変換するということとは思いますが、何せいっぱいあるもんでちょっと躊躇しています。よろしくお願いします。

* * *

コメントいただきましたので、実際のエラーメッセージ等を追記します。

1>C:\Users\foo\source\boo.cpp(1,1): warning C4828: オフセット 0xa57
から始まる、現在のソースの文字セット (コードページ 65001) では使用できない文字がファイルに含まれています。

が、sjisのファイルすべてで複数出ています。で、

1>C:\Users\foo\source\boo.cpp(81,15): error C2001: 定数が 2 行目に続いています。

で、コンパイルが止まります。以上のメッセージはQt5版の方では出ていません。また、boo.cppをUTF-8で保存し直すとboo.cppに関するエラーは消えます。

試しにプロジェクトのプロパティー->C/C++->コマンドラインで、追加のオプションに `/source-charset:utf-8` を指定すると

1>cl : コマンド ライン error D8016: コマンド ライン オプション '/utf-8' と '/source-charset:utf-8'
は同時に指定できません

と出てビルドが失敗します。ただ、同じところのすべてのオプションは、

/permissive- /MP /ifcOutput "x64\Debug" /GS /W1 /Zc:wchar_t /Zi /Gm- /Od
/Fd"x64\Debug\vc143.pdb" /Zc:inline /fp:precise /D "_WINDOWS" /D "UNICODE" /D
"_UNICODE" /D "WIN32" /D "_ENABLE_EXTENDED_ALIGNED_STORAGE" /D "WIN64" /D
"QT_OPENGLWIDGETS_LIB" /D "QT_WIDGETS_LIB" /D "QT_OPENGL_LIB" /D "QT_SVG_LIB"
/D "QT_GUI_LIB" /D "QT_NETWORK_LIB" /D "QT_CONCURRENT_LIB" /D "QT_CORE_LIB"
/errorReport:prompt /WX- /Zc:forScope /Gd /MDd /std:c++17 /FC /Fa"x64\Debug"
/EHsc /nologo /Fo"x64\Debug" /Fp"x64\Debug\boo.pch" /diagnostics:column

となっていて `/utf-8` は見当たりません。なお、`/I` オプションは上記では削除しました。`/D "UNICODE" /D "_UNICODE"`
に関しては、問題の起きてないQt5版でもついているので問題ないと思ってます。「親またはプロジェクトの規定値から継承」のチェックマークを外しても症状は変わりません。その他、必要な情報がありましあらコメントで教えていただけると幸いです。

* * *

追記 #1

問題なくコンパイルできているQt5版でコンパイルオプションに `/utf-8` を追加してみたら、Qt6版と同様なエラーが出ました。よって問題はQt6版で
`/utf-8`
のオプションが追加されているのが問題だと思います。所詮Qt5->Qt6といってもライブラリーを変えただけだし、私はオプションを変えていないのでちょっと信じられないです。ただ考えられるとしたらQt
VS Tools がQt6だと勝手に `/utf-8`
をオプションに追加しているのではないかと疑っています。VSですべてのオプションとか表示しても、それは私が指定したものだけを表示しているだけで、それにさらに付け加えられてるのではないかなと疑っているのですが、どうでしょうかね？

* * *

追記 #2

CL.command.1.tlogでコンパイルオプション部分を抜き書きしたものが以下です。  
`-utf-8` 以外にも追加されているものがあります。

/c /Zi /nologo /W1 /WX- /diagnostics:column /Od /D _WINDOWS /D UNICODE /D
_UNICODE /D WIN32 /D _ENABLE_EXTENDED_ALIGNED_STORAGE /D WIN64 /D
QT_OPENGLWIDGETS_LIB /D QT_WIDGETS_LIB /D QT_OPENGL_LIB /D QT_SVG_LIB /D
QT_GUI_LIB /D QT_NETWORK_LIB /D QT_CONCURRENT_LIB /D QT_CORE_LIB /Gm- /EHsc
/MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /std:c++17
/permissive- /Fo"X64\DEBUG\" /Fd"X64\DEBUG\VC143.PDB" /external:W1 /Gd /TP
/wd4267 /FC -Zc:rvalueCast -Zc:strictStrings -Zc:throwingNew -Zc:__cplusplus
-Zc:externConstexpr -utf-8


CC BY-SA 4.0
2022-10-22T09:35:48.197
91740
2023-07-14T10:08:24.297
2022-10-26T01:49:38.453
3060
54964
question
qt unicode visual-c++
Qt6とVisual C++ 2022でsjisファイルの扱いについての質問


Qt6.0で[`qt_allow_non_utf8_sources`](https://doc.qt.io/qt-6/qt-allow-non-
utf8-sources.html)というCMakeコマンドが導入されたようです。これの意味するところは、QtのソースコードのエンコーディングはUTF-8であるべきで、そうでない場合はこのコマンドで明示するようです。

ただし、これはCMakeを使用した場合であり、質問のQt VS
Toolsの場合ではどのように扱われているかはわかりませんでした。しかし質問の状況から察するに、Qt VS
ToolsにおいてもCMake側と同じようにソースコードはUTF-8であるとみなされ、コンパイルオプション `/utf-8`
がどこかで指定されているのかもしれません。

* * *

> 私が指定したものだけを表示しているだけで、それにさらに付け加えられてるのではないかなと疑っている

その可能性はありそうです。これに関しては、 [[オプション] ダイアログ ボックス: [プロジェクトおよびソリューション] >
[ビルド/実行]](https://learn.microsoft.com/ja-
jp/visualstudio/ide/reference/options-dialog-box-projects-and-solutions-build-
and-run?view=vs-2022) で **MSBuild プロジェクト ビルドの出力の詳細**
でログレベルを変更することができます。ログレベルを上げると、実際に起動したコマンドラインを確認することができますので、その中に `/utf-8`
など関係するオプションが指定されているか把握できます。

* * *

Qt Visual Studio Toolsの動作を確認しました。どこまで動作するかはわかりませんが、プロジェクトのプロパティに次の設定項目がありました。

  * Additional Options  
Additional compiler options required by Qt. These options will be passed to
the compiler, unless specifically excluded in the next field.

ここに`-utf-8`が指定されています。

  * Excluded Options  
Options to exclude from the above compiler options required by Qt. These
options will NOT be passed to the compiler. Prefix options with '/' or '-',
and separate them with spaces.

ここに `-utf-8` を指定すると打ち消してくれるようです。

[![画像の説明をここに入力](https://i.stack.imgur.com/SdnZo.png)](https://i.stack.imgur.com/SdnZo.png)

* * *

> 私の環境だとAdditional Optionsが空欄で何も表示されない

Qt Visual Studio Toolsは非常に特殊な動きをしていましたので、説明をしておきます。

  1. [次の内容で `x64\Debug\qmake\temp\qtvars.pro` を生成する](https://github.com/qt-labs/vstools/blob/v2.9.0/QtMSBuild/QtMsBuild/qt_vars.targets#L246-L294)
[code]     CONFIG += no_fixpath

    QT += core
    
[/code]

  2. [`qmake qtvars.pro`を実行し`x64\Debug\qmake\temp\qtvars_x64_Debug.props` を生成する](https://github.com/qt-labs/vstools/blob/v2.9.0/QtMSBuild/QtMsBuild/qt_vars.targets#L311-L324)  
この中に`Qt_CL_OPTIONS_`が次のように定義されている。

[code]    <Qt_CL_OPTIONS_>-Zc:rvalueCast -Zc:inline -Zc:strictStrings
-Zc:throwingNew -permissive- -Zc:__cplusplus -Zc:externConstexpr
-utf-8</Qt_CL_OPTIONS_>

    
[/code]

  3. この`Qt_CL_OPTIONS_`が巡り巡って[`Cl`タスクの`AdditionalOptions`](https://learn.microsoft.com/ja-jp/visualstudio/msbuild/cl-task?view=vs-2022)に設定される。

というわけで、Additional
Optionsに値が表示されていなかったのは、当該構成でまだqmakeを実行しておらず、どのようなフラグが指定されることになるのか判明していなかったからだと思います。


CC BY-SA 4.0
2022-10-23T14:01:56.460
91768
2022-10-26T13:11:10.443
2022-10-26T13:11:10.443
4236
4236
91740
answer


私の環境（VS2022 Qt6）では、プロジェクトのプロパティーのC/C++->コマンドラインの追加のオプションが

[code]

    -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -permissive- -Zc:__cplusplus -Zc:externConstexpr -utf-8 -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 
    
[/code]

このようになっていて、`-utf-8`と指定されています。  
これが無いということでしょうか。


CC BY-SA 4.0
2022-10-24T01:01:54.583
91778
2022-10-24T01:01:54.583
54970
91740
answer


Adding `-DCMAKE_CXX_FLAGS="/utf-8" -DCMAKE_C_FLAGS="/utf-8"` into CMake
command line.


CC BY-SA 4.0
2023-07-14T10:08:24.297
95616
2023-07-14T10:08:24.297
59113
91740
answer