- 締切済み
コレって何が表示されたんですか?
int i; for(i=-128;i<=128;i++){ printf("%c",i); } char型は文字コードに従って表示されると聞いたので上記のようにプログラムを実行させてみたのですが、 結局これで表示された文字は何の文字なんでしょうか? Shift Jis?? 今書いているプログラムのテキストファイルの文字コード?? 結局文字コードの意味がよくわかりません; どなたか教えていただけませんでしょうか><
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- sakusaker7
- ベストアンサー率62% (800/1280)
#3です。 > %cを使うと1バイトになってしまうし・・ > 2バイト分のデータを1文字として表示するにはどうしたらいいのでしょうか。 単純に %c%c と並べて、1バイトずつ出力してやればよいです。 むかーしの PC98シリーズのDOSプロンプトでこれをやるとハングアップしたり しますが、もうそんな心配をしないでも良いでしょう。 > 感じをきちんと出そうとするなら二重ループの必要があるという事ですが、 > どうやればいいんでしょうか? 即興で組んでみました。文字が割り当てられていないところも出力してしまう 手抜きですが、まあ参考にはできるでしょう。 #include <stdio.h> int main() { int highbyte; for (highbyte=0x81; highbyte<=0xfc; highbyte++) { int lowbyte; if (highbyte == 0xa0) { highbyte = 0xdf; // 半角カナの最後 continue; } for (lowbyte=0x40; lowbyte<=0xfc; lowbyte++) { if (lowbyte == 0x7f) // DEL コードはスキップ continue; printf("%c%c", highbyte, lowbyte); } putchar('\n'); } return 0; } 注: インデントを崩さないため、全角空白を使っています。 コピペでそのままコンパイルはできないので置換してからどうぞ。
- sakusaker7
- ベストアンサー率62% (800/1280)
0x21~0x7E(33~126)の範囲に収まっていない部分は、ゴミです。 なぜなら、ShiftJISの全角文字2バイトでひとつの文字を構成するのに、 printfで出力しているのは %c なので1バイト分しかなく、ループの 次の回で出力されるものと組み合わされて便宜上漢字やカナ一文字として 表示されているように見えているだけです。 補足にある例では全角カナが貼り付けられていますが、0xA1~0xDFは ShiftJISでは半角カナが割り当てられているところなので、実際には 半角カナがでてはいませんか? 漢字(とカナや記号など)をきちんと出そうとするなら、上位バイト と下位バイトの二重ループにしてやる必要があります。
- galluda
- ベストアンサー率35% (440/1242)
がると申します。 んっと…まず「データ」と「文字コード」をきちんと切り離して把握してください。 質問者さんが書かれたプログラムは、厳密には「-128から127まで(範囲的には、いわゆる signed charの範囲…ですが、素直に0から255でやったほうが良いと思います)のデータの出力」になりまして、それ以上でもそれ以下でもありません。 で。 後は「**の文字コードで0-255のデータを見るとこう見える」という程度のものになります。 つまり「数値データを解釈する方向」ですね。 なので、上述のデータを「Shift_jisで見たら」とか「EUCで見たら」とか、色々な角度から見ることが可能になります。 文字コード周りは、大抵はコンソールの設定次第ですね。telnetだとターミナル設定になるかと思います。 ちなみに、0-127までは、欠けもありますが、大抵のPCではASCIIコードで指定されているものが表示されることが多いかと(コンソールにもよるんですがね)。 で、128以降ですが。 これを「Shift_jisとして」みようとすると、まっとうなものは出てこないかと思います。Shift_jisは、2バイト目が0x7f(十進数で127)以下なので。 これを「EUC_jp」として見た場合……チェックしてないのですが、もしかするとなにか文字が出るかもしれません。 っていうのも、EUCは1バイト目も2バイト目も(モノによっては3バイト目がありますが、その場合3バイト目も)0x80(128)以上という規約なので。 UTF-8は…すみません覚えてないです(苦笑 以上、何かの参考にでもなれば幸いです。
お礼
ありがとうございます。shift_jisとしてみたんですが、全角が出たりと、よくわからない出力になりました。 for(i=0;i<255;i++) で表示すると以下のような出力になりました。 windows XPのコマンドプロンプト stdio.NETからの出力です。 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ≠ヤ・(左)炎旧克署葬灯楓利劒屆撼泛。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゛゜珮粤蒟跚韜・・ⅰ韵鴦涇・ これってshift_jisの値なんですか? for(i=-128;i<128;i++) で出力しても同じような出力になります。 signed charの値に255を指定して出力させるとこれは何が出ているのでしょうか??
- php504
- ベストアンサー率42% (926/2160)
表示させているコンソール画面の文字コードでしょう WindowsのコマンドプロンプトならShift jis、Fedora CoreのデフォルトならUTF-8、Terminalソフトで文字コードを変換していたらその文字コードで表示されると思われます。 ただ-128から-1を順番に表示してもあまり意味がないと思いますが。
お礼
説明不足でごめんなさい。 ShiftJisなんでしょうか。 上に新たに浮上した疑問を書いておりますのでよろしくおねがいします><
お礼
ありがとうございます。 あ、あれは半角カタカナですが自動的に全角になっているようです。 投稿時のサイトの仕様ですかね。 感じをきちんと出そうとするなら二重ループの必要があるという事ですが、 どうやればいいんでしょうか? %sを使うと文字列になってしまうし %cを使うと1バイトになってしまうし・・ 2バイト分のデータを1文字として表示するにはどうしたらいいのでしょうか。