JISの文字コードで格納されたデータをQtで表示できるように文字コードの変換を試しているのですが、上手くいきません。
試したコードは以下の通りです。
wchar_t JIS_DATA[100];
上記の領域にJISコードの2バイト文字列(ABCDEFGH)が格納されています。
wchar_t *pData = &JIS_DATA[0];
QTextCodec *pCodec = QTextCodec::codecForName("ISO-2022-JP");
QByteArray aJisStr = QByteArray((const char *)pData);
QString strWork = pCodec->toUnicode(aJisStr);
strWorkの内容は「A#B#C#D#E#F#G#H#」となってしまいます。
strWorkに「ABCDEFGH」と変換したいですが...
御教授の程、宜しくお願い致します。
Qtは知らないんですけど、
wchar_t *pData = &JIS_DATA[0]; // ABCDEFGH
って、ISO-2022-JPでエンコードされたバイトコード?をwchar_t*で指しているのが不自然に思うのですが、そのへんどうなんでしょう?
ご質問ありがとうございます。
JIS_DATA[]はwchar_t型の配列で別途定義しているという前提です。
質問内容を補いました。
気がかりなのは、toUnicode()がQByteArrayのデータを扱うため、wchar_tをQByteArrayに変換しているのですが、QByteArrayは「const char *」でなければならず、wchar_tを(const char *)でキャストしています。
ISO-2022-JPはバイト列なので、それをどうしてwchar_tで扱っているのかがそもそも不思議なんですけど、ISO-2022-JPの各バイトに1バイトの0を足して2バイトにして表現しているのだとしたら、それはISO-2022-JPではないので、ISO-2022-JPからの変換器として作成されたpCodecが正しく動作しないのは当たり前のような気がするのですが…。
ISO-2022-JPで全角「A」は、文字コードで表現すると「0x2341」のように、2バイトになると解釈しているのですが、認識が誤っているのでしょうか?
文字セットと文字エンコードがごっちゃになっているのかなと思います。
こちらが参考になるかなと思います。
http://www3.nit.ac.jp/~tamura/multimedia/japanese.html
ISO-2022-JPは行頭では必ずASCIIが用いられるので、0x23 0x41 ... というバイト列が来たら、ASCII で '#' 'A' ということになるでしょうね。
御指摘いただきありがとうございます。
1バイトとして扱われてしまいそうだという点は理解できました。
どう改善すればよいかが判っていません。
回答3件
あなたの回答
tips
プレビュー