アプリ版:「スタンプのみでお礼する」機能のリリースについて

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やソースがありましたら、教えていただけないでしょうか?

A 回答 (9件)

HEW(SHなのか、H8なのか、M16CやM32Cなのか分かりませんが...)のような組み込み向けの環境では、ロケールに関しては最低限の実装しかされていないことが多いはずです。


ですので、表引きにすることをお勧めします。

UTF-8 → UTF-16の変換をまず行い(サロゲートは無視しても大丈夫ですよね?)、対応するシフトJISのコードを格納した配列を用意してください。
実際には65536個の配列にする必要まではないので、シフトJISに変換可能な部分だけの(歯抜けの)配列をいくつか用意することになるかと思います(ROMサイズが許せば、ベタで持った方が楽ですが...)。

この回答への補足

M16Cです。
表引きのサンプルコードや参考になるHPなどはありませんでしょうか?
また、最低限の実装しかしてないとして、
どの程度できるのか試してみたいのですが、
それのサンプルなどもないでしょうか?

補足日時:2008/10/16 15:58
    • good
    • 0

#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"
と変換しているのですがこれがまずいのかもしれません。

補足日時:2008/10/03 20:14
    • good
    • 0

>最終的にはその日本語ファイルのオープンを行いたいです。


環境は何でしょうか?
オープンに使われる関数/APIがShift-JISに対応していないと、
作業自体がまったくの無駄ですよ。
それに、Windowsであれば、Unicodeのファイル名のままでファイルのオープンが可能ですので、Shift-JISへの変換は不要です。

環境によっては、UTF-8のままファイルをオープンできることもあるようですので、それなら変換は一切不要ですね。

この回答への補足

最終的な環境は組み込み環境でファイルシステムは
TOPPERSでも採用されているFatFSを使います。
コンパイラはHEWで、書き込まれる先はSDです。
なので、ファイルオープンの為にはファイル名は
Shift-JISである必要があるかと思っています。

変換プログラムのデバッグ自体はwindowsでおこなっていますが・・・。

補足日時:2008/10/02 16:33
    • good
    • 0

規格厳密合致プログラムを書くには、自前で表を作るしかありません。


しかし、処理系を特定してもよいのであれば、標準関数で実現することは可能です。

例えば、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で実験してみます。

補足日時:2008/10/02 20:18
    • good
    • 0

ShiftJIS⇔JIS⇔EUCは計算で変換できますが、Unicodeはテーブルを使わなければ変換できません。


ですので自前で処理したいなら、変換表を用意しなければなりません。
    • good
    • 0

どうしても変換したいとしたら, 表を使ってやるしかないです.


UTF-8 から一旦 Unicode のコードポイント (u000000~u10ffff) に変換し, その値をキーにして表をひいて対応する Shift_jis の値を見付けることになります.

この回答への補足

なるほど。それはかなり面倒くさそうですね。
変換表を調べてみます。

補足日時:2008/10/01 22:47
    • good
    • 0

よく考えたらWindowsならUnicodeのままでもいいので意味ないですね


それとURLじゃなくてURLエンコードされた文字列ですね
    • good
    • 0

>Unicode→Shift-JISが全く検討が付かない状態です。


WindowsのVisualC++にはそんな関数があったような
WideCharToMultiByte( )だったかな
もちろん環境依存の非標準関数のはずです
    • good
    • 0

>標準関数


まずここが無理。
なぜならCは(略)規格が古く(略)文字コードという概念が(略)無いから。

その文字列を一端バイナリ変換してデコードだね。
http://www.google.com/search?lr=lang_ja&q=%E6%96 …

この回答への補足

回答ありがとうございます。

一応、'%'を見てバイナリデータに直すところは作ってみました。
そのバイナリデータを、UTF-8→Shift-JISにしたいのです。
多分、UTF-8→Unicode→Shift-JISという流れになると思うのですが、
UTF-8→Unicodeはなんとなく分かるのですが、
Unicode→Shift-JISが全く検討が付かない状態です。

補足日時:2008/10/01 19:01
    • good
    • 0

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