気ままな開発メモ
日々の開発で気付いた事などを備忘録的に綴ってます。

MySQLとUTF-8での「~」の文字化けにハマる

8 月 20th 2009 in Flex, MySQL, PHP

「~」と「〜」 とUTF-8、そしてEUC-JP…

とある案件で、フロント部とCMSを別々に開発していました。
自分はフロント部を担当していて、FlexとPHPを使い、SWFとHTMLによるユーザインターフェースを制作していましたが、CMS側で登録したデータをSWFへ持ってくると、「~」が化けてしまう・・・。

DBの文字コードがUTF-8で、訳あってPHPではEUC-JPを使用(この時点でどうかと思いますが・・・)していて、DBからはMySQLの文字コード変換でデータを引っ張っていました。

この時点で、すでに化けてる(「?」になってしまっている)。

これは、MySQLが文字コードの変換に失敗したときに出る現象。

調べてみると・・・

こちらのサイト様を参考にさせていただきました。

EUCへの変換時に問題があったことが発覚。

MySQLによる文字コード変換をスルーすることで、文字化け自体は回避。

そもそも、サイトの文字コードとシステム文字コード、そしてDBの文字コードが統一されていなかった時点で問題ですね(汗)

けっこう根深い・・・

無事、PHPまでは原型をとどめたまま、データを取得。しかし、今度はそのデータをSWFで表示した際に問題が・・・。

「□」のような表示になってしまってます。

う~む、どうしたもんだろう・・・。

先ほどのサイト様を参考にさせていただきながら、さらに調べる。

「~」は「FULLWIDTH TILDE(全角チルダ)」

「〜」は「WAVE DASH(波ダッシュ)」

で、なにやらWindowsのこれらの文字の取り扱いが怪しい・・・。

とりあえずPHP側で以下のような置き換えをおこない、SWFでも表示されるようになりました・・・。

$ptn = pack("H*", "E3809C");
$rep = pack("H*", "EFBD9E");
// 置き換え!
$result = str_replace($ptn, $rep, $result);

が、どうしてこんなことになってるのか、もっと調べる必要がありそうです。
環境によっては違った結果になるのかも・・・。

参考URL

チルダ-Wikipedia

波ダッシュ-Wikipedia




required



required - won't be displayed


Your Comment:

Flexで印刷

FlexPrintJobを使う

SWF上の表示を印刷したいっていうことはよくあります。
PDFを作成する・・・ってとこまで大げさではなく、しかしブラウザのプリント機能では、余分なものまで全部入ってしまう・・・。

そんなとき、手軽に印刷内容の調整をおこなえるのがmx.printing.FlexPrintJobクラスです。
MXMLベースで構成されたSWFであれば、容易に印刷が可能です。

ポイント

FlexPrintJobクラスでは、IUIComponentオブジェクトを受け取り、描画します。

つまり、MXML上のビジュアルコンポーネントはなんでも可。もちろん、子を持ったコンテナも大丈夫です。

分かりやすいのは、CanvasやBoxなどのコンテナを、プリント用に配置し、その下に印刷したい対象を配置していく方法です。

このとき注意したいのが、背景色です。

特定のコンポーネントを基準に描画をおこないますので、コンポーネント同士の隙間に例の緑がかったFlex特有の背景が出てしまうことがあります。
プリント用に設置したコンテナに適当な背景色(白など)をあてておくことでこの問題を回避できます。

コード

var pj:FlexPrintJob = new FlexPrintJob();
if ( pj.start() ) {
pj.addObject( printContainer, FlexPrintJobScaleType.SHOW_ALL );
pj.send();
}

まずはFlexPrintJobのオブジェクトを生成してstart()メソッドを呼び出します。
このときエラーがあればFALSEが返ってくるので、戻り値をチェックします。

次に、印刷対象の指定をするために、addObject()メソッドを呼びます。

第一引数のprintContainerは、印刷用に用意したコンテナです。

第二引数は省略可(初期値はFlexPrintJobScaleType.MATCH_WIDTH)で、印刷時にオブジェクトをどう収めるかを指定します。

あとはsend()メソッドを呼んで、印刷開始。

プラスα

印刷対象に透過やエフェクトがなければ、printAsBitmapプロパティをfalseに設定することで、高品質のベクター形式で印刷できます。

参考URL

FlexPrintJob - ActionScript3.0 リファレンス

Flexで印刷Previous Entry

Perlの魅力

Perlとの出会い

僕がPerlと初めて出会ったのは二十頃のこと。

そもそも自分のPCを持ったのが遅く、それまでは完全なアナログ人間でした。

当然、プログラミングなんて、まったくできなかったわけです。

学生時代にちょこっとCをかじったくらいで、本格的に何かを作ったりしはじめたのは、この頃Perlと出会ってから。

で、今日はそんなPerlの魅力について、ダラダラと書きたいと思います。

手軽さ

Perlというと、どうしてもCGIのイメージが強いのかもしれません。

確かに自分も最初は掲示板やブログのようなものを自作してました。

が、最近はそうではない用途で使うことが多いです。

ちょっとした処理、例えば巨大なログファイルから目的の行だけを抽出するとか、エクセルで届いた(雑然とした)データから、SQL文を作ったりとか。

とにかく、手作業でやるにはちょっと面倒くさいことを、極めて簡単にこなせるのがPerlのいいところ。

で、仕事柄Linux系のOSで作業することも多く、そんなときにはこの手軽さが助かってます。

型?

JavaやC系など、型に厳しい言語をやってきた人には、Perlなどのゆるさがどうにも納得できないでしょう。

自分も型は嫌いではありません。むしろ、大規模なプログラムを整然と書くためには必須と思います。

ですが、だからといってPerlが劣っているとも思ってはいません。

簡単なことは簡単に、そして複雑なことも(こなそうと思えば)こなせるのがPerlですから。

使う側の目的に応じて帯にも襷にもなるのがPerlではないでしょか。

オブジェクト指向

Perlでもオブジェクト指向のコーディングができます。

Perlはソースが見ずらいというイメージがあるかもしれませんが、それは一時期、フリーのCGIなどで1ファイルになんでもかんでも詰め込むようなコーディングが多く見受けられたせいではないでしょうか。

適切にパッケージを切り分け、オブジェクト化することで、いくらでもすっきりとした見通しのいい構成になります。

とはいえ、Perlは縛りのない言語です。
自由度の高さはときに裏目にでることもあるでしょう。

ちょっとしたサポートに

この仕事をしていると、様々な環境に出会います。

恐ろしく古いOSやソフトウェアに出くわすことも稀ではありません。

あれもダメ、これもダメ…となったとき、意外にPerlが解決してくれることがあります。

困ったとき、CPANを眺めていると、たいてい逃げ道があったり。

メインとなる処理を他の言語で制作していても、サブシステムにPerlが動いているということはよくあります。

選択肢の一つとしてPerlがあることは大きな武器かもしれません。

自由度と遊び心

Perlでは、1つの目的を達成するための表現方法は1つではありません。

最低限の作法はありますが、好みによって色んな書き方ができます。
そして、そこには遊び心もあると思います。

Perl詩や、ワンライナーなどはもはや芸術です。
実用性云々を抜きにした楽しみ方ができるのもPerlの魅力かな、と。

初めて出会った言語がPerlでなければ、自分はいまの仕事に就いていないかもしれません。

とりとめのない文章になってしまいましたが、まぁよしとしましょうw

Perlの魅力Next Entry