- 締切済み
URLのUTF-8からShift-JISへのデコード
CでUTF-8からShift-JISへのデコードを行うプログラムを 標準関数を使って作りたいのですが、どう行ったらいいのかわかりません。 例えば /f%e3%83%86%e3%82%b9%e3%83%88%e3%81%a7%e3%81%99.txt というURLを入力したら、 /テストです.txt という日本語入りのURLに変換して、 最終的にはその日本語ファイルのオープンを行いたいです。 参考になるHPやソースがありましたら、教えていただけないでしょうか?
- みんなの回答 (9)
- 専門家の回答
みんなの回答
- jacta
- ベストアンサー率26% (845/3158)
HEW(SHなのか、H8なのか、M16CやM32Cなのか分かりませんが...)のような組み込み向けの環境では、ロケールに関しては最低限の実装しかされていないことが多いはずです。 ですので、表引きにすることをお勧めします。 UTF-8 → UTF-16の変換をまず行い(サロゲートは無視しても大丈夫ですよね?)、対応するシフトJISのコードを格納した配列を用意してください。 実際には65536個の配列にする必要まではないので、シフトJISに変換可能な部分だけの(歯抜けの)配列をいくつか用意することになるかと思います(ROMサイズが許せば、ベタで持った方が楽ですが...)。
- titokani
- ベストアンサー率19% (341/1726)
#7です。 >最終的な環境は組み込み環境でファイルシステムは >TOPPERSでも採用されているFatFSを使います。 >コンパイラはHEWで、書き込まれる先はSDです。 なるほど。 しかし、それでしたらいっそ、ファイルシステムをUTF-8で作ってしまってはどうでしょう? sjisと使用する文字コードの範囲もそう変わらないですし、大きな問題は無いように思えます。 むしろsjisの2バイト目の¥コードの問題を考慮しなくていい分、実装が楽かも。 ただ、ファイル名が8.3しかないので、UTF-8だと文字数が入らないという問題はありますかね。 もっとも、sjisを使っても4文字しか入りませんし、「テストです.txt」はどのみち無理。となると、sjisでもUTF-8でもない、独自のコードにしてしまうという手もあるかもしれません。
補足
すでに出来ているファイルシステムをいじるよりは、 文字コード変換の方が簡単かなと思いました。 それとSDで保存するのですが、windows上でもそのSDは見るので、 Shift-JISの方が助かるのです。 「テストです.txt」の文字数は単純に間違えました。すいません。 HEWにもwctomb関数があるので、それで行ってみようと思ったのですが、 0バイト変換か-1を返すかのどちらかになってしまい、 なかなかうまく行きません。 "%E3%83%86%E3%82%B9%E3%83%88%E3%81%A7%E3%81%99.txt" を 30C6 30B9 30C8 3067 3059 ".txt" と変換しているのですがこれがまずいのかもしれません。
- titokani
- ベストアンサー率19% (341/1726)
>最終的にはその日本語ファイルのオープンを行いたいです。 環境は何でしょうか? オープンに使われる関数/APIがShift-JISに対応していないと、 作業自体がまったくの無駄ですよ。 それに、Windowsであれば、Unicodeのファイル名のままでファイルのオープンが可能ですので、Shift-JISへの変換は不要です。 環境によっては、UTF-8のままファイルをオープンできることもあるようですので、それなら変換は一切不要ですね。
補足
最終的な環境は組み込み環境でファイルシステムは TOPPERSでも採用されているFatFSを使います。 コンパイラはHEWで、書き込まれる先はSDです。 なので、ファイルオープンの為にはファイル名は Shift-JISである必要があるかと思っています。 変換プログラムのデバッグ自体はwindowsでおこなっていますが・・・。
- jacta
- ベストアンサー率26% (845/3158)
規格厳密合致プログラムを書くには、自前で表を作るしかありません。 しかし、処理系を特定してもよいのであれば、標準関数で実現することは可能です。 例えば、setlocaleでLC_CTYPEのロケーるをシフトJISおよびUTF-8に設定でき、かつwchar_tがそれぞれのロケールにおいて同じ内部表現を用いるのであれば、mbtowc/wctombまたはmbstowcs/wcstombsの組み合わせで変換することができます。 Amendment1以降(__STDC_VERSION__ >= 199409L)であれば、mbrtowc/wcrtomb、mbsrtowcs/wcsrtombs、またはsprintf/sscanfの組み合わせで変換することもできます。
補足
mbtowc関数はHEWで使えたので、実験してみる価値はありますね。 setlocaleでシフトJISを設定できるかとか、 デバッガでマルチバイト文字が見れないとか色々調査が必要です。 とりあえず、mbtowc自体を使ったことがないので、 windowsで実験してみます。
- krisc
- ベストアンサー率57% (12/21)
ShiftJIS⇔JIS⇔EUCは計算で変換できますが、Unicodeはテーブルを使わなければ変換できません。 ですので自前で処理したいなら、変換表を用意しなければなりません。
- Tacosan
- ベストアンサー率23% (3656/15482)
どうしても変換したいとしたら, 表を使ってやるしかないです. UTF-8 から一旦 Unicode のコードポイント (u000000~u10ffff) に変換し, その値をキーにして表をひいて対応する Shift_jis の値を見付けることになります.
補足
なるほど。それはかなり面倒くさそうですね。 変換表を調べてみます。
- php504
- ベストアンサー率42% (926/2160)
よく考えたらWindowsならUnicodeのままでもいいので意味ないですね それとURLじゃなくてURLエンコードされた文字列ですね
- php504
- ベストアンサー率42% (926/2160)
>Unicode→Shift-JISが全く検討が付かない状態です。 WindowsのVisualC++にはそんな関数があったような WideCharToMultiByte( )だったかな もちろん環境依存の非標準関数のはずです
- SAYKA
- ベストアンサー率34% (944/2776)
>標準関数 まずここが無理。 なぜならCは(略)規格が古く(略)文字コードという概念が(略)無いから。 その文字列を一端バイナリ変換してデコードだね。 http://www.google.com/search?lr=lang_ja&q=%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89%E5%A4%89%E6%8F%9B%20iconv
補足
回答ありがとうございます。 一応、'%'を見てバイナリデータに直すところは作ってみました。 そのバイナリデータを、UTF-8→Shift-JISにしたいのです。 多分、UTF-8→Unicode→Shift-JISという流れになると思うのですが、 UTF-8→Unicodeはなんとなく分かるのですが、 Unicode→Shift-JISが全く検討が付かない状態です。
補足
M16Cです。 表引きのサンプルコードや参考になるHPなどはありませんでしょうか? また、最低限の実装しかしてないとして、 どの程度できるのか試してみたいのですが、 それのサンプルなどもないでしょうか?