文字列についてどうしてもわからないことがあります
visualstadioでは unicode マルチバイト文字を切り替えられる仕組みがあり
printf("%c", 81); //81は文字コード(JIS1バイトの)
上記を実行したときunicode マルチバイト両方ともJISコードの結果が出てしまします
マルチバイトはJISコードが適用されるみたいですが、
unicodeがなぜJISコードをt読み取っているのかがわかりかねています。
また日本語を表示しようとしたとき2バイトで表現すると思いますが、
2つの16進数をprintfで表現しようとする場合どうやるのかもおしえていただきたいです!
printf(%c, 0x15????) ← おそらくこんな感じかと思いますが????部分がわからないです。
正直文字列を入れるだけなら const char* や string で十分ですが、
文字の勉強もかねて 文字コードで文字を出したいと思い質問いたしました。
よろしくお願いいたします!
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
unicodeがなぜJISコードをt読み取っているのかがわかりかねています。
シフトJISでもUTF-8でも、最初128バイトはASCII領域なので、文字としては共通です。
投稿2020/07/26 06:41
総合スコア146018
0
既に出ている回答で良いかと思いますが、、、
また日本語を表示しようとしたとき2バイトで表現すると思いますが、
2つの16進数をprintfで表現しようとする場合どうやるのかもおしえていただきたいです!
printf(%c, 0x15????) ← おそらくこんな感じかと思いますが????部分がわからないです。
日本語を扱う場合の文字コードですが、幾つかあります。
- Shift-JIS コード
これは、1byte と2byteの混在で、1byteで、半角文字(英数字、半角カナ等)と2byteで、漢字かなを表します。 (コードが重複しないように割り当て)
- UTF-8 (Unicode)
これは、複数byteでの表現となり、1byte(0-128)の範囲は、maisymakunさんの指摘通り。日本語などを扱う場合は、2byte以上必要となります。(例えば、'あ' : 0xE38182)
- UTF-16 (Unicode)
こちらも複数byteでの表現ですが、基本は、2byte固定。('あ' : 0x3042)
他にもいくつかあります。
で、実際にどうするかは、epistemeさんの回答になるのでは、と思います。
また、実際の内部コードで扱うのは、ちょっと大変。
(古い)Cでの出力について、
-
Shift-JIS
printf("%c%c\n", 0x82, 0xA0);
-
UTF-8
printf("%c%c%c\n", 0xE3, 0x81, 0x82);
コマンドプロンプトでは、chcp 65001
で確認
- UTF-16
printf("%c%c\n", 0x42, 0x30);
コマンドプロンプトでは、chcp 1200
と思ったのですが、ダメみたいです。
参考までに。
投稿2020/07/26 10:05
編集2020/07/26 11:01総合スコア6385
0
ベストアンサー
ワイド文字をプリントするなら wprinf じゃないかしら
C
1#include <stdio.h> 2#include <locale.h> 3 4int main() { 5 setlocale(LC_ALL, "japanese"); 6 wprintf(L"[%c]\n", L'あ'); 7 return 0; 8}
C++
1#include <iostream> 2#include <locale> 3 4int main() { 5 std::wcout.imbue(std::locale("japanese")); 6 std::wcout << L'[' << L'あ' << L"]\n"; 7}
投稿2020/07/26 06:33
編集2020/07/26 06:37総合スコア16612
0
次のコードは参考になりますか?
C
1#include <stdio.h> 2#include <locale.h> 3 4int main(void) 5{ 6 setlocale(LC_CTYPE, ""); 7 char mbs[] = "abcあいう"; // multibyte string 8 wchar_t wcs[] = L"abcあいう"; // wide character string 9 10 printf("mbs ="); 11 for (int i = 0; ; i++) { 12 printf(" %02x", mbs[i] & 0xff); 13 if (mbs[i] == 0) break; 14 } 15 printf("\nwcs ="); 16 for (int i = 0; ; i++) { 17 printf(" %04x", wcs[i] & 0xffff); 18 if (wcs[i] == 0) break; 19 } 20 printf("\nmbs = [%s]\n", mbs); 21 printf("wcs = [%ls]\n", wcs); 22 printf("mbs[0] = %c, mbs[3] mbs[4] = %c%c\n", mbs[0], mbs[3], mbs[4]); 23 printf("wcs[0] = %lc, wcs[3] = %lc\n", mbs[0], wcs[3]); 24}
実行結果
Plain
1mbs = 61 62 63 82 a0 82 a2 82 a4 00 2wcs = 0061 0062 0063 3042 3044 3046 0000 3mbs = [abcあいう] 4wcs = [abcあいう] 5mbs[0] = a, mbs[3] mbs[4] = あ 6wcs[0] = a, wcs[3] = あ
追記
このプログラムって 3042が「あ」の文字コードですよね?
できればこの文字コードをprintfなどに代入して「あ」と出力したいとおもっておりまして
逆はできないのでしょうか?
逆の意味がよく分かりませんが、
上のプログラムで、wcs[3] のコード 3042 を %lc で「あ」と出力しています。
次のコードは理解できますか?
C
1#include <stdio.h> 2#include <locale.h> 3 4int main(void) 5{ 6 setlocale(LC_CTYPE, ""); 7 printf("0x3042 = %lc\n", 0x3042); 8 printf("L'あ' = %#x\n", L'あ'); 9}
実行結果
Plain
10x3042 = あ 2L'あ' = 0x3042
理解できてもできなくても返事をお待ちしております。
投稿2020/07/26 09:52
編集2020/07/27 03:27総合スコア8224
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。