ByteString предполагает ISO-8859-1?

В документации для Data.ByteString.hGetContents говорится

Как и в случае с hGet, предполагается, что строковое представление в файле соответствует стандарту ISO-8859-1.

Почему он должен что-то «предполагать» о «представлении строки в файле»? Данные вовсе не обязательно являются строками или закодированным текстом. Если бы я хотел иметь дело с закодированным текстом, я бы использовал Data.Text или, возможно, Data.ByteString.Char8. Я думал, что весь смысл ByteString в том, что данные обрабатываются как список 8-битных байтов, а не как текстовые символы. Каково влияние предположения, что это ISO-8859-1?


person Omari Norman    schedule 05.11.2013    source источник
comment
В этом ответе содержится полезная справочная информация.   -  person sanityinc    schedule 05.11.2013
comment
Я подозреваю, что эта документация была написана еще тогда, когда ByteString задумывался как более быстрый String. С тех пор мы усвоили урок — у нас есть реальные типы, которые действительно быстрее Strings, а ByteString — только для последовательностей байтов. Но так было не всегда.   -  person Daniel Wagner    schedule 05.11.2013


Ответы (2)


Это окольный способ сказать то же самое — декодирование не производится (поскольку кодирование 8-битное, ничего делать не нужно), поэтому hGetContents дает вам байты в диапазоне 0x00 — 0xFF:

$ cat utf-8.txt
ÇÈÄ
$ iconv -f iso8859-1 iso8859-1.txt                         
ÇÈÄ
$ ghci
> openFile "iso8859-1.txt" ReadMode >>= (\h -> fmap BS.unpack $ BS.hGetContents h)
[199,200,196,10]
> openFile "utf-8.txt" ReadMode >>= (\h -> fmap BS.unpack $ BS.hGetContents h)
[195,135,195,136,195,132,10]
person Mikhail Glushenkov    schedule 05.11.2013

Возможно, это похоже на это, тогда:

Бывают ситуации, когда кодировки обрабатываются неправильно, но все равно работает. Часто встречается ситуация, когда база данных настроена на latin-1, а приложение работает с UTF-8 (или любой другой кодировкой). Практически любая комбинация 1 и 0 допустима в однобайтовой схеме кодирования латиницей-1. Если база данных получает от приложения текст, который выглядит как 11100111 10111000 10100111, она с радостью сохранит его, думая, что приложение предназначалось для хранения трех латинских символов «ç¸§». В конце концов, почему бы и нет? Затем он возвращает эту битовую последовательность обратно в приложение, которое с радостью примет ее как последовательность UTF-8 для «縧», которую оно изначально сохранило. Интерфейс администратора базы данных автоматически определяет, что база данных настроена на латиницу-1, и интерпретирует любой текст как латиницу-1, поэтому все значения выглядят искаженными только в интерфейсе администратора.

person Omari Norman    schedule 06.11.2013