• 締切済み

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

みんなの回答

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.9

HEW(SHなのか、H8なのか、M16CやM32Cなのか分かりませんが...)のような組み込み向けの環境では、ロケールに関しては最低限の実装しかされていないことが多いはずです。 ですので、表引きにすることをお勧めします。 UTF-8 → UTF-16の変換をまず行い(サロゲートは無視しても大丈夫ですよね?)、対応するシフトJISのコードを格納した配列を用意してください。 実際には65536個の配列にする必要まではないので、シフトJISに変換可能な部分だけの(歯抜けの)配列をいくつか用意することになるかと思います(ROMサイズが許せば、ベタで持った方が楽ですが...)。

shuhei1031
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.8

#7です。 >最終的な環境は組み込み環境でファイルシステムは >TOPPERSでも採用されているFatFSを使います。 >コンパイラはHEWで、書き込まれる先はSDです。 なるほど。 しかし、それでしたらいっそ、ファイルシステムをUTF-8で作ってしまってはどうでしょう? sjisと使用する文字コードの範囲もそう変わらないですし、大きな問題は無いように思えます。 むしろsjisの2バイト目の¥コードの問題を考慮しなくていい分、実装が楽かも。 ただ、ファイル名が8.3しかないので、UTF-8だと文字数が入らないという問題はありますかね。 もっとも、sjisを使っても4文字しか入りませんし、「テストです.txt」はどのみち無理。となると、sjisでもUTF-8でもない、独自のコードにしてしまうという手もあるかもしれません。

shuhei1031
質問者

補足

すでに出来ているファイルシステムをいじるよりは、 文字コード変換の方が簡単かなと思いました。 それと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)
回答No.7

>最終的にはその日本語ファイルのオープンを行いたいです。 環境は何でしょうか? オープンに使われる関数/APIがShift-JISに対応していないと、 作業自体がまったくの無駄ですよ。 それに、Windowsであれば、Unicodeのファイル名のままでファイルのオープンが可能ですので、Shift-JISへの変換は不要です。 環境によっては、UTF-8のままファイルをオープンできることもあるようですので、それなら変換は一切不要ですね。

shuhei1031
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.6

規格厳密合致プログラムを書くには、自前で表を作るしかありません。 しかし、処理系を特定してもよいのであれば、標準関数で実現することは可能です。 例えば、setlocaleでLC_CTYPEのロケーるをシフトJISおよびUTF-8に設定でき、かつwchar_tがそれぞれのロケールにおいて同じ内部表現を用いるのであれば、mbtowc/wctombまたはmbstowcs/wcstombsの組み合わせで変換することができます。 Amendment1以降(__STDC_VERSION__ >= 199409L)であれば、mbrtowc/wcrtomb、mbsrtowcs/wcsrtombs、またはsprintf/sscanfの組み合わせで変換することもできます。

shuhei1031
質問者

補足

mbtowc関数はHEWで使えたので、実験してみる価値はありますね。 setlocaleでシフトJISを設定できるかとか、 デバッガでマルチバイト文字が見れないとか色々調査が必要です。 とりあえず、mbtowc自体を使ったことがないので、 windowsで実験してみます。

全文を見る
すると、全ての回答が全文表示されます。
  • krisc
  • ベストアンサー率57% (12/21)
回答No.5

ShiftJIS⇔JIS⇔EUCは計算で変換できますが、Unicodeはテーブルを使わなければ変換できません。 ですので自前で処理したいなら、変換表を用意しなければなりません。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

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

shuhei1031
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。
  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

よく考えたらWindowsならUnicodeのままでもいいので意味ないですね それとURLじゃなくてURLエンコードされた文字列ですね

全文を見る
すると、全ての回答が全文表示されます。
  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

>Unicode→Shift-JISが全く検討が付かない状態です。 WindowsのVisualC++にはそんな関数があったような WideCharToMultiByte( )だったかな もちろん環境依存の非標準関数のはずです

全文を見る
すると、全ての回答が全文表示されます。
  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

>標準関数 まずここが無理。 なぜなら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

shuhei1031
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • shift-jisをUTF-8に読み込ませるには?

    shift-jisにてcsv形式で保存しているテキストファイルの配列(カンマ区切りの3番目)から取り出したものをUTF-8にエンコードする方法をご教示賜りたくご質問させて頂きました。 $Pscrtfl = "./datas/pdtscrt.txt"; open (DT,"<$Pscrtfl"); @Pscrt = <DT>; close (DT); foreach $i (@Pscrt){ @iW = split(/\,/,$i); $Pscrtfl = "./datas/pdtscrt.txt のtxtに入ってる3番目のデータを取り出して、それをUTF-8文字コードに 変換して出力させたいと思っております。 現在のところ私のやってみたこと foreach(@Pscrt){ use Encode; Encode::from_to( $_, 'utf8', 'shiftjis' ); $Pscrtfl .= $_; } とエンコードかけてみるんですが。。。。やはりcsvファイルの文字がUTF-8に変更していないのか、 <!doctype html> <html><head><meta charset="UTF-8">でprintしようとすると、やはり文字化けしてしまいます。 これを文字化けしない方法がお分かりの方おられましたら、ぜひご教示下さいませ。

    • ベストアンサー
    • Perl
  • デコードに困っています。

    エンコードされた文字をrawurldecodeでデコードしたいのですが、Shift_JISやEUC、UTF-8によってデコードされる形が異なります。 METAでShift_JISを指定してればShift_JISでエンコードされた値もデコードすればしっかりと表示されます。しかしUTF-8など異なるタイプではMETAがShift_JISなのでしっかりと表示されません。どうすればすべてのタイプに対応させることが可能なのでしょうか?

    • 締切済み
    • PHP
  • shift-jisからutf8に変換

    解決に至らなかったので再度お尋ねします。 CGIのコードを見てくださいますか。 http://hotpegasus.bov.jp/mail.txt (必要な部分だけ表示しておりますので、そのままアップしても機能はしません) 改修した箇所は以下のです。 <meta http-equiv="Content-Type" content="text/html;charset=shift_jis"> &jcode'h2z_sjis(*contenido) &jcode'convert(*subject,'sjis'); &jcode'convert(*infor,'sjis'); &jcode'convert(*contenido,'jis'); &jcode'convert(*res_msg,'jis'); print "Content-type: text/html;charset=shift_jis\n\n"; ↓ sjis関連をutf8に書き換え、jcodeの頭文字をJに書き換え <meta http-equiv="Content-Type" content="text/html;charset=utf8"> &Jcode'h2z_utf8(*contenido) &Jcode'convert(*subject,'utf8'); &Jcode'convert(*infor,'utf8'); &Jcode'convert(*contenido,'utf8'); &Jcode'convert(*res_msg,'utf8'); print "Content-type: text/html;charset=shift_utf8\n\n"; require 'jcode.pl'をuse Jcode;に書き換え ※jcode::" となっている箇所はありません 結果 メールフォームはエラーや文字化けは出なくて成功しましたが、メール受信の際、ThunderbirdPortableメーラーでは全て文字化け(文字エンコーディングは「日本語ISO-2022jp」となっています)、ウェブメールのgmailでは内容は文字化けになっていませんが、タイトルが文字化けになっています。 どこが悪かったのでしょうか? 宜しくお願いします。

    • 締切済み
    • CGI
  • VBでShift_JISへurlエンコードできないでしょうか?

    VB6もしくはVBAですが、 文字列をShift_JISへurlエンコードしたいと思います。 utfやeucは方法があったのですが、Shift_JISに関しては 見つかりませんでした。 よろしくお願いします。

  • 【Ruby】shift-jisのページの置換

    content="text/html; charset=shift-jis"のページを読み込んで、文字列の置換がしたいです。 #!/opt/local/bin/ruby require 'uri' require 'open-uri' url='http://hoge.hoge' open(url,'r:shift_jis'){|io| content = io.read content.gsub!(/ほげ/,'ホゲホゲ) print content } 上記の様に書いてみました。ソースコード自体はUTF-8で記述しました。 実行すると、 `gsub!': incompatible encoding regexp match (UTF-8 regexp with Shift_JIS string) (Encoding::CompatibilityError) となってしまいます。 どうしたらよいのでしょうか? rubyのバージョンは ruby 2.0.0p353 (2013-11-22 revision 43784) [x86_64-darwin12] です。 以上、よろしくご指導のほど、お願い申し上げます。

    • ベストアンサー
    • Ruby
  • URLデコードをしてくれるリネームソフトを探しています

    URLデコードをしてくれるリネームソフトを探しています URLエンコードされた名前のファイル名があるのですが、これを日本語のファイルに直したいです ファイル数が結構あり、手で直すのはちょっと無理があるのでURLデコードをしてくれるリネームソフトを探しています 文字コードはUTF-8です よろしくお願いします

  • 文字コードの変換(Shift-JISからUTF8)

    文字コードがShift-JISのCSVファイルを読み込み、UTF-8のテキストファイルに出力するのに プログラムの中で変更しようとしているのですが、うまくいきません。出力ファイルの文字コードを 確認するとShift-JISのままです。 どなたか教えていただけないでしょうか? ActivePerl v5.16.0を使用し、Encodeモジュールのfrom_toを使用しています。 #!/usr/bin/perl use strict; use warnings; use utf8; use Encode; my $input_file="input.csv"; my $output_file="output.txt"; open (IN, $input_file) or die "$!"; open (OUT, ">$output_file") or die "$!"; while (<IN>){ chomp ($_); my @data=split(/,/,$_); for(my $i=0;$i<@data;$i++){ $data[$i]=Encode::from_to($data[$i],'shiftjis','utf8'); #Shift-JISからUTF-8に変換 $data[$i]=~s/\s+//g; print OUT $_; } print OUT "\n"; } close (IN); close (OUT);

    • ベストアンサー
    • Perl
  • Shift-JISからUTF-8への変換が出来ません

    初歩的な質問で申し訳ありませんが、大変困っております。ただいまimagettftext()を使って日本語主力したく悪戦苦闘しております。  ページ自体はShift-JISで制作していますのでimagettftext()で日本語を出力する場合はUTF-8へ変換して出力するところまでは知れべていて分かりました。しかしいざmb_convert_encoding()で変換しようとするとなぜかUTF-8へ変換されません。 $str = mb_convert_encoding($str,"UTF-8","SJIS"); print mb_detect_encoding($str);  結果→SJIS しかしこれがEUC-JPなら変換されます。 $str = mb_convert_encoding($str,"EUC-JP","SJIS"); print mb_detect_encoding($str);  結果→EUC-JP なぜなのか原因が分からなく困っております。 どなたかご教授願いませんでしょうか? よろしくお願い致します。

    • 締切済み
    • PHP
  • UTF-8→shift-jisに変換できるサイトは

    はじめまして。 インターネット上に存在する、UTF-8の文字コードで作られたHTMLのサイトについて、そのURLを入力してボタンを押すとshift-jisに変換して表示してくれるような変換サイト(Webフィルタ?)は世の中にありますでしょうか。 あればぜひ教えてください。 もし理論的に不可能でしたら理由を簡単に教えていただけるとありがたいです。 よろしくお願いします。

  • UTF-8とは何ですか

    今更ながらですが、日本語のサイトは全部SHIFT-JISだと思ってました。 ところが日本語のサイトでもUTF-8が多いよと聞きました。 冗談だろと思ったらOKWAVEが既にUTF-8・・・ ヤフーもgooも大手サイトはほとんどUTF-8でした。 日本語=SHIFT-JISだと思ってmetaか何かで指定していますが、 ひょっとしてこれは作り直した方がいいのでしょうか。 UTF-8で検索したら日本語などの2バイト圏を考慮してないとか そういうブログも見つかったのですが、 大手サイトでUTF-8を採用しているということは、このブログはガセなのでしょうか。

    • ベストアンサー
    • HTML