ルギア君の戯言

雑多な記事。

文字化け解消法 How to

リンク元などから。

gcjが文字化けする? (java)

そんなアホなw


少なくとも

import java.lang.String;
import java.lang.System;

public class DecimalSeparator {
    public static void main(String[] A00) {
        System.out.printf("日本でやっほー%n");
    }
}

では化けんぞw

[lugia@lugia-castle ~]$ gcj DecimalSeparator.java -o DecimalSeparator --main=DecimalSeparator
[lugia@lugia-castle ~]$ ./DecimalSeparator
日本でやっほー
[lugia@lugia-castle ~]$ 

cout で出力した後 wcout で出力すると文字化けする (C++)

そんなバカなと思ったけどたしかにしますねw

#include <iostream>
#include <locale>

using namespace std;

int main() {
    setlocale(LC_CTYPE, "");
    cout.imbue(locale(""));
    wcout.imbue(locale(""));
    
    cout << "cout : 日本語でやっほー" << endl;
    wcout << L"wcout: 日本語でやっほー" << endl;
    cout << "cout : 日本語で再びやっほー" << endl;
    return 0;
}
[lugia@lugia-castle ~]$ g++ -o a a.cpp
[lugia@lugia-castle ~]$ ./a
cout : 日本語でやっほー
wcout: ?,?g?;c{?;
cout : 日本語で再びやっほー
[lugia@lugia-castle ~]$

一方、

#include <iostream>
#include <locale>

using namespace std;

int main() {
    setlocale(LC_CTYPE, "");
    cout.imbue(locale(""));
    wcout.imbue(locale(""));
    
    wcout << L"wcout : 日本語でやっほー" << endl;
    cout << "cout: 日本語でやっほー" << endl;
    wcout << L"wcout : 日本語で再びやっほー" << endl;
    return 0;
}

の場合、

[lugia@lugia-castle ~]$ ./a
wcout : 日本語でやっほー
wcout : 日本語で再びやっほー
[lugia@lugia-castle ~]$

文字化けは直りますが、cout の出力がごっそり消えていますねw


とりあえず僕は wcout に統一して出力しています(ぁ
ライブラリコールとかあるのでパフォーマンス的には結構無駄な気もしますが、多分、1000回呼んで影響が出始めるところだと思うので、気にしませんw


ちなみに最初のプログラムを strace してみると、

write(1, "cout : \346\227\245\346\234\254\350\252\236\343\201\247\343\202\204\343\201\243\343\201\273\343\203\274\n"..., 32) = 32                                                                          
write(1, "wcout: \345,\236g\204c{\374\n"..., 16) = 16                                                                          
write(1, "cout : \346\227\245\346\234\254\350\252\236\343\201\247\345\206\215\343\201\263\343\202\204\343\201\243\343\201"..., 38) = 38 

EUCに変換してる?


glibc のバグ?


それとも C++ としては正常な仕様なのだろうか?