Closed yumetodo closed 9 years ago
確かにShift_JISだとgccとかで文字化けした記憶がありますね...。 ただ、DxLib本家の方でそれをやったとき管理人様が苦労されていた記憶があります。 単純にファイルの保存形式を変えるだけではだめかもしれませんね...。 まあ早めに動くに越したことはないので後でテストしてみます。文字列リテラルがなければとりあえずは大丈夫なはず。
VSは#pragmaで指定しないかぎり内部でShift-JISに変換したように思います。 gccはコンパイルオプションで設定できたはず clangが問題で、内部で文字コード変換をしなかった気がするのでchar型単位の文字列は多分(以下略)になったと思います。WindowsではShift-JISを想定していますからね。
http://d.hatena.ne.jp/osyo-manga/20110406/1302100815 http://srz-zumix.blogspot.jp/2014_01_01_archive.html
うーん。DxLibの中では文字コード直書きという芸当をやっていますが...。
はっていただいたURLの上の方にはUTF-8 BOM付きではclangでコンパイルできないと書いてあるような気がしますが、今のclangなら大丈夫なのでしょうか? 僕のclangがなぜかそもそも動かないので確認できていないです。
僕のclangがなぜかそもそも動かないので確認できていないです。
msys2 mingwのclangを使うのがいいと思います
はっていただいたURLの上の方にはUTF-8 BOM付きではclangでコンパイルできないと書いてあるような気がしますが、今のclangなら大丈夫なのでしょうか?
検証しました。
コンパイル可能かを○△×で判定(Sucsess, warning, errorに対応) 正常に表示可能かを○×で判定
なおstd::wcout
への出力は、mingwがサポートしていないため検証していません(してから気がついた)
#include <iostream>
int main(){
std::cout << "arikitari_na_world!" << std::endl
<< "ありきたりな世界" << std::endl;
return 0;
}
mintty.exeはmsys2付属のもので、設定でUTF-8にしています cmd.exeはWindows7付属のもので、デフォルト設定です
gcc u8->u8 | g++ -std=c++11 -static test.cpp -o test_sjsj.exe |
gcc u8->sj | g++ -std=c++11 -fexec-charset=cp932 -static test.cpp -o test_nosj.exe |
gcc sj->sj | g++ -std=c++11 -finput-charset=cp932 -fexec-charset=cp932 -static test.cpp -o test_sjsj.exe |
gcc sj->u8 | g++ -std=c++11 -finput-charset=cp932 -static test.cpp -o test_sjno.exe |
clang | clang++ -std=c++11 test.cpp -o test_clang.exe |
compile | cmd.exe(cp932) | mintty.exe(utf-8) | ||
---|---|---|---|---|
gcc u8->u8 | ○ | ○ | × | |
gcc u8->sj | × | - | - | converting to,execution character set: Illegal byte sequence |
gcc sj->sj | ○ | ○ | × | |
gcc sj->u8 | ○ | × | ○ | |
clang | △ | ○ | × | illegal character |
*clangはstatic buildに失敗
compile | cmd.exe(cp932) | mintty.exe(utf-8) | ||
---|---|---|---|---|
gcc u8->u8 | ○ | × | ○ | |
gcc u8->sj | ○ | ○ | × | |
gcc sj->sj | × | - | - | cc1plus.exe: error:,failure to convert cp932 to UTF-8 |
gcc sj->u8 | × | - | - | cc1plus.exe: error:,failure to convert cp932 to UTF-8 |
clang | ○ | × | ○ |
*clangはstatic buildに失敗
というか今sampleをビルドしてたら
1>C:\Users\yumetodo\Documents\git\DxLibEx\dxlibex/DxLibEx.h : warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
1>C:\Users\yumetodo\Documents\git\DxLibEx\dxlibex/basic_types.hpp : warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
1>c:\users\yumetodo\documents\git\dxlibex\dxlibex\Defines.h : warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
1>C:\Users\yumetodo\Documents\git\DxLibEx\dxlibex/Helper.h : warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
1>C:\Users\yumetodo\Documents\git\DxLibEx\dxlibex/DxLibEx.h(583): warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
1>C:\Users\yumetodo\Documents\git\DxLibEx\dxlibex/DxLibEx.h(1000): warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
1>C:\Users\yumetodo\Documents\git\DxLibEx\dxlibex/DxLibEx.h(1251): warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
1>C:\Users\yumetodo\Documents\git\DxLibEx\dxlibex/Graph2D.h : warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
1>C:\Users\yumetodo\Documents\git\DxLibEx\dxlibex/Graph2D.h(334): warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
1>c:\users\yumetodo\documents\git\dxlibex\dxlibex\DxLibEx.h : warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
1>c:\users\yumetodo\documents\git\dxlibex\dxlibex\DxLibEx.h(583): warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
1>c:\users\yumetodo\documents\git\dxlibex\dxlibex\DxLibEx.h(1000): warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
1>c:\users\yumetodo\documents\git\dxlibex\dxlibex\DxLibEx.h(1251): warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
あややや・・・・。
今確認したらBOMなしのUTF-8になってますね。 BOMありにしたら出なくなりました。
clang使う人はiconvに通してから使う方向で
現状UTF-8 BOM付きとShift-JISが入り混じっているが、Shift-JISだと開けないエディタやコンパイルできないコンパイラもあるので、UTF-8 BOM付きに統一する
というのを提案します。