前提
Mac, Xcode環境において
C++を使っています。
あるプロトコルにおいて、流れてきているbyte列を扱いたいのですが、基礎的なことがわからず困っています。
xcodeのfile inspectorにはUTF-8が設定されています。
実現したいこと
端的にいうと、std::coutはどのような規則で値を出力しているのかが知りたいです。
unsigned charの型にある1byteの情報が入っています。
それが例えば10進数でいう152、(10011000)の値だとします。
これをstd::coutを使って出力します。
cpp
1unsigned char byte = 152; 2std::cout << "byte: " << byte << std::endl; 3 4std::bitset<8>byte_bit(byte); 5std::cout << "byte_bit : " << byte_bit << std::endl; 6
発生している問題
cpp
1byte : \230 2byte_bit : 10011000
と出力されます。
bit的には確かに152
に対応する10011000
なのであっているのですが、
なぜbyteそのままだと「\230」と出力されるのでしょう?
分かっていること
127
のASCIIが対応している値まではちゃんと出力されます。
126 : ~
127 : DEL(コンソール上は何も見えずに空白のように出力された)
ASCII一覧参考
128~255までは全ては試していませんが以下のようになっています。
10進数 : unsigned char bitset 24bit : coutしたとき
128 : 000000000000000010000000 : \200
129 : 000000000000000010000001 : \201
129 : 000000000000000010000010 : \202
140 : 000000000000000010001100 : \214
152 : 000000000000000010011000 : \230
おそらく、文字コードとかが関わってこの値が表示されているのですが、unicodeやUTF-8を調べてもこの128 ~ 255の値はがどう扱われるのかがよくわかりません。
どういう内部ではフローでこう出力されているのでしょうか?
参考URL
Unicode一覧表
UTF-8コード表
追記 + 疑問
2023/01/03/05:44
コメントをくださった方々、大変ありがとうございます。
hoshi-takanoriさん、ps_aux_grepさんのコメントより、
\230
はただ、8進数表記で出力されているだけという単純な話だったということがわかりました。
ただ、なぜ8進数で突然std::coutに出力されているのでしょうか?
ps_aux_grepさんより、Extended Ascii Codeを共有していただいたのですが
これの一覧では、152
はÿ
と表記されています。
これがstd::coutにて出力されていない理由は、utf-8にこの規格が内包されていないからという理解であっているのでしょうか?
私が調べた限り、utf-8は128~256
のような値は未定義?になっているからということでしょうか?
補足情報(FW/ツールのバージョンなど)
XCode 12.4
intel mac catalina 10.15.7
回答2件
あなたの回答
tips
プレビュー