Nagarei / DxLibEx

DXライブラリC++化プロジェクト
Boost Software License 1.0
31 stars 3 forks source link

文字コードを統一 #8

Closed yumetodo closed 9 years ago

yumetodo commented 9 years ago

現状UTF-8 BOM付きとShift-JISが入り混じっているが、Shift-JISだと開けないエディタやコンパイルできないコンパイラもあるので、UTF-8 BOM付きに統一する

というのを提案します。

Nagarei commented 9 years ago

確かにShift_JISだとgccとかで文字化けした記憶がありますね...。 ただ、DxLib本家の方でそれをやったとき管理人様が苦労されていた記憶があります。 単純にファイルの保存形式を変えるだけではだめかもしれませんね...。 まあ早めに動くに越したことはないので後でテストしてみます。文字列リテラルがなければとりあえずは大丈夫なはず。

yumetodo commented 9 years ago

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

Nagarei commented 9 years ago

うーん。DxLibの中では文字コード直書きという芸当をやっていますが...。

はっていただいたURLの上の方にはUTF-8 BOM付きではclangでコンパイルできないと書いてあるような気がしますが、今のclangなら大丈夫なのでしょうか? 僕のclangがなぜかそもそも動かないので確認できていないです。

yumetodo commented 9 years ago

僕の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付属のもので、デフォルト設定です

Compile Options

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

file:Shift-jis, output:std::cout

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に失敗

file:UTF-8 with BOM, output:std::cout

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に失敗

yumetodo commented 9 years ago

というか今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 形式で保存してください。

あややや・・・・。

Nagarei commented 9 years ago

今確認したらBOMなしのUTF-8になってますね。 BOMありにしたら出なくなりました。

yumetodo commented 9 years ago

clang使う人はiconvに通してから使う方向で