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

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

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

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

Unicode

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

文字コード

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

Q&A

7回答

11282閲覧

文字コードを変換するプログラミング

susuj

総合スコア12

C

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

Unicode

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

文字コード

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

0グッド

3クリップ

投稿2019/05/08 07:31

編集2019/05/14 04:50

c言語超初心者です。
課題で文字コードを変換するプログラミングを書けと言われました。
UnicodeからSJISに変換したいのですが、どこから手をつけたらいいか全くわかりません。大まかな全体の流れとヒントがほしいです。

追記

与えられた変更式は以下の通りです

ぁ〜み(0x3041〜0x307F)の範囲では

1バイト =- 0xAE
2バイト =- 0xA2

至らないとこが多々あるにも関わらず丁寧に回答してくださりありがとうございます。

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

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

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

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

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

sage

2019/05/08 10:25

何か他に隠していることがありそうですね。 後出しジャンケンには参加したくないので、条件を全て上げてもらえませんか? その中にやり方も書いてある可能性が高いです。
susuj

2019/05/09 00:01

初めてなので色々不足があってすみません。変更式は2バイトまでしか与えられていないです。他に条件はないです。
sage

2019/05/10 01:26

与えられた変更式を質問に追記してください。 また、本当にUnicodeを1バイトずつ処理すると問題にあるのですか? Unicodeは1文字を2~3バイトで表現するので、処理が複雑になりそうな「1バイトずつ」との指示はでないと思いますが。
guest

回答7

0

担当講師にそのようにお願いしたほうが宜しいのではないでしょうか.

投稿2019/05/08 07:41

jimbe

総合スコア12632

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

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

susuj

2019/05/08 09:35

ごもっともなご意見ありがとうございます。
Zuishin

2019/05/09 00:27

もっともだと思うならそのようにしたらどうでしょう? 課題自体は全く難しいところなどありません。もしこのレベルの課題でどこから手を着けていいかわからないとするなら、それは人の話を聞いていないからです。 コンパイルの仕方がわからないのか、パスの通し方がわからないのか、それともキーボードの使い方がわからないのか知りませんが、何がわからないのかを質問者がわかってない以上、それはここで聞いても解決しません。先生に聞いてください。先生に聞きにくくても友達くらいいるでしょう。
guest

0

Unicode から Shift-JIS にするには、変換表(Unicode のコード +Uxxxx が Shift-JIS のコード ???? になる、という表)を用意することになるのですが……
Shift-JIS(JIS X 0213 附属書1 による指定・Shift_JIS-2004)では11391文字の定義がありますから、11391 × 2(UTF-16 の標準面で表現できるのでサロゲートの考慮は不要)で22KB以上の「表」を構築する必要があります。
※実際には変換が一意に定まる文字集合もあるので、表を作らねばならないのはそこまではありませんが

力業でも 22KB の表を作る、ってのは無理がありますねえ……
何か他に条件はないのでしょうか。

ちなみに単に「Unicode」とした場合、文字集合のことを指すので、文字符号化が何かによって処理が違ってきます。
※UTF-8、UTF-16、UTF-32 など
場合によっては入力がどれに当たるかを判別する必要があるのかも?

追記:Windows の中では Unicodeと書いた場合は UTF-16LE を指します(Windows のネイティブ文字サポート)。ややこしいことに。

投稿2019/05/08 07:54

編集2019/05/08 08:03
tacsheaven

総合スコア13703

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

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

susuj

2019/05/08 09:38

変換する範囲はひらがな、カタカナ、大小英数字です!変更式も与えられていて、1バイトずつ計算すると書かれています。文字符号化は提示されてないのでわからないです(´・ ・`)すいません。
episteme

2019/05/08 11:57

> 変更式も与えられていて 思いっきり後出しジャンケンやんか。勘弁してよー
tacsheaven

2019/05/09 00:10

そういうことはきちんと追記しましょう…… 変更式があったとしても、1バイトずつ処理しちゃまずいような……入力が UTF-8 を想定している、のかな。
pepperleaf

2019/05/14 12:43

2byteのテーブル作ると、約128Kbyteのテーブルになる。でも半部以上は、スカスカなので、まず、上位byteでテーブル作って、、とやったことがある。まあ、その時は、4byteコードまで対応でしたが。
guest

0

たぶん、こんな流れかと。

  1. 「文字コード」とは何かを理解する
  2. 「文字コードの変換」とは何かを理解する
  3. Unicodeのコードテーブルを入手する
  4. SJISのコードテーブルを入手する
  5. 与えられた範囲(大小英数字、ひらがな、カタカナ)のUnicodeでのコードを確認する
  6. 同じくSJISでのコードを確認する
  7. 与えられた変更式の意味を考える(なぜこれで変換できるのか)
  8. フローチャートを作成する

どこでつまずいていますか?

投稿2019/05/14 08:25

sage

総合スコア1216

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

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

stdio

2019/05/14 08:56

多分質問者さんはつまずいているのではなく、1番目から分かってないと予想できる。
sage

2019/05/14 09:05

その可能性が0ではないので、文字コードとはから始めました。
stdio

2019/05/14 09:11

そして、3に取り掛かろうとした時点で気が付く!! 圧倒的!!ただひたすら、面倒くさいと!!
susuj

2019/05/14 12:33

一応1〜6はなんとか理解出来ました。けど変更式が何故これで変換できるのか、はかれこれ2日くらい悩んでいます
sage

2019/05/14 13:20

Unicodeの「ぁ」(小さい「あ」)のコードを16進数で表示すると? SJISの「ぁ」(小さい「あ」)のコードを16進数で表示すると? Unicodeの「ぁ」の上位1バイトから0xAEを引くと(16進数2桁で)いくつ? Unicodeの「ぁ」の下位1バイトから0xA2を引くと(16進数2桁で)いくつ? これでSJISのコードになりませんか?
susuj

2019/05/15 23:59

ありがとうございます。 まずは1文字だけファイルから読み込んで表示させるのを書いてみましたが、毎回表示される文字が変わってしまいます。 #include "pch.h" #include <iostream> #include <stdio.h> void funk( int a[2] ){ int henkan[ 2 ]; //変換したものを格納 //2バイト文字の場合 if (a[0] != 0) { henkan[0] = (a[1] - 0xAE) & 0xff; //1byte henkan[1] = (a[2] - 0xA2) & 0xff; //2byte } return ; } int main() { int i, n; FILE *fp1; FILE *fp2;//ファイルポインタ char uni[2]; errno_t error; error = fopen_s(&fp1,"D:/uni.txt", "r"); //読み込みモードでファイルオープン if (error != 0) { printf("ファイルを開くことができませんでした。 \n"); } n = 0; //ファイルが終わりでない「かつ」配列を飛び出さないうちは読み込みを続ける while (!feof(fp1) && n < 2) { fscanf_s(fp1, "%c", &(uni[n]), sizeof(uni)); n++; funk(&n); } fclose(fp1); n = n - 1; //EOFの行を一つ減らす //ファイルに書き込み error = fopen_s(&fp2, "D:/sjis.txt", "wb"); //書き込みモードでファイルオープン if (error != 0) { printf("ファイルを開くことができませんでした。 \n"); } else { fwrite(&uni, sizeof(uni), 1, fp2); //uniで変換したものを書き込む fclose(fp2); } //読み取り error = fopen_s(&fp2, "D:/sjis.txt", "rb"); //読み取りモードでオープン if (error != 0) { printf("ファイルを開くことができませんでした。\n"); } else { fread(&uni, sizeof(uni), 1, fp2); //uniに読み取る printf("ファイルから読み取った文字は%cです。 \n", uni); fclose(fp2); } }
guest

0

UnicodeとSJISのひらがな、カタカナ、大小英数字のコードは調べられますよね。
あとは与えられた変更式と、後はこれまで勉強してきた方法でコード変換できます。

投稿2019/05/09 08:55

sage

総合スコア1216

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

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

0

C

1/* Windows 10, Visual C++ 2019 */ 2 3#include <locale.h> // setlocale 4#include <stdio.h> // puts 5#include <stdlib.h> // wcstombs 6 7int main() { 8 const wchar_t* unicode = L"こんにちは、世界"; 9 char shiftjis[256]; 10 setlocale(LC_CTYPE, "japanese"); 11 wcstombs(shiftjis, unicode, 256); 12 puts(shiftjis); 13 return 0; 14}

投稿2019/05/08 09:09

episteme

総合スコア16614

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

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

0

こちらでも参考にすればいいのでは?

投稿2019/05/08 07:45

stdio

総合スコア3307

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

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

0

iconvについて調べてみてはいかがでしょうか。

投稿2019/05/08 07:43

can110

総合スコア38262

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問