gusmachine,haskellで多バイト文字列を扱ってはまり、haskelliansに助けられるのこと。

Haskellのunicodeではまり、twitterでHaskell使いなみなさんに助けてもらいました。これはその記録です。 第一義的結果 1. utf-8ならByteString。それからencoding変換にはText 2. ByteString, Text, Stringとで操作を共通にするためのあれこれ。OverloadedStringsは非常に助かる。 続きを読む
1
Yu SUGAWARA @gusmachine

haskell fastcgi + lighttpdを試してみている。utf-8の文章をreadFile してそれを output すると非ASCII文字列がutf-16の下8ビットだけで出るのはどこが悪いんだろう。

2011-03-12 22:57:42
Yu SUGAWARA @gusmachine

output "おはよーおはよー" が Jo[88][FC]Jo[88][FC] になるな。fastcgi moduleかあるいはlighttpdかどちらかが悪いな。

2011-03-12 23:00:51
Jun Mukai @jmuk

@gusmachine HaskellのCharはUnicodeだけどそれを想定していない箇所があるということでしょう。昔はGHCのputStrLnなんかもソレで、CharをCのcharにキャストしたりしてた。今は知りませんが。

2011-03-12 23:00:43
Yu SUGAWARA @gusmachine

@jmuk putStrLnベースのテキストツールをcgi化しようとしているところなのでputStrLnは今は大丈夫のはずです。fastcgiモジュールを調べてみます。

2011-03-12 23:03:11
Jun Mukai @jmuk

@gusmachine はい。readFileが出来ているということは普通のコアシステムはUTF-8で万全て意味だと思います。個人的な感覚ではlighttpdよりfastcgiの方がくさいです。

2011-03-12 23:06:05
Yu SUGAWARA @gusmachine

ところで ghciで "おはよーおはよー" が "\12362\12399\12424\12540\12362\12399\12424\12540"と出力されるのは想定外だった。(putStrじゃなくてshow). バックスラッシュの後は10進。

2011-03-12 23:10:33
Yu SUGAWARA @gusmachine

@jmuk 元は誤読しないutf-8だしこっちのほうがよさそうですね。

2011-03-12 23:46:54
Jun Mukai @jmuk

@gusmachine ところでStringで頑張るよりData.ByteStringを使った方が楽じゃない? まあ何をしたいかによるけど: http://bit.ly/eQ05nT

2011-03-12 23:42:10
Yu SUGAWARA @gusmachine

haskell bytestringで utf-8の "こんにちは、世界" を用意する方法がわからない... Stringはunicode化しちゃうし.

2011-03-13 07:15:13
Jun Mukai @jmuk

@gusmachine Data.ByteString.Char8のpack/unpackが使えたような記憶があるんですが、違いました?

2011-03-13 09:38:29
Jun Mukai @jmuk

@jmuk @gusmachine ていうかByteStringにもFIleIOがあるので、そちらを使ってStringは使わないのが勝ちパターンな希ガス。ライブラリの都合でうまくいかないのだとすると残念な話ですが。

2011-03-13 09:41:08
Yu SUGAWARA @gusmachine

@jmuk はじめにテストとして utf-8のByteString literalをつくろうとして失敗しただけです。packだとChar /= Word8で無理。ByteString.readFileで目的は果たせましたが。

2011-03-13 10:08:03
Jun Mukai @jmuk

@gusmachine ああほんとだ。そういえばむかし、Char<->UTF-8の変換を書いたような記憶があるなぁ。

2011-03-13 10:12:49
Yu SUGAWARA @gusmachine

@jmuk 当面問題ないけどByteString utf8のサンプル/テストが書きにくいのは微妙ですね。

2011-03-13 10:16:39
Yu SUGAWARA @gusmachine

http://j.mp/g34Gmj > The output is assumed to be text/html, encoded using ISO-8859-1. なるほど

2011-03-13 07:21:56
Yu SUGAWARA @gusmachine

setHeader encoding=utf-8と Stringではうまくいかなかった。 outputFPSを試してダメならfastcgiはジャンクだな.

2011-03-13 07:26:46
Yu SUGAWARA @gusmachine

outputFPSでうまくいったので継続。

2011-03-13 07:44:03
Yu SUGAWARA @gusmachine

@ikegami__ ありがとうございます。見てみます。

2011-03-13 10:17:30
Ikegami Daisuke @ikegami__

readfile はよけいだった、まあいいや

2011-03-13 10:20:33
Yu SUGAWARA @gusmachine

StringをTextに全体的に書き換えるのはかなりめんどうだな。あるいは自分のコードがその書き換えに耐性が有るように書かれていないだけなのか。ちなみに新しいコードは(Monoid s, IsString s) を使って書いてみている。

2011-03-13 15:32:28
Yu SUGAWARA @gusmachine

だめだ。isPrefixOf とか fromString とかいちいち書くのが面倒すぎる。あるいは自前型クラスを書くのが正解かもしれないけど気が進まない。 「この程度の実装にわざわざ自前型クラス作ってるの(顔」という未来の自分の声が聞こえる。

2011-03-13 15:46:07