Используя Haskell для вывода UTF-8-encoded ByteString

Я иду не в своем уме попытка просто произвести UTF-8-encoded данные к консоли.

Мне удалось выполнить это использование String, но теперь я хотел бы сделать то же с ByteString. Существует ли хороший и быстрый способ сделать это?

Это - то, что я имею до сих пор, и это не работает:

import Prelude hiding (putStr)
import Data.ByteString.Char8 (putStr, pack)

main :: IO ()
main = putStr $ pack "čušpajž日本語"

Это распечатывает uapaj~�,�, тьфу.

Я хотел бы ответ за новейший GHC 6.12.1 лучших, хотя я хотел бы услышать ответы для предыдущих версий также.

Спасибо!

Обновление: Просто чтение и вывод той же UTF-8-encoded строки текста, кажется, работают правильно. (Используя Data.ByteString.Char8, Я просто делаю a putStr =<< getLine.), Но упакованные значения из .hs файла, как в вышеупомянутом примере, отказываются производить правильно... Я должен делать что-то не так?

25
задан Don Stewart 18 April 2011 в 18:31
поделиться

3 ответа

utf8-string поддерживает BYTESTRIONS.

import Prelude hiding (putStr)
import Data.ByteString.Char8 (putStr)
import Data.ByteString.UTF8 (fromString)

main :: IO ()
main = putStr $ fromString "čušpajž日本語"
26
ответ дан 28 November 2019 в 21:03
поделиться

Моя компания (стартап) довольно слабая и позволяет мне выпускать свой код под любой лицензией, которую я хочу.
Мне всегда нравилась Публичная лицензия WTF :

// DO WHAT THE F*** YOU WANT TO PUBLIC LICENSE  
//                   Version 2, December 2004  
//  
// Copyright (C) [name]
// Everyone is permitted to copy and distribute verbatim or modified
// copies of this license document, and changing it is allowed as long
// as the name is changed.
//
//      DO WHAT THE F*** YOU WANT TO PUBLIC LICENSE
//   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
//
//  0. You just DO WHAT THE F*** YOU WANT TO.
-121--2152777-

Вот что я делаю:

        ListBoxItem listBoxItem = null;
        foreach (FontFamily fontFamily in Fonts.SystemFontFamilies)
        {
            listBoxItem = new ListBoxItem();
            listBoxItem.Content = fontFamily;
            listBoxItem.FontFamily=fontFamily; // Shows Font Text in the Font
            FontFamilyListBox.Items.Add(listBoxItem);
        }
-121--4501802-

Это известная ошибка ghc с пометкой «wontfix».

-2
ответ дан 28 November 2019 в 21:03
поделиться

Вы можете использовать следующую стратегию Divide-and-Conquer:

Создайте функцию h (), которая может назначить каждую запись в входном файле номером. Для записи R2, который будет отсортирован за записью R1, он должен вернуть большее количество для R2, ​​чем для R1. Используйте эту функцию для раздела всех записей в отдельные файлы, которые будут вписаны в память, поэтому вы можете отсортировать их. Как только вы сделали, вы можете просто объединить отсортированные файлы, чтобы получить один большой отсортированный файл.

Предположим, у вас есть этот входной файл, где каждая строка представляет собой запись

Alan Smith
Jon Doe
Bill Murray
Johnny Cash

позволяет просто построить H (), чтобы он использовал первую букву в записи, поэтому вы можете получить до 26 файлов, но в этом примере вы просто получите 3:

<file1>
Alan Smith

<file2>
Bill Murray

<file10>
Jon Doe
Johnny Cash

Теперь вы можете отсортировать каждый отдельный файл. Что бы поменять "Джон Доу" и "Джонни наличными" в . Теперь, если вы просто объединяете 3 файла, у вас будет отсортированная версия ввода.

Обратите внимание, что вы разделяете сначала и только побеждают (сортируете) позже. Тем не менее, вы обязательно выполните разбиение таким образом, что полученные детали, которые вам нужны для сортировки, не совпадают, что сделает слияние результата гораздо проще.

Способ, посредством которого вы реализуете функцию разделения H (), очень сильно зависит от характера ваших входных данных. Как только у вас есть эта часть, остальное должно быть ветер.

-121--2058206-

BYTESTRIONS - это строки байтов. Когда они выводятся, они будут усечены до 8 битов, поскольку он описывает в документации для data.bytestring.Car8 . Вам нужно будет явно преобразовать их в UTF8 - через пакет UTF8-string на Hackage, который содержит поддержку ByteStrics.


Однако по состоянию на 2011 год вы должны использовать пакет Text , для быстрой упаковывающего вывода Unicode. GHC Усечение вывода символов Unicode

Ваш пример становится намного проще:

{-# LANGUAGE OverloadedStrings #-}

import qualified Data.Text    as T
import qualified Data.Text.IO as T

main = T.putStrLn "čušpajž日本語"

вроде так:

$ runhaskell A.hs
čušpajž日本語
21
ответ дан 28 November 2019 в 21:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: