重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

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

A 回答 (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++;
  }
}
こんな感じ。
    • good
    • 0

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';

こんな感じかな?
#未テストです
    • good
    • 0

 SJISだと分かっているコード(文章中の漢字コード)の、char 型2文字のコードを合成して unsigned int 型1文字のコードを作り、sjis2euc に渡します。


 すると、その漢字コードのEUCが返ってきます。

 このとき、半角1バイト文字はこの関数には使用できませんので、半角か全角かを区別するロジックは自分で組む必要があります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!