- ベストアンサー
コード変換について
このようなS-JISからEUCにコードを変換する関数のサンプルで見つけたのですが。これを実装するにはどうすればいいのかわかりません。 unsigned int sjis2euc(unsigned int sjis) { unsigned int hib, lob; hib = (sjis >> 8) & 0xff; lob = sjis & 0xff; hib -= (hib <= 0x9f) ? 0x71 : 0xb1; hib = (hib << 1) + 1; if (lob >= 0x9e) { lob -= 0x7e; hib++; } else if (lob > 0x7f) lob -= 0x20; else lob -= 0x1f; hib |= 0x80; lob |= 0x80; return (hib << 8) | lob; } たとえば char *str[] = "あいうえお" などとなっているにはどうやってこの関数を活用すればいいのでしょうか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>char *str[] = "あいうえお" というのが、なんかよくわからないんですけど( * か [] のどちらかが不要ですよね?)、 char *pSrc = "あいうえお"; char buffer[100]; // とりあえず、サイズは適当 while( *pSrc ) { if( Shift-JIS コードかどうかの判定 ) { *((int *)pDst) = sjis2euc( *pSrc ); pSrc += 2; pDst += 2; } else { *pDst = *pSrc; pSrc++; pDst++; } } こんな感じでできると思います。 元の Shift-JIS コードが消えちゃってもいいのなら、たぶん while( *pSrc ) { if( Shift-JIS コードかどうかの判定 ) { *((int *)pSrc) = sjis2euc( *pSrc ); pSrc += 2; } else { pSrc++; } } こんな感じ。
その他の回答 (2)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
str の内容がすべてSJISとわかっていて、 バイトオーダーがビックエンディアンの場合、 unsigned int ret; char buf[11]; for(i = 0; str[i]; i += 2) { ret = sjis2euc((unsigned int)( str[i] | (str[i+1] << 8 ) )); buf[i] = (char)ret; buf[i+1] = (char)(ret >> 8); } buf[10] = '\0'; こんな感じかな? #未テストです
SJISだと分かっているコード(文章中の漢字コード)の、char 型2文字のコードを合成して unsigned int 型1文字のコードを作り、sjis2euc に渡します。 すると、その漢字コードのEUCが返ってきます。 このとき、半角1バイト文字はこの関数には使用できませんので、半角か全角かを区別するロジックは自分で組む必要があります。