MENU

【C++】coutでちゃんと日本語出力できた

こんにちは、ごまあぶらです。

日本語出力できた!これは記事にするしかない!…と思ってたんですが、うまく状況の再現ができなかったので、覚えてる範囲でやったことを書いておきます。

目次

やったことたち

なんか使用する文字コードを合わせないと文字化けするとか聞いたので、それを何とかするためにいろいろやりました。

その1:コード書いてるファイルをUTF-8で保存

これでたぶんUTF-8で保存できたんじゃないでしょうか?これやっても全然効果ありませんでしたけどね。

その2:保存される形式をUTF-8に固定

多分これは効果あります。上のやつではなんかうまく保存できていないかもしれないので、そもそもUTF-8で保存するようにすればいいんじゃね?理論です。

これをしてからまた保存をすると、しっかりUTF-8で保存されると思います。

プロジェクトをまた作り直してやってみたんですが、日本語を入れても特に文字化けせずに出力できちゃいました。なんだこれ。1日くらいを返してほしいです。

その3:コマンドラインに/UTF-8を追加

これたぶん必要です。これなくしたら文字化けし始めました。

これ小文字じゃないとだめでした。

その4:これコードに追加

これは出力形式とコンソールをUTF-8にするやつです。

もしかしたらこれはちゃんとやっとかないといけないかもしれないですね。

これはちゃんとコピーできてないかもしれないので、よくわからんかったらググってください。

#include <windows.h>

SetConsoleOutputCP(CP_UTF8);
SetConsoleCP(CP_UTF8);

あともうちょっとやってたことあったんですが、これ以外はもっと意味なさそうなのでもう書かないです。

まとめ

2と3と4をやっとけば割と何とかなると思います。多分。

AIが作ったチェックできるコードを一応貼っておきます。

#include <windows.h>
#include <iostream>
#include <string>
#include <iomanip>

int main()
{
    SetConsoleOutputCP(CP_UTF8);
    SetConsoleCP(CP_UTF8);

    // 現在のWindowsコンソールのコードページを取得
    UINT inputCP = GetConsoleCP();
    UINT outputCP = GetConsoleOutputCP();

    std::cout << "=== Console Code Page ===" << std::endl;
    std::cout << "Input  CP : " << inputCP << std::endl;
    std::cout << "Output CP : " << outputCP << std::endl;

    // 調査したい日本語
    const char* text = "こんにちは";

    std::cout << "\n=== String Bytes ===" << std::endl;

    // 文字列を1バイトずつ16進数で表示
    for (const unsigned char* p =
        reinterpret_cast<const unsigned char*>(text);
        *p != '\0';
        ++p)
    {
        std::cout << std::hex
            << std::setw(2)
            << std::setfill('0')
            << static_cast<int>(*p)
            << ' ';
    }

    std::cout << std::dec << std::endl;

    std::cout << "\n=== String ===" << std::endl;
    std::cout << text << std::endl;
    return 0;
}

これで出力されるのがちゃんと日本語だったらOKで、文字化けしてたらAIに出力されたものをコピペして何がいけないのか教えてもらいましょう。

コメント

コメントする


目次