忍者ブログ
全くIT系ではない製造業の社員がイントラ上でColdFusionと格闘。システム構築を外部委託するとき「できればColdFusionでお願いします」と頼むのだが・・・・
[17] [18] [19] [20] [21] [22]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

かなりハマりました。
IISで動いているaspってほとんどShift_JIS環境。
イントラのトップページがそうなのですが、そこに半年ほど前RSSを置きました。新着をDBからゴリゴリとxmlファイルにする感じで、そこにはColdFusionが載っていないので苦手なASPで作りました。
コードはShift_JIS。

UTF-8ベースのColdFusion側でそのxmlを読むときは、
<cfhttp method = "Get" url="http://hon/top/top_r.xml" charset="Shift_JIS" result="XMLFileText"/>
といった感じで、キャラセットを指定してあげればOKで、特別問題なかったのですが、先日「RSSをUTF-8にしてほしい」との要望が。

ASPでUTF-8のファイルってどうやって作るんだ? とすぐ思ったのですが、とりあえず「わかりました」と答えてしまったわけです。

あんまりASPの参考書は持っていないので、とりあえずいろいろググると、
 Fsystem.CreateTextFile(File_name,true,true) とすればよさげ。
ふんふん♪とやってみたのですが、
UTF-8ではなく、ただのunicodeみたい♪~( ̄ε ̄;)←違いがわからない男

さらにググる。

おぉ、これか?http://makoto3.cocolog-nifty.com/makoto3/2006/03/asputf8_7348.html
<%@ LANGUAGE=JScript CodePage=65001 %>
なにやら、
<cfprocessingdirective pageencoding="UTF-8">
とおなじかほりが。

・・・・・しかしハズレ。

さらにググる。

( ̄~ ̄;)ウーン・・・・みんなゴリゴリ変換かけてる模様。ちょっとなぁ・・・・

ググるのはやめて、SI屋さんたちにSkypeで聴き回る。(といっても3人ほど)
みんな、「やったことないですねぇ・・・・」と、つれない返事。「ちょっとしらべてみますよ」などと社交辞令的な返事(いやいや、ご好意ですね)。

忘れかけていた頃、メールが一通。

=======================================================
先ほどご連絡あった件ですが、個人的興味からちょっと調べてみました。


ADODB.StreamがサーバでCreateObjectできる事が条件ですが、
こんな感じでいけそうな気がします。

' ADODB.Stream保持用
Dim stream As Object
 
Set stream = CreateObject("ADODB.Stream")

'ストリームを作成
stream.Open
stream.Type = 2 ' 2 = adTypeText
stream.Charset = "UTF-8"

'文字列を格納
stream.WriteText "こんにちは。小西です。"

' テスト的にファイル書き出し
' ※ 環境、用途によって変更して下さい。
stream.SaveToFile "C:\test.txt", 2 ' 2 = adTypeText

'ストリームの破棄
stream.Close
Set stream = Nothing

以上、独り言でした。
=====================================================

おぉ、コニちゃん。ありがとう。
小さくテストしてみたら、いけそうです。

ゴリゴリ、ゴリゴリ・・・・・

でけた!UTF-8でxmlファイルが書けました。
秀丸で読むと[UTF-8]ってなってます。

ところが、今度はColdFusion側で読んだとき・・・・・
<cfhttp method = "Get" url="http://honw01/top/top_r.xml" charset="UTF-8" result="XMLFileText"/>
<cfset honxmlDoc = XmlParse(XMLFileText.Filecontent)>
とすると、
The web site you are accessing has experienced an unexpected error.
Please contact the website administrator.

The following information is meant for the website developer for debugging purposes.
Error Occurred While Processing Request

XML ドキュメントを Parsing する際に、エラーが発生しました。

Content is not allowed in prolog.
 

(T▽T;)

いろいろ調べながら、エラーがでたり出なかったりするので変だなぁ・・・・と。
どうやら、できたxmlを秀丸で上書き保存するとエラーが出なくなる。

こういうときは、スリム化デバッグです。
怪しいところを残しながら、どんどん生成するxmlを小さくしてテスト。
極小のPDCAサイクルを廻すわけです。
日本語がよくない?改行コードがよくない?<item>なくしちゃえ!・・・・


結局、たった1行のxmlにまで縮小してもエラー・・・・

でも秀丸で上書き保存するだけでエラーが出なくなる。

1行まで小さくしたので、ここで気づきました。
上書き保存すると、ファイルサイズが 183バイト → 180バイト と3バイトだけ減ってることに。

この3バイトの差は何なんだ?ということで、今度はファイルダンプツールを物色。
ほどなく入手し、ダンプを見る。

すると、ダメな場合のxmlには、ファイルの最初に "EF BB BF"の3バイトがついている。
なんじゃこりゃ?

ダメ元で"EF BB BF"をググる。
ありゃりゃ、いっぱい出てくるね。なになに、ボム?BOM(ByteOrderMark)
http://sakaguch.com/utf1.html
この辺を参考に。

UTF-8(ボムあり) と UTF-8N(ボムなし) の2種類があるそうな。
どうやら、ColdFusionでXmlParseするときは、ボム無しじゃなきゃダメらしい。

さて、じゃぁどうやってボム無しにするか・・・・・asp側じゃわからんな。

(。-`ω´-)ンー・・・とColdFusionの文字列関数を眺める。
RemoveCharsかな?3文字切るんじゃダメだった。じゃ、1文字。

おぉ(゜ロ゜)  できた!

<cfhttp method = "Get" url="http://hon/top/top_r.xml" charset="UTF-8" result="XMLFileText"/>
<cfset honxmlDoc = XmlParse(RemoveChars(XMLFileText.Filecontent,1,1))>


約6時間のハマリでした。
PR
部門のwebページなんかは、結構イントラブログがはまったりするわけですが、ある時<$MT$>タグと格闘しながら「あっ!」と気がつきました。


生成されるページの拡張子は指定できるわけですから、出力ファイル名の拡張子を.cfmにしてしまえばいいわけですよ。
すると、使い慣れたcfタグが使えるように!

設定>公開 の「アーカイブの拡張子」も忘れずに変更しましょう。
<cfchart>はグラフを書いてくれるタグ。フォーマットをFlashにすると、にゅ~っと延びるグラフとかが勝手にできたりするので、素人受けがしますね。(´∀`)

ところがこいつの見た目をいろいろいじろうとすると、結構大変。エクセルのようにはなかなかいかないです。
webCharts3D 5.0を使いこなせると怖いもの無しですが、それはまた今度。
chart_bake 結構最初にすぐハマるのは、pieチャートのラベル表示です。
<cfchart format="jpg">
<cfchartseries type="pie" datalabelstyle="pattern" >
<cfchartdata item="北海道" value="501">
<cfchartdata item="沖縄" value="213">
</cfchartseries>
</cfchart>
こいつは右のように化けます。
ちなみに文字コードは全部UTF-8でやってます。

化けるのはpieチャートの時だけです。barやlineの時は問題なく表示されるのですが・・・・・

これは数ヶ月悩んでいて、バグなんだろうとあきらめていたのですが、webCharts3Dでいろいろいじっていたら解決法を発見しました。

<ColdFusionをインストールしたルート>/charting/styles
フォルダに、チャートのデフォルト設定なんかがxmlで保存されています。
default.xml
default_pie.xml
beige.xml
beige_pie.xml


この中の、default_pie.xmlにColdFusionAdministratorでマッピングされている日本語フォントを一言加えると解決します。

<?xml version="1.0" encoding="UTF-8"?>
<pieChart depth="Double" style="Solid" angle="340" is3D="false">
<dataLabels style="Value" placement="Outside" font="MS UI Gothic-12"/>
<legend>
<decoration style="None"/>
</legend>
<elements place="Default" drawOutline="false">
<series index="0">
<paint color="#E48701"/>
</series>
<series index="1">
<paint color="#A5BC4E"/>
</series>
       ・
       ・
       ・
</elements>
<popup background="#C8FFFFFF" foreground="#333333"/>
パイチャート 文字化けなし <paint paint="Plain"/>
<insets left="5" top="5" right="5" bottom="5"/>
</pieChart>

本来は各dataLabelのstyleごとに書かないとダメだと思うのですが、なぜかstyle="Value"に付け加えると、全部のdataLabelstyleに適用されるようです。

表示するとこんな感じですね。

<cfdocument>はwebページをそのまんまPDFやFlashPaperにできてしまうColdFusionMX7から(確か)のタグ。

<cfdocument format="pdf">
<h1>あはは!</h1>
<p>こんにちは世界!</p>
</cfdocument>

とするだけでOK。

ことのきかなり悩んだのはスタイルシート。
日本語版だとデフォルトは明朝なんですが、スタイルシートでフォントファミリをゴシックにしても変わらない。
ボーダーや色の指定も反映されない・・・
CFAdministratorのフォントで登録したりいろいろしたんですが、結局スタイルシートそのものを<cfdocument>内に入れなければいけないと判明しました。

つまり、<link href="hogehoge.css">などの外部リンクだと全部無視されてしまいます。

<cfdocument format="flashpaper" pagetype="custom" pageheight="29.7" pagewidth="42.0" unit="cm" scale="50" margintop="1" marginbottom="1" >

<style type="text/css">
<!--
body {font:"MS UI Gothic";}
TABLE {
/*font-size: 12px;*/
border:1px solid black;
}
h1 {
font-size:large;
margin:5px;padding:0;
}
.footer {
font-size:medium;
margin:0;padding:0;
}

TD {vertical-align:text-top;}
.solidline {border-bottom:1px solid black;border-right:1px solid black;}
.dottedline {border-bottom:1px dashed black;border-right:1px solid black;}
.doubleline {border-bottom:3px double;border-right:1px solid black;}

-->
</style>
<cfoutput>
<h1>建築本部重要顧客(ランクの定義と用途別分類)-- 最終更新日時:#DateFormat(LASTUPD.LASTUPDATE,"yyyy/mm/dd")# #TimeFormat(lastupd.lastupdate,"HH:MM")#</h1>
</cfdocument>

と、こんな感じでスタイルシートをcfdocumentに含めてあげるとOKです。

ちなみに、この場合A3横のフォーマットになります。scaleを自動調整して決めたページ数に自動縮小とかしてくれるといいんですがね。

ライセンスはスタンダード版で5本
kenw01号:Windows2003Server + IIS + CFMX7.0.1
kenw02号:Windows2000Server + IIS + CFMX7.0.1 こいつはややこしくて、JRun4も載って同時稼働
kenw03号:Windows2000Server + IIS + CF5.0 こやつは取り残されてる
tip号:Windows2003Server + IIS + CFMX7.0.1 一番早い
kyuw号:Linux(FedoraCore2.6.11-1.1369FC4) + Apache2.0 + CFMX7.0.1

DBはOracle9iがほとんど。たまにAccessとSQLServer。kyuw号にはMySQLが載ってる。
ブログ内検索
プロフィール
HN:
CFIF
性別:
男性
自己紹介:
もっと日本でもColdFusionが広まって欲しいです。

情報通信を生業としない企業の、システム系でもない普通の社員なので、 ColdFusionは独学。参考書が少ないのがツライです・・・・なんだかんだ、ColdFusion4.xのシリウス時代から7年くらいのおつきあい?リンコムNextのソースが教科書かも。

外注するときはよく「できればColdFusionで・・・・」とお願いするのですが、ほとんどの場合「えっ!?」と驚かれてしまい、「SEのアサインが・・・」などと営業さんが困ってしまうことが多くて悲しいです。
ちょっとしたものなら自分でシステム構築しちゃいますが、一人でやるには時間が足りませんね・・・

FlashRemotingとかもやりますが、Flexには手を出してません。
と、最初の頃書きましたが、ついにFlexに手を出しました。Flex1.5はイマイチわかりませんでしたが、Flex2は別物ですね。これで6万円でイインデスカ?
そしてFlex2とColdFusionの組み合わせなら無敵な気がしますよ。ほんとに。
最新トラックバック
カレンダー
03 2025/04 05
S M T W T F S
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
なかのひと
忍者ブログ [PR]