2013-04-01から1ヶ月間の記事一覧

Haskellで副作用を起こす(Win32 API によるUTF-16 ⇔ Shift-JIS 変換)

タイトルは釣りです。副作用を起こしているのはHaskellから読んでいるCのライブラリです。 Win32 APIのWideCharToMultiByte、MultiByteToWideCharでUTF-16 ⇔ Shift-JIS 変換を行うには変換結果を格納するバッファを確保してそのポインタを引数に渡し、そのバ…

Foreign.Marshal.Alloc.malloc、Foreign.Storable.peek、pokeを使ってみる。

以前、Win32 APIのMultiByteToWideChar、WideCharToMultiByteを使って UTF-16 ⇔ Shift-JIS 変換するコードを書きましたが、コードの一部にCで記述した部分があります。本当はCを全く使わないでHaskellで書きたかったのですが問題があって出来ませんでした。…

peekCStringでHaskell文字列を作った後はC文字列が書き換えられてもHaskell文字列に影響はない

shiftJisからUtf16、Utf16からshiftJisへの変換では、変換した後にpeekCString、peekCWString関数によってC文字列からHaskell文字列を作ります。C文字列はHaskell文字列返す前にメモリを解放しているのですが、ふとポインタで指している領域が消えると返す値…

Win32 API の WideCharToMultiByteを使って UTF-16 ⇔ Shift-JIS 変換する。

UTF-16 ⇔ Shift-JIS の変換は計算によって行うことが出来ません。 そこで Win32 APIのMultiByteToWideChar、WideCharToMultiByteを使って変換します。 shiftJisToUtf16 Haskell 文字列をWindowsワイド文字列に変換したあとにワイド文字列からpeekCWStringでH…

unfoldr を使って2進数文字列を作る

Data.List に unfoldr という関数が定義されています。どういう使い道なのだろうと思ったのですが、数を2進数文字列に変換できるのではないかと思いやってみました。 Data.Listの例 --A simple use of unfoldr: unfoldr (\b -> if b == 0 then Nothing else …

Haskellで文字列を UTF-32 ⇔UTF-16 変換する。

IBM developerWorks:Unicodeエンコード方式 UTF-8、UTF-16、およびUTF-32間の相互運用方法を参考にUTF-32 ⇔UTF-16変換関数を作ってみました。 Windows COMの内部文字コードはUTF-16を使っています。 一方、HaskellはソースコードはUTF-8で書きますが内部では…

OverloadedStrings を使うと文字列を、Text、ByteString リテラルとして扱ってくれる。

OverloadedStrings 言語拡張を使うとダブルクオートで囲んだ文字列を、Text、ByteString リテラルとして扱ってくれるようになります。あどけない話・Haskellライブラリ入門 (2011年版) {-# LANGUAGE OverloadedStrings #-} module Main where import qualifi…

Haskellで文字列を EUC-JP ⇔Shift_JIS 変換する。

とほほのWWW入門/ 漢字コードについて(各コード間の変換アルゴリズム)を参考にEUC-JPからShift-JISへ変換します。 ASCII このアルゴリズムは全角文字のEUC-JP ⇔Shift_JIS 変換です。ASCIIについては変化ありませんのでそのままリストに追加していきます。 半…

Foldable を使ってみる。

Data.Foldable これはData.Foldableにある例ですが、Tree型のFoldableインスタンスを定義することによってFoldableに定義されている関数を使用できるようになります。 Foldableインスタンスを定義するには、foldMap またはfoldrを定義すれば良いらしい。 imp…