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に指示するためのエスケープシーケンスです。 当然代用はできません。 |