両方が同じエンコーディング(UTF-8)でソースコードに入力され、ロケールが適切に設定されているこのようなステートメントでは、それらの間に実際的な違いはありますか?
printf("ο Δικαιοπολις εν αγρω εστιν\n");
printf("%ls", L"ο Δικαιοπολις εν αγρω εστιν\n");
その結果、出力を行うときに一方を他方よりも優先する理由はありますか?2番目のパフォーマンスはかなり悪いと思いますが、マルチバイトリテラルよりも利点(または欠点)はありますか?
編集:これらの文字列の印刷に問題はありません。でも、ワイドストリング関数も使いたいので使っていませんprintf
。したがって、問題は、これらの印刷方法が異なるかどうかです(上記の状況を前提としています)。もしそうなら、2番目の方法には利点がありますか?
EDIT2:以下のコメントに続いて、私はこのプログラムが機能することを知っています-それは不可能だと思いました:
int main()
{
setlocale(LC_ALL, "");
wprintf(L"ο Δικαιοπολις εν αγρω εστιν\n"); // wide output
freopen(NULL, "w", stdout); // lets me switch
printf("ο Δικαιοπολις εν αγρω εστιν\n"); // byte output
}
EDIT3:私は2つのタイプで何が起こっているかを見ることによっていくつかのさらなる研究をしました。より単純な文字列を取ります:
wchar_t *wides = L"£100 π";
char *mbs = "£100 π";
コンパイラは異なるコードを生成しています。幅の広い文字列は次のとおりです。
.string "\243"
.string ""
.string ""
.string "1"
.string ""
.string ""
.string "0"
.string ""
.string ""
.string "0"
.string ""
.string ""
.string " "
.string ""
.string ""
.string "\300\003"
.string ""
.string ""
.string ""
.string ""
.string ""
2番目は:
.string "\302\243100 \317\200"
そして、Unicodeエンコーディングを見ると、2番目はプレーンなUTF-8です。ワイド文字表現はUTF-32です。これは実装に依存することになると思います。
では、おそらくリテラルのワイド文字表現はより移植性が高いのでしょうか?私のシステムはUTF-16/UTF-32エンコーディングを直接印刷しないため、出力用にUTF-8に自動的に変換されます。