🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

5832閲覧

MultiByteToWideChar();関数の使い方がわからない。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/01/19 12:58

編集2021/01/19 14:15

提示コードですがどうすれば文字をwchar_t型に入れて日本語文字を表示出来るのでしょうか?提示サイト通り引数を指定しましたが画面表示されません、何を間違えているのでしょうか?MUltiByteToWideChar();関数部です。またGetLastError()関数は0でした。

イメージ説明
http://www.t-net.ne.jp/~cyfis/win_api/sdk/MultiByteToWideChar.html#cchWideChar

cpp

1 2 char str4[100] = { '\0' }; 3 convStr(list, str4, strlen(str4), 12, (t2 + 12)); 4 5 wchar_t w[200] = { '\0' }; 6 MultiByteToWideChar(CP_UTF8, NULL,str4,100,w,200);/////// 7 8 printf("%d", GetLastError()); 9 printf("%ls\n", w); 10 //printf("%s\n", str4); 11

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SHOMI

2021/01/19 13:43

convStr()とは何者ですか? >提示コードですがどうすれば文字コードをutf-8に変更出来るのでしょうか? MultiByteToWideChar(CP_UTF8,~)はUTF8文字列をワイド文字列に変換するのであって、UTF8文字列への変換ではありませんよ。
退会済みユーザー

退会済みユーザー

2021/01/19 13:44

convStr()関数はバイナリを文字にする変換する関数です。
SHOMI

2021/01/19 13:50

https://teratail.com/questions/316774 この質問の続きですか? 聞きたいことは >どうすれば文字コードをutf-8に変更出来るのでしょうか? ではなく、UTF8文字列をワイド文字列に変換する方法ですか?
退会済みユーザー

退会済みユーザー

2021/01/19 13:51

はいそうなのですが。関数の使い方がわからない場合は質問が別なのかなと思ったので分けました。
episteme

2021/01/19 14:08

質問が間違っているなら訂正してください。 ひょっとして UTF-8 をワイド文字列だと思ってんじゃないよね?
退会済みユーザー

退会済みユーザー

2021/01/19 14:10 編集

いえ、それはわかります。utf-8文字をwchar_t型に入れて%lsで表示させるためにまずwchar_t型に入れたいのですがそれがこの関数で上手く出来ないので質問しました。
episteme

2021/01/19 14:12 編集

だったら質問が「どうすれば文字コードをutf-8に変更出来るのでしょうか?」なのはナゼ?
guest

回答1

0

ベストアンサー

この質問の続きなら、以前の質問と同様にsetlocale()を呼んでいないためにワイド文字列の日本語が表示されていないだけでは?

投稿2021/01/19 13:56

編集2021/01/19 14:05
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/01/19 14:06

文字化けしている文字を日本語に表示させるためwchar型に変換して表示させるという回答を得たのですがどうすればいいのでしょうか? setlocale(LC_ALL, NULL);としましたが依然として文字化けしています。
退会済みユーザー

退会済みユーザー

2021/01/19 14:22 編集

setlocale(LC_ALL, ".utf-8")とすることで治りました。
episteme

2021/01/19 14:34

コード変換によって UTF-8 ではなくなったのに、なぜ ".utf-8" なんですか?
yumetodo

2021/01/19 14:41

これ多分MultiByteToWideCharによってUTF-16になったあと、Cランタイムの内部でUTF-8に変換されて(setlocale(LC_ALL, ".utf-8"))、さらにコンソール側でUTF-16に変換してShift-JISに変換という作業が挟まっている気がする・・・。 最適解はchcp 65001相当のことをしてUTF-8のまま標準出力から出すことだったのではという思いが・・・。
退会済みユーザー

退会済みユーザー

2021/01/20 01:41

utf-8では正常に出力されないため.utf-8を使いましたあら治りました。
dodox86

2021/01/20 01:49

> utf-8を使いましたあら治りました。 「治った」とは、元は正しく動いていたものを何かしたせいで壊れ、処置をしたことで正しいかたちに戻ることを言います。最初から要望通りに動いていないので、治ったわけではありません。更に言えば、「直った」です。
退会済みユーザー

退会済みユーザー

2021/01/20 01:56

では質問ですがどうすればいいんでしょうか?
SHOMI

2021/01/21 13:03 編集

>setlocale(LC_ALL, ".utf-8") それをしてしまうと、ワイド文字列ではない printf("あいう\n"); 等が表示されなくなりますよ。 yumetodoさんと私の貼ったリンク先は読みましたか? setlocale(LC_ALL, "");//OSのユーザーロケールが日本語になっている場合は""を指定してもよい setlocale(LC_ALL, "JPN"); setlocale(LC_ALL, "Japanese");
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問