haskell-ja > Archives > 2012/05/12

2012/05/12 10:22:47 UTCmaoe
#
/blogsにPOSTで新規作成であれば、/blogs/newの行は削除して/blogs Blogs GET POSTとすればOKです。/blogs/newにPOSTして新規作成したい場合はこのrouteが/blogs/#BlogIdとオーバーラップしているので、/blogs/!new NewBlog POSTとする必要があります。
#
どこにこの機能の説明が書いてあったのかは忘れてしまいましたが、最近yesodのメーリングリストで同じ質問が出ていました。 https://groups.google.com/forum/?fromgroups#!topic/yesodweb/t7zA4W-F3ZI
2012/05/12 11:32:41 UTCshokos
#
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


もしわかる方いたら教えてください。
2012/05/12 14:36:28 UTCkazu
#
二番目のプログラムを Handle が現れるように改造して、
#
hSetEncoding h utf8
#
したりすると、うまくいきませんかね?
2012/05/12 14:43:15 UTCikegami__
#
hSetEncoding から連想したのですが System.IO の hGetEncoding :: Handle -> IO (Maybe TextEncoding) で環境を調査してみることもできます
2012/05/12 16:38:31 UTCshokos
#
どうもありがとうございます!
2012/05/12 16:46:39 UTCshokos
#
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
2012/05/12 17:08:49 UTC[1..100]>>=pen
#
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 です。