Простая библиотека для создания UTF-8 в Haskell (поскольку Streams больше не компилируется) - PullRequest
2 голосов
/ 30 июля 2009

Я просто хочу прочитать (и, возможно, записать) данные UTF-8. haskell.org все еще рекламирует System.Streams , который не компилируется с недавним ghc:

% runhaskell Setup.lhs configure
Configuring Streams-0.2.1...
runhaskell Setup.lhs build
Preprocessing library Streams-0.2.1...
Building Streams-0.2.1...
[10 of 45] Compiling System.FD        ( System/FD.hs, dist/build/System/FD.o )

System/FD.hs:138:22:
    Couldn't match expected type `GHC.IOBase.FD'
           against inferred type `FD'
    In the first argument of `fdType', namely `fd'
    In a 'do' expression: fd_type <- fdType fd
    In the expression:
        let
          oflags1 = case mode of
                      ReadMode -> ...
                      WriteMode -> ...
                      ReadWriteMode -> ...
                      AppendMode -> ...
          binary_flags | binary = o_BINARY
                       | otherwise = 0
          oflags = oflags1 .|. binary_flags
        in
          do fd <- fdOpen filepath oflags 438
             fd_type <- fdType fd
               when (mode == WriteMode && fd_type == RegularFile)
             $ do fdSetFileSize fd 0
             ....

Аналогичная проблема с потоками 0.1. Я не могу получить более свежие версии, так как официальный сайт не работает:

% wget http://files.pupeno.com/software/streams/Streams-0.1.7.tar.bz2
--2009-07-30 15:36:14--  http://files.pupeno.com/software/streams/Streams-0.1.7.tar.bz2
Resolving files.pupeno.com... failed: Name or service not known.
wget: unable to resolve host address `files.pupeno.com'

Лучшее решение? darcs исходный код ?

Ответы [ 3 ]

4 голосов
/ 30 июля 2009

Используйте utf8-string или более новый текст пакет.

Просмотр списка пакетов по взлому .

1 голос
/ 30 июля 2009

Редактировать:

L. Kolmodin прав: utf8-строка или текст - правильный ответ. Я оставлю свой оригинальный ответ ниже для справки. Похоже, что Google выбрал IConv неправильно. (Эквивалент моей функции-оболочки IConv уже находится в строке utf8 как Codec.Binary.UTF8.String.encodeString.)


Вот то, что я использовал - возможно, я не помню полное решение, поэтому дайте мне знать, если у вас все еще есть проблемы:

Из Hackage установите IConv . К сожалению, Codec.Text.IConv.convert работает с байтами, а не со строками. Я предполагаю, что вы можете читать файлы напрямую как строки байтов, но я написал конвертер, так как HaXml использует обычные строки:

import qualified Data.ByteString.Lazy.Char8 as B
utf8FromLatin1 = B.unpack . convert "LATIN1" "UTF-8" . B.pack

Теперь в Mac OS вы должны скомпилировать с

$ ghc -O2 --make -L/usr/lib -L/opt/local/lib Whatever.hs

Поскольку произошел некоторый конфликт библиотек, я думаю, что с MacPorts я должен явно указать на встроенные библиотеки iconv. Вероятно, есть способ всегда передавать эти флаги -L в ghc, но я еще не посмотрел.

0 голосов
/ 30 июля 2009

Строки utf-8 - это последовательности байтовых символов, поэтому должна быть возможность просто читать и записывать строки как есть. Все первые 127 символов, включая пробелы, должны быть ascii. Конечно, вам понадобятся ваши собственные функции для работы со строками, поскольку они теперь являются многобайтовыми последовательностями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...