- ベストアンサー
半角カナ文字と特殊文字の変換
半角カナ文字と「丸で囲まれた1」や「はしご高」等の特殊文字を SJISからJISへ、JISからSJISへ変換する方法を調べています。 半角カナはJISにないという記述も見たのですが、 サクラエディタで双方へ変換できるのと、 Outlookへ半角カナで送信したところ文字化けせず(全角になっていましたが) 受信できたこと、「はしご高」は受送信で文字変換されているようなので、 何か方法があるのではないかと調べています。 方法や参考資料を教えていただければと思います。 よろしくお願いいたします。
- みんなの回答 (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 で 変換できる部分はそれに任せて そうでない文字は細かくチェックして 変換しているみたいですね。 んじゃあ頑張って読み取ってください♪
その他の回答 (5)
- alphion
- ベストアンサー率19% (27/136)
>作者さんのHPでソースを探してみてダウンロードしてみたのですが、 >思うソースがみつかりませんでした^^; >ヘルプファイルのようなものはみつかったのですが・・・ ここで、 ssrc_2007-07-08.tar.bz2 を持って行って、7zipで2回解凍すれば
- 参考URL:
- http://sourceforge.net/project/showfiles.php?group_id=12488&package_id=54290&release_id=521658
お礼
回答ありがとうございました。 そこにあったのですね。別の部分をダウンロードしていました。 情報ありがとうございました。
補足
お礼が遅くなってすみませんでした。 おかげさまで何とか実装できそうです。
- sakusaker7
- ベストアンサー率62% (800/1280)
> 半角かなのJISへの変換はできるようになりましたが、SJISへ戻すのがなぜかできません^^; >半角カナをSJIS→JISはできて、 「はしご高」のJIS→SJISはなんとなくできるようになりましたが、 どちらともなぜか逆ができずにいます^^; とりあえず半角カナだけ言うと、 SO/SIを使って表すやりかたなら、SOが出ているかどうかを 覚えておかないといけません。 覚えていたら、8bit目を立てるだけだからそう難しくはないのでは? はしご高は、コードの値が大きいので ふつうに計算式にかけるとオーバーフローが 発生したように記憶しています。 それを調整するか、あるいはコードの変換を テーブルをひく形でやってしまえばいいと思います。 最近作られているコード変換ユーティリティは こっちのテーブルをひく形式の方が主流のような気がします。
お礼
お礼が遅くなりました。 回答ありがとうございました。 やはり、計算では限界があるのですね。 サンプルなどを参考に 何とか変換機能を実装できそうです。
- alphion
- ベストアンサー率19% (27/136)
サクラエディタのソースがどこかに転がっていたと思うので、それを見たほうが早いのでは?
お礼
回答ありがとうございます。 作者さんのHPでソースを探してみてダウンロードしてみたのですが、 思うソースがみつかりませんでした^^; ヘルプファイルのようなものはみつかったのですが・・・
- sakusaker7
- ベストアンサー率62% (800/1280)
サクラエディタで双方向に変換できるとか、 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/libiconv-1.9.2-cp932-patch.html ISO-2022-JP-MS - PukiWiki http://legacy-encoding.sourceforge.jp/wiki/index.php?ISO-2022-JP-MS
お礼
回答ありがとうございます。 不明確だった部分が理解できました。 使いやすさを求めると規制を緩めた形でする必要があるのですね。 コード変換の計算式があるのですね・・・ 色々探してみて、半角カナをSJIS→JISはできて、 「はしご高」のJIS→SJISはなんとなくできるようになりましたが、 どちらともなぜか逆ができずにいます^^;
- jacta
- ベストアンサー率26% (845/3158)
> 半角カナはJISにない そんなことはありません。 > 方法や参考資料を教えていただければと思います。 専用のエスケープシーケンスまたはSO/SIを使用します。
お礼
回答ありがとうございます。 エスケープシーケンスが別に用意されているのですね。 色々と試してみて、半角かなのJISへの変換はできるようになりましたが、SJISへ戻すのがなぜかできません^^;
お礼
回答ありがとうございます。 わざわざ探していただきましてありがとうございました。 おかげさまで、何とか実装できそうです。 ありがとうございました。