#/blogsにPOSTで新規作成であれば、/blogs/newの行は削除して/blogs Blogs GET POSTとすればOKです。/blogs/newにPOSTして新規作成したい場合はこのrouteが/blogs/#BlogIdとオーバーラップしているので、/blogs/!new NewBlog POSTとする必要があります。
##ByteStringを日本語ファイル名で保存したいのですが、うまくいきません。
環境はmac、ghc7.0.4です。
import Data.ByteString as B
main :: IO ()
main = do
body <- B.readFile "hoge.jpg"
B.writeFile "ほげ.jpg" body
上記プログラムを動かすと、ファイル名が文字化けしてしまいます。
また、日本語ファイル名が保存可能なSystem.IO.UTF8を下記方法で使ってみたのですが、保存はできてもファイルの中身は壊れていました。
import System.IO.UTF8 as U
import Data.ByteString.Lazy.Char8 as C
main :: IO ()
main = do
body <- C.readFile "hoge.jpg"
U.writeFile "ほげ.jpg" $ C.unpack body
もしわかる方いたら教えてください。
#二番目のプログラムを Handle が現れるように改造して、
#hSetEncoding h utf8
#したりすると、うまくいきませんかね?
#hSetEncoding から連想したのですが System.IO の hGetEncoding :: Handle -> IO (Maybe TextEncoding) で環境を調査してみることもできます
#どうもありがとうございます!
#hSetEncodingで環境を調査したところ、UTF-8でした。
openFileでHandleを持ってきたのですが、hGetContentsでbyte文字は不正だとエラーが出ました(コンパイルは通ります)
プログラムに間違いがある等ありましたら、ご指摘ください。
import System.IO.UTF8 as U
import System.IO as I
main :: IO ()
main = do
h <- openFile "hoge.jpg" ReadMode
encode <- hGetEncoding h
Prelude.print encode --Just UTF-8
hSetEncoding h utf8
contents <- U.hGetContents h
U.writeFile "ほげ.jpg" contents
hClose h
#yesod の /blogs/new の件の回答ありがとうございます。(今回の問題とは関係ないですが GET POST の書き直しと NewBlogR という名前を NewBlogFormR に書き直しを含めて)config/routes に以下の追加をしてうまくいきました。/blogs GET: 一覧、/blogs POST: 新規作成、/blogs/new GET 新規作成フォーム表示、/blogs/ブログId番号 GET: ブログ内容表示です。
#+/blogs BlogsR GET POST
+/blogs/!new NewBlogFormR GET
+/blogs/#ArticleId BlogR GET
#上の ArticleId は本当は BlogId です。