はてなキーワード: SJISとは
アニメがはじまったついでにPC98版 YU-NOのメッセージファイルフォーマットを解析してみた。
"*.MES"
+0 offset(2byte)
+2 辞書データ(offset - 2 byte) sjis2byte文字のつめあわせ
0x06 | 次の0x06までのデータがファイル名 |
0x11 | 入力待ち |
0xC0-0xCF,0x60-0x7F | 0x20を足して次の1byteを追加すればsjisの1文字になる |
0xD0-0xFF | 0xD0を引いて2倍した数値に該当する辞書データの1文字 |
0x133003 | 主人公の名前に置き換え |
他にもコマンドいろいろあるみたい
プロマネ「うーん、某社の社内システムをほぼ作り終えたはいいが、肝心のInternet Explorer 11でなんで文字化けするんや?」
通りすがりのワイ(別プロジェクト所属)「何か悩んでるんですか?」
プロマネ「かくかくしかじかなんだよ。文字コードUTF-8なんだけどさ?」
ワイ「あー、WindowsはSJISにしか対応していませんよ。もちろんIEも」
ワイ「クライアントにはゴメンナサイして、文字コード絡むところ修正しないとだめっすねえ。Unicodeの顔文字も受け付ける要件だったんですか?じゃあ要件定義からやり直しっすねえ」
最近ワイ「ん?Internet Explorerは特別にUTF-8に対応している?んん?」
これワイが悪いんか?
一方俺はSJISで保存しなおした
http://linux.ohwada.jp/modules/smartsection/item.php?itemid=515
http://0xcc.net/pub/webdb/bk-05.html
などのまとめが素晴らしいね
最近のブラウザはほとんどRFC2231に対応しているみたいだ
IEは,8になってもまだ対応してなかったのかよ! とか Safariは未対応かよ! という突っ込みはあるけどね
それと,自分の環境で確かめられる範囲でさきほどの投稿の表をもう少し充実させてみたよ
生utf8 | 生sjis | url_encode(utf8) | url_encode(sjis) | RFC2231 | |
chrome24 (win7-64bit) | ok | x | ok | x | ok |
firefox18 (win7-64bit) | ok | x | x | x | ok |
IE9 (win7-64bit) | x | ok | ok | x | ok |
firefox18 (MacOS X) | ok | x | x | x | ok |
Opera | ok | x | x | x | ok |
Safari5.1.7 (MacOS X) | ok | ok | x | x | x |
IE8,7,6 | x | ok | okだけど長いファイル名× | ? | x |
RFC2231対応状況全般と,IEの8,7,6とOperaについては参考ページからの情報を使っているよ
それと,参考ページと私の調査でSafariの生SJIS対応の結果が矛盾しているんだけどどうしよう・・・バージョンの違い?
案は2つあるよね
案1)
案2)
Rails3でRFC2231準拠のやり方がよくわからないので,Rails3のsend_file関数で日本語ファイル名を使うなら案2が無難かな
Webブラウザによって,マルチバイトファイル名の取り扱いが異なるというのが問題なんだよね
いままでは,http://kingyo-bachi.blogspot.jp/2012/10/railssendfilechrome.html
を参考にして,ファイル名をURLエンコードすることでお茶を濁していたんだ
でもこれだと,Firefoxでファイル名が文字化けすることに気付いてしまった
気づかなければ放置していたんだけどね :P
http://rails.hatenadiary.jp/entry/2013/01/31/104006 を発見
(生sjisと,URLエンコードの違いはもう少ししっかり書いておかないと誤解招かないかな?という当ページへの突っ込みはさておき)
つまりは,基本は日本語ファイル名をUTF-8で扱うぞ,ただしIEだけは例外としてSJISに変換してやるぞ
ということだね
ちょっと気になったので,このあたりのブラウザの対応状況をざっと調べてみたよ
なお調べた日本語ファイル名は「今日の予定.doc」.「予」という漢字が入っているのがポイントね
生utf8 | 生sjis | url_encode(utf8) | url_encode(sjis) | |
chrome(win7-64bit) | ok | x | ok | x |
firefox 18 (win7-64bit) | ok | x | x | x |
IE9(win7-64bit) | x | ok | ok | x |
firefox(MacOS X) | ok | x | x | x |
さらにいろいろ調べてみると,正式にはRFC2231に準拠させるのが正しいみたい
http://fgin.seesaa.net/article/30073826.html によると,
IE6は対応してなかったようだけど,私の中ではIE6はもう絶滅していることになっているので!
Railsのsend_file関数でさ,RFC2231準拠のContent-Disposition表記ができたらいいのにな(チラッチラッ)
A Beautiful Site (http://abeautifulsite.net/)さんの
jquery.fileTreeを利用させてもらった。
以下、留意点...
パスを指定しないと、もとのhtmlがあるパス(ディレクトリ)にあるものと解釈する。
(/jqueryFileTree.php と指定すると、公開しているルートディレクトリにあるjqueryFileTree.phpを探しにいく)
http://...と指定して他のサーバへ問い合わせるのも可能な模様(だが、試していない)。
root:
d:/
d:/temp/
など
hemlentries -> htmlspecialchars は必須。
http://treatment-head.blogspot.com/2008/11/jquery-file-tree_21.html
ただし、UTF-8やEUC-JPでページを記述している場合は、さらに処理が必要。
windowsでは、mbstringの設定にかかわらず、引数SJIS渡し、戻り値SJIS返しの模様。
したがってUTF-8やEUC-JPでページを記述している場合は、
その点を考慮してconnectorsフォルダにあるjqueryFileTree.phpを書き換える必要がある。
$_POST['dir'] = urldecode($_POST['dir']);
という行があるが(スーパーグローバル変数はデコード済みで、さらにデコードするのは危険とphpマニュアルに記載されている)
どのみちUnicode文字列のURLデコードはこの関数では無理なようなので、phpマニュアルのUserNoteから拝借。
http://php.net/manual/en/function.urldecode.php
こちらにズバリが掲載されているか...と試してみたが、どうも動作がうまくいかなかった
http://ameblo.jp/pushurinko/entry-10287161493.html
他、ご参考
mbstring.language = Japanese
mbstring.internal_encoding = EUC-JP
mbstring.http_input = pass
mbstring.http_output = pass
mbstring.encoding_translation = Off
mbstring.detect_order = UTF-8,SJIS-win,eucJP-win
mbstring.substitute_character = none
;mbstring.func_overload = 0
;mbstring.strict_encoding = Off
となってます。殆どphp入れた時の初期値のはず。