ラベル encoding の投稿を表示しています。 すべての投稿を表示
ラベル encoding の投稿を表示しています。 すべての投稿を表示

2011年10月3日月曜日

MySQLの dumpと restore


文字コード設定がされていないサーバからダンプする時に文字化けすることの対策のメモ。


dump

mysqldump -u user_name -p --compact --default-character-set=binary db_name > dump.sql

restore
DB(Schema)を作ってから、
sed 's/latin1/utf8/g' dump.sql > dump_utf8.sql
mysql -u user_name -p db_name < dump_utf8.sql

バイナリで出して文字コードの記述を置換してから取り込む。


参考

2011年9月29日木曜日

PHPExcelで PDFが文字化けする問題の解決方法


PHPExcelではExcelの他にPDFも出力できる。

$writer = PHPExcel_IOFactory::createWriter($xls, "PDF");
$writer->save($path);
しかし、これだとPDFで日本語を出力しようとすると文字化けする。

文字化けを回避するには、フォントをセットする必要がある。
$writer = PHPExcel_IOFactory::createWriter($xls, "PDF");
$writer->SetFont('arialunicid0-japanese');
$writer->save($path);
これができるようになったのはわりと最近のようだ。(参考:PHPExcel - phpexcel - View Issue #11919: Can't set font on writing PDF)

ただし環境によってはこれでも見られないらしい。(参考:PHPExcel の PDF出力で日本語文字化け2 携帯ビューア - PC・通信メモ)


また、PHPExcelで作るPDFはExcelとして出力した場合と比べていろいろ違う(罫線とか数値フォーマットとか横幅とか)ので、綺麗に出すにはPDF用にいろいろ工夫しないといけないようだ。


参考

2011年6月30日木曜日

Windowsで git 調査メモ

とりあえずローカルのみで使ってみたい。


インストール

  1. msysgitをインストール
  2. tortoisegitをインストール
  3. ユーザー名とメールアドレスをセット(settings → Git → Config)


要調査事項


日本語のファイル名が扱えないと、ドキュメントの管理に使えない...
Bazaarを使うか。

2011年3月3日木曜日

PHPの SJISと SJIS-WINの違い


SJIS-WINとは?

PHPで文字コードとして「SJIS-WIN」を指定すると、Microsoftが拡張したShift_JISであるWindows-31Jが使われる。

Windows-31Jは、Microsoftが「JIS X 0208-1990」をベースに、NECとIBMの独自拡張文字の一部(一般的にはSJISの「機種依存文字」と呼ばれる?)を取り込んだ文字コード。
(参考:Microsoftコードページ932 - Wikipedia)



SJISとSJIS-WINで何が違うの?


SJIS-WINの方が文字が多い。

よく使うところでは、下記のような文字はSJISーWINにはあるがSJISにはない。

  • 丸数字 (①②③...⑳)
  • ローマ数字 (ⅠⅡⅢ...Ⅹ、ⅰⅱⅲ...ⅹ)
  • カッコ付きの株 (㈱)
  • はしご高[はしごたか] (髙)
  • たつ崎[たつさき、たちさき] (﨑)



SJIS-WINにはあるがSJISにはない文字

下記の3種類
  • NEC 特殊文字(13区)
  • NEC 選定 IBM 拡張文字(89~92区)
  • IBM 拡張文字(115~119区)

具体的な文字の一覧については下記参考サイトを参照。



SJIS-WINにはあるがSJISにはない文字を正規表現で探すには?

preg_match()等のPCRE関数はUTF-8以外のマルチバイト文字に対応していないので、そのままではShift_JISには使えない。(UTF-8の場合はパターン修飾子として"u"を付ければ使える。)
一見Shift_JISでも使えそうに見えることもあるが、Shift_JISの2バイト目と次の文字の1バイト目を1つの文字とみなしてヒットしてしまう場合がある。
preg_match('/[\x87][\x40-\x8F]/', 'ョ@'); // => true

対策としては、対象文字列をmb_substr()等を使いあらかじめ1文字ずつに分解しておいて、それを1文字ずつチェックしていけば正しく判定できる。

また、PHP4ではmb_ereg系の関数をこれに使えたみたいだが、鬼車のPHP5では使えないみたい。

単純にSJIS-WINにはあるがSJISにはない文字を含んでいるかどうかを判定しただけなら、それぞれの文字コードに変換した後に比較すれば分かる。
$utf8 = '株';
$sjis = mb_convert_encoding($utf8, 'SJIS', 'UTF-8');
$sjisWin = mb_convert_encoding($utf8, 'SJIS-WIN', 'UTF-8');

var_dump($sjis === $sjisWin); // => true

$utf8 = '㈱';
$sjis = mb_convert_encoding($utf8, 'SJIS', 'UTF-8');
$sjisWin = mb_convert_encoding($utf8, 'SJIS-WIN', 'UTF-8');

var_dump($sjis === $sjisWin); // => false

2010年12月7日火曜日

PHPの htmlSpecialChars()の 第3引数(文字コード)の調査メモ

そもそも

基本的に内部的な文字コードは(ソースファイルもDBもその他の設定も)全てUTF-8にしておき、POSTやGETなどで入力値を受け取る時には入力値をUTF-8に変換してから使うのが良いと思うし、そうすれば漏れがない限りはhtmlSpecialChars()等で出力時に不正文字コードを気にする必要はない。



しかし

現実的にはPOST/GETで受け取る以外にも下記の様に様々な方法でデータが入ってくることもある。

それぞれデータを取り出す時に適切に文字コード変換すべきだが、やっぱりいつか誰かが漏らしそう。

なので、やはり出力時にも不正な文字コードは弾いた方がよい。



で、調べてみた

2009年の後半にいくつかのブログでこのことが論じられていた。(そういえば読んだ記憶が...。詳細は下の方の参考リンクを参照。)
中でも「htmlspecialchars - 第45回PHP勉強会@関東 :: handsOut.jp」が簡潔でわかりやすかった。
PHP5.2.5以降を使い、htmlspecialchars()の第3引数にUTF-8を指定するのが一番堅実のようだ。

蛇足だが、もしUTF-8以外でWebページを入出力したい場合は、mb_http_output()とob_start()を使って出力完了後に文字コードをSJIS-WINなどに変換させるようにしておいて、そこにUTF-8で出力するのが良いと思う。(処理量が多いとオーバーヘッドが気になる?)



以外な落とし穴が

しかし、htmlspecialchars()の文字コード検出には思わぬ落とし穴があった。
htmlspecialchars()は不正な文字コードを見つけても、PHPの設定でdisplay_errorsがfalseの場合しかWarningを出さない。
  • display_errors = true → Warningを画面にもログにも出さない
  • display_errors = false → Warningをログにも出す(画面には出さない)
これでは、開発環境では文字コードが不正になりうる箇所に気づかないまま、本番環境でWarningを出しまくるかもしれない。

これは意図的なものなので、修正されない可能性が高そう。(参考:display_errorsが謎の副作用を持っている箇所について - muddy brown thang)
また、@htmlspecialchars()に@(アットマーク)を付けてもログへのエラー出力を抑制できなかった。

Warningを出さないようにする対策としては、htmlspecialchars()の手前で強制的に文字コードを変換するという手がある。
$str = mb_convert_encoding($str, 'UTF-8', 'UTF-8');
echo htmlSpecialCahrs($str, ENT_QUOTES, 'UTF-8');
現在のサーバ性能とPHPの速さなら、こんな富豪的な重複処理もあまり問題にならない環境が多い。
mb_convert_encoding()とhtmlSpecialChars()の検出基準(?)が違うというようなことをどこかで読んだ気がするんで、その場合はこれでもWarningが出るのだろう。
でも、どうせmb_convert_encoding()するのなら、そもそもhtmlSpecialChars()での文字コード指定は要らないか。

ただし、本道としては、せっかく出してくれるWarningを手がかりにして、該当箇所で適切な文字コード変換をするようコードを修正するのが筋だろう。
PHPのWarningはset_error_handlerで捕まえられる。



もう1つ

「htmlspecialchars/htmlentitiesはBMP外の文字を正しく扱えない - [php] - 徳丸浩の日記」という落とし穴もあるようだが、これはPHPの5.3.2でFixした。(5.2系は?)
また、(線文字Bは置いておいて)一部の漢字を「使えません。仕様です。」で済ませられるなら、こちらの問題は黙殺できそうだ。



参考

2010年5月8日土曜日

HTML5のテンプレート例

(2010/05/28 変更:Google Analytics非同期版が正式リリースされたので、Beta版から正式版に変えた)
(2010/08/30 変更:div構造を少しすっきりさせた)
(2010/11/04 変更:Google Analyticsのコードをhead要素内へ移動)
(2011/04/25 追加:IEの条件付きコメント(Conditional Comments)の例を追加)

Google Analytics非同期版とYUI 2 Grids CSSとjQueryを組み込んだHTML5の例。
header要素等のHTML5の新要素は使わない。(今のところあまりメリットを感じないので、)

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<title>{{ TITLE }}</title>
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" />
<link rel="alternate" type="application/rss+xml" href="{{ RSS_URL }}" title="{{ FEED_TITLE }}" />
<link rel="alternate" type="application/atom+xml" href="{{ ATOM_FEED_URL }}" title="{{ FEED_TITLE }}" />
<link rel="stylesheet" href="{{ STYLESHEET_URL }}" />

<style>
{{ STYLE }}
</style>
<!--[if lt IE 9.0]>
<style>
{{ STYLE for IE8- }}
</style>
<![endif]-->

<script>
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-{{ GOOGLE_ANALYTICS_ID }}']);
_gaq.push(['_trackPageview']);
(function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
</head>

<!-- @see http://developer.yahoo.com/yui/grids/builder/ -->
<body id="doc4">

<div id="hd">
{{ HEADER }}
</div><!-- #hd -->

<div id="bd">
{{ MAIN_CONTENT }}
</div><!-- #bd -->

<div id="ft">
{{ FOOTER }}
</div><!-- #ft -->

<script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script src="{{ JAVASCRIPT_URL }}"></script>
<script>
{{ JAVASCRIPT }}
</script>

</body>
</html>

使うときに不要な要素は減らす。
{{ }}のところは置き換える。

PHPの場合、default_charsetを設定してあれば<meta charset="UTF-8" />は無くても大丈夫。

YUI 2 CSS Toolsはcommon.cssとか作ってその中でimportした方が変更に強い。

Google Analyticsは外部JavaScriptファイルにした方がすっきりするけど、そのためだけにHTTPアクセスを1回増やすのもどうかと思う。
「http://www.google-analytics.com/ga.js#UA-XXXXXXX-X」の形で呼び出せるようにすればいいのに。
(ただし静的なHTMLに埋め込む場合は、変更が発生したときに全部変更するのは大変なので外出ししておいた方がよい。)

jQueryはプラグインをいろいろ使うならマイナーバージョン(1.4とか)まで指定しておいた方が無難。


(2010/11/04 追記)
Google Libraries APIのCDNから読み込むJavaScriptが複数ある場合は、google.load()を使って非同期で読み込んだ方が少し早くなる場合がある。
<!-- 例:jQueryとjQuery UIを非同期で読み込む -->
<script src="//www.google.com/jsapi?key={{ GOOGLE_LOADER_API_KEY }}"></script>
<script>
google.load("jquery", "1");
google.load("jqueryui", "1");
google.setOnLoadCallback(function() {
    $(function() {
        //初期処理
    });
});
</script>

注意点としては、google.load()を使うには先に http://www.google.com/jsapi 読み込む必要がある。これを読み込むコストを考えると、必要なJavaScriptが1つしかないならgoogle.load()を使ってもそれほど効果はないか、逆に遅くなる。


(2011/03/15 追記)
シンプル版も書いておく。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<title>HTML5 Simple Template</title>
<link rel="stylesheet" href="stylesheet.css" />
<style>
/* STYLE */
</style>
</head>
<body>

CONTENT

<script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script src="javascript.js"></script>
<script>
/* JAVASCRIPT */
</script>
</body>
</html>

2009年9月24日木曜日

PHPの mbstringの設定の意味についてのメモ

こんな感じ?
PHP5.3の場合だが、5.2でもそんなに違いはないと思う。(mbstring.http_output_conv_mimetypeくらい?)
実際に使う場合は必要に応じて要調査。

[mbstring]
; language for internal character representation.
; http://php.net/mbstring.language
mbstring.language = [(2010/04/26訂正)Japaneseだとmb_send_mail()でメールの文字コードがjisになる。また、文字コード検出順で"auto"を使う場合にもこの設定が必要]

; internal/script encoding.
; Some encoding cannot work as internal encoding.
; (e.g. SJIS, BIG5, ISO-2022-*)
; http://php.net/mbstring.internal-encoding
mbstring.internal_encoding = [mbstring系関数で使われるデフォルトの文字コード]

; http input encoding.
; http://php.net/mbstring.http-input
mbstring.http_input = [入力データを自動で文字コード変換する場合の変換元の文字コード]

; http output encoding. mb_output_handler must be
; registered as output buffer to function
; http://php.net/mbstring.http-output
mbstring.http_output = [ob_start('mb_output_handler')した場合の変換先の文字コード]

; enable automatic encoding translation according to
; mbstring.internal_encoding setting. Input chars are
; converted to internal encoding by setting this to On.
; Note: Do _not_ use automatic encoding translation for
;       portable libs/applications.
; http://php.net/mbstring.encoding-translation
mbstring.encoding_translation = [入力データを自動で文字コード変換するかどうか]

; automatic encoding detection order.
; auto means
; http://php.net/mbstring.detect-order
mbstring.detect_order = [(2010/04/26訂正)変換元文字コードをautoにした場合 一部の関数での文字コード検出の優先順位]

; substitute_character used when character cannot be converted
; one from another
; http://php.net/mbstring.substitute-character
mbstring.substitute_character = [文字コード変換できなかった文字の代替文字]

; overload(replace) single byte functions by mbstring functions.
; mail(), ereg(), etc are overloaded by mb_send_mail(), mb_ereg(),
; etc. Possible values are 0,1,2,4 or combination of them.
; For example, 7 for overload everything.
; 0: No overload
; 1: Overload mail() function
; 2: Overload str*() functions
; 4: Overload ereg*() functions
; http://php.net/mbstring.func-overload
mbstring.func_overload = [非mbstring系の関数のうちどれをmbstring系の関数で上書きするか]

; enable strict encoding detection.
mbstring.strict_detection = [文字コード変換時に厳密なチェックを行うかどうか]

; This directive specifies the regex pattern of content types for which mb_output_handler()
; is activated.
; Default: mbstring.http_output_conv_mimetype=^(text/|application/xhtml\+xml)
mbstring.http_output_conv_mimetype = [mb_output_handler()関数が呼び出された場合に使うContent-Typeの正規表現パターンらしい]

; Allows to set script encoding. Only affects if PHP is compiled with --enable-zend-multibyte
; Default: ""
;mbstring.script_encoding = [普通は使わない]

参考:
 PHPの文字化けを本気で解決する - ぎじゅっやさん
 セキュリティ専門家でも間違える!文字エンコーディング問題は難しいのか?
 PHP: 実行時設定 - Manual
 PHP: INIファイル の扱いに関する変更 - Manual

2009年4月12日日曜日

Are you ready for PHP 5.3 ?

PHP5.3についてのIBMによる解説記事シリーズ。
冒頭の一文を並べると面白い。


最初の頃は、

第 1 回 2008年 11月 11日
PHP V5.3 は 2008年の終わりまでにリリースされる予定であり、...
第 2 回 2008年 12月 09日
この「PHP V5.3 では何が新しいのか」シリーズの記事では、2008年の末までにリリースされる予定の PHP V5.3 の、...

それが2008年末を過ぎると、
第 3 回 2009年 01月 20日
PHP V5.3 がまもなくリリースされようとしています。...
第 4 回 2009年 01月 27日
PHP V5.3 がまもなくリリースされようとしています。...
第 5 回 2009年 02月 24日
この「PHP V5.3 では何が新しいのか」シリーズでは、まもなくリリースされようとしている PHP V5.3 の、

順調に遅れたという感じか。


ここから本題。

PHP 5.3の注目機能はやはり名前空間とクロージャ。
クロージャは最低限の使用にしないとチームでの開発には支障が出そうだけど。

そして、
非推奨となった項目
PHP V5.3 から、古い関数が正式に非推奨となり、今後の PHP のバージョンでは使用できなくなります。これらの関数を使用すると E_DEPRECATED エラーが出力されます。PHP V5.3 では以下の関数が非推奨となっています。
(中略)
ereg 正規表現関数: この関数の代わりに PCRE 正規表現関数を使うことが推奨されています。PCRE 正規表現関数の方がはるかに高速であり、しかも他の言語やアプリケーションで使われている正規表現と一貫性があるからです。ereg 関数はサポートされなくなるため、PHP を 1 つの正規表現エンジンで標準化することができます。
えええ!!!これは影響がある。
preg系ってUTF-8以外のマルチバイトを完全に扱えるようになったのかな???

2009年3月27日金曜日

PHPの fputcsv()で CSVを出力する

(2011/1/17 追記:まとめ的なものも書いた → floatingdays: PHPで CSVをダウンロードするための参考サイトとサンプルコード)


PHPでCSVを出力するなら、fputcsv()が便利。

$fp = fopen('test.csv', 'w');
fputcsv($fp, array(123, 'abc', '"quoted"', ',,,', 'あああ'));
fclose($fp);

↓

123,abc,"""quoted""",",,,",あああ

ポイント
  • 必要に応じてダブルクォートで囲ってくれる
  • データにダブルクォートを含む場合、ダブルクォートを2重にしてエスケープしてくれる


デフォルトではカンマ区切りになるが、第3引数で区切り文字を指定できる。

タブ区切り(TSV)にする場合の例
$fp = fopen('test.csv', 'w');
fputcsv($fp, array(123, 'abc', '"quoted"', ',,,', 'あああ'), "\t");
fclose($fp);


難点は文字コードの指定ができないこと。
CSVをExcelで普通に開く場合、マルチバイト文字がShift_JISでないと文字化けしてしまう。
事前にSJISに変換しておくしかないのか。



2009年2月11日水曜日

PHPの文字コード検出順の設定

メモ。

UTF-8はSJIS(SJIS-WIN)より前に。そうしないとUTF-8のサイトで文字化けする。

SJIS(SJIS-WIN)はEUC-JPより前に。そうしないとSJISのサイトで半角カナが(それ以外も?)文字化けする。(EUC-JPを使う場合はこれでは駄目かも?)

ASCIIは一番前で構わない。

JISはメールでしか使わないので、無しでもよいかも。その場合、メールで扱うときは明示的に指定する。



すると、例えばこんな感じで。

ASCII,UTF-8,SJIS-WIN,SJIS,EUC-JP,JIS

2008年12月22日月曜日

MySQLで Database (Schema)を作成するDDL

よく忘れるのでメモメモ。
文字コードがデフォルトでよい場合は指定不要。

CREATE DATABASE データベース名 CHARACTER SET utf8;

2008年10月30日木曜日

PCで携帯向けのWeb開発をするためのメモ






とりあえずメモ書き。整理できると良い。


モバイル検索結果をPCで見る

  • Googleモバイル検索
    • Googleモバイル検索
    • 携帯でも同じURL(www.google.co.jp/m OR google.jp/m)で使える
    • URL例: http://www.google.co.jp/m?q=[URLエンコードした検索文字列]
    • URLエンコーディングはたぶんUTF-8で
  • Yahoo!モバイル
    • Yahoo!モバイル検索の結果をキャリア別に表示
    • 検索結果から、そのまま携帯ブラウザのシミュレータでの閲覧ができる


シミュレーター(× シュミレーター)


PCサイトを携帯用に変換するサービス


その他


参考資料

2008年10月25日土曜日

Googleモバイル検索に携帯サイトとして表示される方法

結果として、下記のようなサイトでGoogleモバイル検索に携帯サイトとしてインデックスされた。
ただし、これが最良の方法とは思えない。これ以外の方法もたくさんあるだろう。


文字コード
Shift_JISでOK。


マークアップ(HTML)
DOCTYPE無しのCHTMLでOK。
XHTMLは試してないが、DOCTYPEは気を付けた方が良さそう。
(GoogleはXHTML Basicを推奨しているが、他のフォーマットでも問題無し?
 参考:携帯サイトのDOCTYPEについてもう一度考えてみる。 携帯ホームページを作ろう! -ちょっと詳しいモバイルサイトの作り方-)


MIME-Type
CHTMLなら text/htmlでOK。
XHTMLは試してないが、application/xhtml+xmlらしい。


URL振り分け
無し。PCと携帯で同じURLで、表示内容は別にしている。
ただしNokiaは対応(携帯向け表示)している場合も対応していない(PC向け表示)場合もあり。(両方ともインデックスされた。)
本来はPCと携帯は別のURLにすべき?


IP制限(携帯用IPのみ閲覧を許す)
していない。


半角カタカナ
英数字とカタカナはほとんど半角に変換して表示している。


絵文字
使っていない。


ページのファイルサイズ
携帯向けに小さくしてくる。


Sitemap
Googleにモバイルサイトマップを登録した場合も、登録しない場合(ただしPC用サイトマップは登録済み)も、両方インデックスされた。


Googleモバイル検索にインデックスされているかどうかは、携帯版Google検索で"site:example.com"で検索すれば分かる。
Yahoo!モバイル検索はYahoo!モバイルで同様に調べられる。

Yahoo!モバイル検索ではau向けは問題ないが、docomoとSoftBank向けで、インデックスされていたりされていなかったり...。


参考(今後改善するための参考として):
 携帯サイトのDOCTYPEについてもう一度考えてみる。 携帯ホームページを作ろう! -ちょっと詳しいモバイルサイトの作り方-
 モバイル検索エンジンのインデックス対策 - 携帯SEO・ケータイ検索エンジン最適化 - ププアブログ
 Googleモバイル(googlebot-mobile)にインデックスさせる - 携帯検索エンジンSEO - ププアブログ

2008年1月27日日曜日

PHPでファイルを zipするためのサンプルと 4つの注意点

PHPでzipするサンプルと注意点。


注意点

  • (Windowsの場合) php.iniの、extension=php_zip.dllのコメントアウトを外しておかないと、「Fatal error: Class 'ZipArchive' not found」が出る。
  • zipのopen時に、
    • ZIPARCHIVE::CREATEを指定すると、指定したパスにまだzipが無い場合は新規作成し、既にzipがある場合はそのzipに各ファイルが追加される。
    • ZIPARCHIVE::OVERWRITEを指定すると、常にzipを新規作成する。既存のzipがある場合は、zip自体を上書きする。(2009/03/23訂正:仕様が変わり、既存のZIPが無い場合にOVERWRITEを指定するとopen()に失敗するようになった。対策は下記サンプルコードを参照。)
  • zipを展開するクライアントがWindowsの場合、ファイル名はSJISにしないと文字化けする。
  • zipをダウンロードさせる場合、Content-typeに既知の値("application/zip"や"application/x-zip-compressed")を指定すると、IEでダウンロードするとzipを展開できない。なのでContent-typeには存在しない適当な値を指定する。(未知のContent-typeの場合は拡張子からzipであることを推測しているようだ。)
    ただし7-zipでなら開けたので、正しいContent-typeでもzip自体は正しくできているようだ。


サンプルコード
<?php
$zipPath = './test.zip';

//zipをopenする
$zip = new ZipArchive();
$rtn = $zip->open('./test.zip', ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE);
if ($rtn !== true) {
 exit('zip作成に失敗! エラーコード=' . $rtn);
}

//ファイルをzipに追加する
$zip->addFile('./zip.php', 'zip.php'); //ファイルのパスとzip後のファイル名
$zip->addFile('./zip.php', mb_convert_encoding('このPHPのソースファイル.php', 'SJIS'));

//テキストファイルを動的にzipに追加する
$text = " 動的に書いた \n テキストファイル ";
$zip->addFromString('dynamic.txt', $text); //ファイルのパスとその内容

//zipをcloseする
$zip->close();

//zipファイルを出力する
header('Content-type: application/x-zip-dummy-content-type'); //存在しないtypeにする
$zipName = mb_convert_encoding('zipのテスト.zip', 'SJIS');
header('Content-Disposition: attachment; filename=' . $zipName);
echo file_get_contents($zipPath);

(更新履歴)
2009/03/23 openの第2引数を変更


参考:
 PHP: Zip - Manual
 codeなにがし::ブラウザ上でローカルファイルをZIP圧縮 (文字コードについての参考)
 ZIP (ファイルフォーマット) - Wikipedia (Content-typeについての参考。使えなかったが。)

Windowsのコマンドプロンプトの文字コードを変える方法

Windowsのコマンドプロンプトでエラーメッセージ等が文字化けすることの原因は文字コードの設定。
コマンドプロンプトのデフォルトの文字コードはShift_JISになっている。
ApacheやSubversionなどUTF-8で出力するアプリをコマンドプロンプトから使うと、メッセージが文字化けすることがある。

下記のようにすれば文字コード設定を変えられる。

chcp 65001

"65001"はUTF-8のコードページ。Shift_JISの場合は"932"。
他の文字コードについては下記リンクのリンク先から調べられる。


参考: UTF-8とコマンドプロンプトとMySQLモニタ | Sarabande

2008/07/08追記:コマンドプロンプトでUTF-8の文字を表示する。 - サンプルコードによる Perl 入門ではフォントの変更についても触れているので参考になるかも。

ブログ アーカイブ

tags