質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Unicode

Unicodeはエンコーディングの標準規格です。1つの文字コード体系で多国語の表現を可能にすることを目指して作られています。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

C++

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

Q&A

解決済

4回答

1311閲覧

unicode マルチバイトについて

apa

総合スコア68

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Unicode

Unicodeはエンコーディングの標準規格です。1つの文字コード体系で多国語の表現を可能にすることを目指して作られています。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

C++

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

0グッド

1クリップ

投稿2020/07/26 06:23

文字列についてどうしてもわからないことがあります
visualstadioでは unicode マルチバイト文字を切り替えられる仕組みがあり
printf("%c", 81); //81は文字コード(JIS1バイトの) 
上記を実行したときunicode マルチバイト両方ともJISコードの結果が出てしまします
マルチバイトはJISコードが適用されるみたいですが、
unicodeがなぜJISコードをt読み取っているのかがわかりかねています。

また日本語を表示しようとしたとき2バイトで表現すると思いますが、
2つの16進数をprintfで表現しようとする場合どうやるのかもおしえていただきたいです!
printf(%c, 0x15????) ← おそらくこんな感じかと思いますが????部分がわからないです。

正直文字列を入れるだけなら const char* や string で十分ですが、
文字の勉強もかねて 文字コードで文字を出したいと思い質問いたしました。
よろしくお願いいたします!

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

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

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

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

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

guest

回答4

0

unicodeがなぜJISコードをt読み取っているのかがわかりかねています。

シフトJISでもUTF-8でも、最初128バイトはASCII領域なので、文字としては共通です。

投稿2020/07/26 06:41

maisumakun

総合スコア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
pepperleaf

総合スコア6385

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

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

apa

2020/07/27 02:43

返信ありがとうございます つまり数値での日本語出力は厳しいということでしょうか?
episteme

2020/07/27 02:53

#include <stdio.h> #include <locale.h> int main() { setlocale(LC_ALL, "japanese"); wprintf(L"[%c]\n", 12354); // [あ] return 0; }
guest

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
episteme

総合スコア16612

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

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

apa

2020/07/27 11:38

ありがとうございました! setlocaleでいろいろ国の言語を選択できるみたいですね 勉強になります
guest

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
kazuma-s

総合スコア8224

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

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

apa

2020/07/27 02:48

返信ありがとうございます  このプログラムって 3042が「あ」の文字コードですよね? できればこの文字コードをprintfなどに代入して「あ」と出力したいとおもっておりまして 逆はできないのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問