C言語関係掲示板

過去ログ

No.1269 SJISからJISに変換

[戻る] [ホームページ]
No.16776

SJISからJISに変換
投稿者---BOSS(2004/09/13 17:11:50)


はじめまして。SMTPクライアント側のプログラムを作成しています。S-JISコードの文字をメール送信するのにJISコードに変換する必要があります。
しかし、OSがWindowsCEなので、mbcjmstojis関数やSJIStoJIS関数がサポートされていません。
SJISからJISに変換自作関数をどなたか教えてください。
また、参考になるURLでもかまいません。
よろしくお願い致します。
理想は
void mychange( char * ,char *) ; //自作関数のプロトタイム

int main(){
char sjis[1024]="あいうえお";   //sjis格納領域
char jis[1024];           //jis変換後格納領域
maychange( jis , sjis) ;
}

以上みたいな感じで、mychange関数のソースのご教授です。





No.16777

Re:SJISからJISに変換
投稿者---nop(2004/09/13 17:46:31)


>はじめまして。SMTPクライアント側のプログラムを作成しています。S-JISコードの文字をメール送信するのにJISコードに変換する必要があります。
>しかし、OSがWindowsCEなので、mbcjmstojis関数やSJIStoJIS関数がサポートされていません。
>SJISからJISに変換自作関数をどなたか教えてください。

まず、JISコードと、
Shift-JISコードについて調べて下さい。
それらを調べれば変換出来るはずです。


No.16778

Re:SJISからJISに変換
投稿者---BOSS(2004/09/13 18:27:53)


>>はじめまして。SMTPクライアント側のプログラムを作成しています。S-JISコードの文字をメール送信するのにJISコードに変換する必要があります。
>>しかし、OSがWindowsCEなので、mbcjmstojis関数やSJIStoJIS関数がサポートされていません。
>>SJISからJISに変換自作関数をどなたか教えてください。
>
>まず、JISコードと、
>Shift-JISコードについて調べて下さい。
>それらを調べれば変換出来るはずです。

はい。わかりました。


No.16786

Re:SJISからJISに変換
投稿者---かずま(2004/09/14 03:18:37)


> SJISからJISに変換自作関数をどなたか教えてください。
片仮名をどうするのかを決めないといけませんね。
  (1) 8ビットのまま
  (2) SI/SO を使う
  (3) ESC 2/8 4/9 を使う

Shift-JIS で第1バイトが 0xf0 以降の 2バイト文字は対応する JIS がない
のでどうするか。

次のプログラムではどうなっているか分かりますか?

#define GET()       ((unsigned char)*s++)
#define PUT(c)      (*j++ = (c))
#define ISKANJI(c)  (((c) ^ 0x20) - 0xa1u < 60)
#define ISKANA(c)   ((c) - 0xa1u < 63)

enum { ESC = 0x1b, SO = 0x0e, SI = 0x0f };

void sjis2jis(char *j, const char *s)
{
    int c, d, t = 0;

    for (;;) {
        c = GET();
        if (ISKANJI(c)) {
            d = GET();
            if (d == 0) { c = 0; goto eos; }
            if (c >= 0xf0) c = 0x81, d = 0xac;
            if (t == 1) PUT(SI), t = 0;
            if (t == 0) PUT(ESC), PUT(0x24), PUT(0x42), t = 2;
            PUT(((c ^ 0xa0) << 1) - 0x21 + (d >= 0x9f));
            PUT(d - (d < 0x7f ? 0x1f : d < 0x9f ? 0x20 : 0x7e));
        }
        else if (ISKANA(c)) {
            if (t == 2) PUT(ESC), PUT(0x28), PUT(0x42), t = 0;
            if (t == 0) PUT(SO), t = 1;
            PUT(c & 0x7F);
        }
        else {
            if (c >= 0x80) c = '?';
        eos:
            if (t == 1) PUT(SI), t = 0;
            if (t == 2) PUT(ESC), PUT(0x28), PUT(0x42), t = 0;
            PUT(c);
            if (c == 0) break;
        }
    }
}



No.16788

Re:SJISからJISに変換
投稿者---BOSS(2004/09/14 14:20:29)


しかし、かずま様のソースコードを理解したかったのですが、未熟な為、わからない点が5点ありました。回答をいただけたら幸いです。

(1) 8ビットのまま
→段使用していない領域なので、エスケープシーケンスによる宣言は必要
 ないと理解してよいのですか?
(2) SI/SO を使う
→半角カタカナの対応と理解してよいのですか?
(3) ESC 2/8 4/9 を使う
→ESC 2/4 4/2でもよいのですか?

#define ISKANJI(c) (((c) ^ 0x20) - 0xa1u < 60)
#define ISKANA(c) ((c) - 0xa1u < 63)
→ご教授お願いします。







No.16790

Re:SJISからJISに変換
投稿者---YuO(2004/09/14 17:43:02)


>(1) 8ビットのまま
>→段使用していない領域なので、エスケープシーケンスによる宣言は必要
> ないと理解してよいのですか?

JISコードというのは,どのようなコードを想定しているのでしょうか。
そもそも,SMTPで使う以上8bitコードは使えないと思いますが……。
#ESMTPならいけるのだったかな……?


>(2) SI/SO を使う
>→半角カタカナの対応と理解してよいのですか?

SIはG1に指示されている文字集合をGLに指示するためのコードです。
#8単位系ではLS1と呼ぶ。

G1に何を想定するかはソフトウェアによるでしょうから,
これによってJIS X 0201の片仮名文字集合がG0に指示されると考えるのは早計です。


>(3) ESC 2/8 4/9 を使う
>→ESC 2/4 4/2でもよいのですか?

ESC 2/8 4/9はJIS X 0201の片仮名文字集合をG0に指示するためのエスケープシーケンス,
ESC 2/4 4/2はJIS X 0208-1983をG0に指示するためのエスケープシーケンスです。
当然代用はできません。