- ベストアンサー
文字コードによる表記
非常に初心者的な質問なんですが、 文字コードのS-JISで「、」を表記する場合、 「0x8140」と表記するのが正しいのでしょうか? xの部分は区数を入れるのか、そもそも0xの部分は必要なのか 調べてもよくわかりませんでした。 どうかお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
文字コードには様々な種類があって、その一つがShiftJISです。ShiftJISでは、半角文字=1Byte、全角文字=2Byteで表します。 C言語で16進数を表すにはプレフィックスに"0x"を付けます。 int a = 10; // aには、数値の10が入ります int b = 0x10; // bには16進数の10(つまり16)が入ります。 char型には1Byteのデータを格納することができます。下は、半角文字の'A'をchar型に格納しています。'A'の文字コードは0x41ですので両方とも同じ意味になります。 char x = 'A'; char x = 0x41; 次に、全角文字を格納する場合、2バイトの領域が必要になります。この領域に「、」を入れようとした場合、次のようになります。 char multi[2]; multi[0] = 0x81; multi[1] = 0x40; 話が長くなりましたが、 (1) "0x"は16進数を表すために必要。 (2) 表記は0x8140でも問題なし。 ただし、実際には0x81、0x40のように分割して格納が必要。 と言うことになります。
その他の回答 (3)
- rinkun
- ベストアンサー率44% (706/1571)
文脈に因りますね。 もともとC言語のchar型は基本的に8ビットでS-JISの文字コードを保管するには足りません。 使っている処理系(コンパイラやライブラリなど)でshort型などでS-JISの1文字を表現するような処理になっているところなら0x8140のような表記でも良いでしょうが、char配列で扱うなら{0x81, 0x40}や"\x81\x40"のように1バイトずつ区切って扱わなければいけないでしょう。
お礼
前半>確か、S-jisは2バイト(全角?)だからですよね。 回答ありがとうございました!
- anmochi
- ベストアンサー率65% (1332/2045)
C言語のソース中の話だよね? C言語では「0x」は、これに続く数値が16進数である事を表している。これは言語仕様というものだ。例えば ・「5555」は五千五百五十五 (十進数) ・「05555」は二千九百二十五 (八進数) ・「0x5555」は二万一千八百四十五 (十六進数) という風にソースプログラム中に書かれている「数文字」をコンパイラにどう解釈してもらいたいかを指定するために0や0xをつける。 さて次に、様々なコンピュータシステムで文字を表示するための「文字コードとフォント」という2つの概念を理解する必要がある。 文字コード、正確には文字エンコーディングというものは、コンピュータ上で、ある文字をある数値に割り振ろうというもので、日本語ではJIS、区点、Shift JIS、EUC-JPなどがある。 君が言うShift JISでは、十六進数で言う8141という数値に「、」が割り振られているようだ。 これを画面上に出すのがフォントで、例えば8141は確かに「、」だが、フォントのこの番号に「○」なんていう「絵」を入れても良いわけだ。コンピュータが認識するのは数値やけど、画面に表示されて人間が認識するのは絵やからね。 つまり、「SJISで「、」を表記する」というのは、目的によって変わる。画面上に出したいのか、ネットワークに流したいのか、ファイルに保存したいのか、文字列中の区切りとして認識したいのか。 何をしたいのか、もう少し詳しく教えてもらえるかな?
お礼
詳しい解説痛み入ります。 これは、格文字コードで名前などを表記するのにどう文字コードを使うといいか、 と思いこの質問にいたりました。 「、」は例えの話で聞かせていただきました。 それと、 > これを画面上に出すのがフォントで、例えば8141は確かに「、」だが、フォントのこの番号に「○」なんていう「絵」を入れても良いわけだ。コンピュータが認識するのは数値やけど、画面に表示されて人間が認識するのは絵やからね。 の項目で思ったんですが、これは8141に○をつけても結果的に表示されるものは変わりないということでしょうか? もう1つ、 > つまり、「SJISで「、」を表記する」というのは、目的によって変わる。画面上に出したいのか、ネットワークに流したいのか、ファイルに保存したいのか、文字列中の区切りとして認識したいのか。 の >ネットワークに流したいのか、ファイルに保存したいのか の部分がどうも把握できません。 そもそもの文字コード使いどころがわかってないのだと思います。 プログラムで printf(”%c”,a); こういう時に使われるくらいしか思い出ません。 重要な点があるというのなら、 教えてくださると本当に助かります。 どうかよろしくお願いします。
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
まず、正しくは、0x8141 のようです。 この標記自体は間違いではないでしょう。 0x は、シフトJISとは直接関係なく、16進標記を表すものです。これがないと、八千百四十一と区別がつかないので、明確に区別がつくとき以外はつけておいた方が良いでしょう。 C/C++ のソースであれば、これがないと、全く違った数値になります。
お礼
なるほどー!なるほどー! 回答ありがとうございました。
お礼
>ShiftJISでは、半角文字=1Byte、全角文字=2Byteで表します。 その項目すら知りませんでした・・・。 自分の勉強方法を考え直します。 詳しい説明ありがとうございました!