• ベストアンサー

コード変換について

このような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[] = "あいうえお" などとなっているにはどうやってこの関数を活用すればいいのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

>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)
回答No.3

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'; こんな感じかな? #未テストです

noname#25358
noname#25358
回答No.1

 SJISだと分かっているコード(文章中の漢字コード)の、char 型2文字のコードを合成して unsigned int 型1文字のコードを作り、sjis2euc に渡します。  すると、その漢字コードのEUCが返ってきます。  このとき、半角1バイト文字はこの関数には使用できませんので、半角か全角かを区別するロジックは自分で組む必要があります。

関連するQ&A