プロが教えるわが家の防犯対策術!

半角カナ文字と「丸で囲まれた1」や「はしご高」等の特殊文字を
SJISからJISへ、JISからSJISへ変換する方法を調べています。
半角カナはJISにないという記述も見たのですが、
サクラエディタで双方へ変換できるのと、
Outlookへ半角カナで送信したところ文字化けせず(全角になっていましたが)
受信できたこと、「はしご高」は受送信で文字変換されているようなので、
何か方法があるのではないかと調べています。

方法や参考資料を教えていただければと思います。
よろしくお願いいたします。

A 回答 (6件)

昼休みにsakuraエディタのソース見てみました♪



JISで検索すると
CEditView.h:757:void Command_CODECNV_SJIS2JIS( void );/* SJIS→JISコード変換 */
とか
CEditView.cpp:5619:case F_CODECNV_SJIS2JIS:pCMemory->SJIStoJIS();break;/* SJIS→JISコード変換 */
いうのがすぐ見つかるじゃないですか。

> 思うソースがみつかりませんでした^^;
> ヘルプファイルのようなものはみつかったのですが・・・

もうちょっとソースの読み方を身に付けたほうが良いかも。

んで、
void CMemory::SJIStoJIS( void )
{
/* SJIS→JIS */
StrSJIStoJIS( &cMem, (unsigned char *)m_pData, m_nDataLen );



int CMemory::StrSJIStoJIS( CMemory* pcmemDes, unsigned char* pszSrc, int nSrcLen )
{
// SJIS→JIS変換
nWorkLen = MemSJIStoJIS( pszWork, nWorkLen );



/* SJIS→JIS変換 */
long CMemory::MemSJIStoJIS( unsigned char* pszSrc, long nSrcLen )
{

//Oct. 3, 2002 genta IBM拡張文字対応
sCode = _mbcjmstojis_ex( pszSrc + i );


で、

/*!
@brief 拡張版 SJIS→JIS変換

SJISコードをJISに変換する.その際,JISに対応領域のないIBM拡張文字を
NEC選定IBM拡張文字に変換する.

Shift_JIS fa40~fc4b の範囲の文字は 8754~879a または ed40~eefc に
散在する文字に変換された後に,JISに変換されます.

@param pszSrc [in] 変換する文字列へのポインタ (Shift JIS)

@author すい
@date 2002.10.03 1文字のみ扱い,変換まで行うように変更 genta
*/
unsigned short CMemory::_mbcjmstojis_ex( unsigned char* pszSrc )
{

が実体ですね。

if(
( *pszSrc == 0x0fa ) ||
( *pszSrc == 0x0fb ) ||
( ( *pszSrc == 0x0fc ) && ( *(pszSrc+1) <= 0x04b ) )
) {/* fa40~fc4b の文字である。 */
/* 文字コード変換処理 */

これで切り分けて、ライブラリ関数の_mbcjmstojis で
変換できる部分はそれに任せて
そうでない文字は細かくチェックして
変換しているみたいですね。

んじゃあ頑張って読み取ってください♪
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
わざわざ探していただきましてありがとうございました。
おかげさまで、何とか実装できそうです。
ありがとうございました。

お礼日時:2007/10/28 22:50

>作者さんのHPでソースを探してみてダウンロードしてみたのですが、


>思うソースがみつかりませんでした^^;
>ヘルプファイルのようなものはみつかったのですが・・・

ここで、

ssrc_2007-07-08.tar.bz2

を持って行って、7zipで2回解凍すれば

参考URL:http://sourceforge.net/project/showfiles.php?gro …

この回答への補足

お礼が遅くなってすみませんでした。
おかげさまで何とか実装できそうです。

補足日時:2007/10/28 22:41
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
そこにあったのですね。別の部分をダウンロードしていました。
情報ありがとうございました。

お礼日時:2007/10/28 22:41

> 半角かなのJISへの変換はできるようになりましたが、SJISへ戻すのがなぜかできません^^;


>半角カナをSJIS→JISはできて、
「はしご高」のJIS→SJISはなんとなくできるようになりましたが、
どちらともなぜか逆ができずにいます^^;

とりあえず半角カナだけ言うと、
SO/SIを使って表すやりかたなら、SOが出ているかどうかを
覚えておかないといけません。
覚えていたら、8bit目を立てるだけだからそう難しくはないのでは?

はしご高は、コードの値が大きいので
ふつうに計算式にかけるとオーバーフローが
発生したように記憶しています。
それを調整するか、あるいはコードの変換を
テーブルをひく形でやってしまえばいいと思います。

最近作られているコード変換ユーティリティは
こっちのテーブルをひく形式の方が主流のような気がします。
    • good
    • 0
この回答へのお礼

お礼が遅くなりました。
回答ありがとうございました。
やはり、計算では限界があるのですね。
サンプルなどを参考に
何とか変換機能を実装できそうです。

お礼日時:2007/10/28 22:39

サクラエディタのソースがどこかに転がっていたと思うので、それを見たほうが早いのでは?

    • good
    • 0
この回答へのお礼

回答ありがとうございます。
作者さんのHPでソースを探してみてダウンロードしてみたのですが、
思うソースがみつかりませんでした^^;
ヘルプファイルのようなものはみつかったのですが・・・

お礼日時:2007/09/05 14:53

サクラエディタで双方向に変換できるとか、


Outlookで文字化けしないとかはそれぞれの
アプリが入力データに対して「緩めに規則を適用」
しているからです。
厳しく規則を適用すれば、丸数字はJIS(iso-2022-jp)や
ShiftJISにはありませんし、
はしご高もそうですから、
illegalなデータとして弾かれます。

ただ、JIS←→SJISのコード変換は計算式で
求められるものなので、
無理やりその計算にかけてしまってその結果を
使っているだけのことです。

今現在どのような手段で変換を行っているのか
わかりませんが、
ShiftJISの代わりに、cp932とかWindows-31J
というキャラクタセットを指定したり、
JISの代わりにコードページ 51932を使ったりすれば
*変換できることも*あります。
残念ながらこちらには cp932とかWindows-31J
というのに該当するキャラクタセットはありません。
ISO-2022-JP-MSというのが提案されていたりしますが
一般的ではありません。


Microsoftコードページ932 - Wikipedia
http://ja.wikipedia.org/wiki/Windows-31J

http://www2d.biglobe.ne.jp/~msyk/software/libico …

ISO-2022-JP-MS - PukiWiki
http://legacy-encoding.sourceforge.jp/wiki/index …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
不明確だった部分が理解できました。
使いやすさを求めると規制を緩めた形でする必要があるのですね。
コード変換の計算式があるのですね・・・
色々探してみて、半角カナをSJIS→JISはできて、
「はしご高」のJIS→SJISはなんとなくできるようになりましたが、
どちらともなぜか逆ができずにいます^^;

お礼日時:2007/09/05 14:42

> 半角カナはJISにない



そんなことはありません。

> 方法や参考資料を教えていただければと思います。

専用のエスケープシーケンスまたはSO/SIを使用します。

参考URL:http://mikeneko.creator.club.ne.jp/~lab/kcode/ha …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
エスケープシーケンスが別に用意されているのですね。
色々と試してみて、半角かなのJISへの変換はできるようになりましたが、SJISへ戻すのがなぜかできません^^;

お礼日時:2007/09/05 14:32

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