как избежать беспорядочных кодов при выводе китайских символов - PullRequest
0 голосов
/ 25 апреля 2018

Я обнаружил странную проблему с записью китайских иероглифов в файл writeFile.

> writeFile "r.txt" "过"  -- outputting as expected.

enter image description here

> writeFile "r.txt" "图"  -- not displaying as expected. see the following:

enter image description here

Тогда случается странная вещь:

> writeFile "r.txt" "图画"  -- outputting is normal, as follows: 

enter image description here

Дополнительные примеры, отображающие грязные коды:

> writeFile "r.txt" "士"
> writeFile "r.txt" "十"
> writeFile "r.txt" "千"
> writeFile "r.txt" "一"
> writeFile "r.txt" "一千十士图" -- This is displayed as messy codes.

Но это нормально:

> writeFile "r.txt" "一千十士图画" -- This is normal.

Поэтому нормально, если указанные выше символы экспортируются вместе с другими символами, которые могут отображаться обычно, например writeFile "r.txt" "十过"

Понятия не имею, почему это происходит:

—— Почему некоторые символы выводятся в виде грязных кодов, а другие нет? На самом деле, «一千 十 士 图» - наиболее часто используемые символы на китайском языке.

—— Почему символы, экспортируемые в виде беспорядочных кодов, могут отображаться нормально вместе с другими символами, которые могут отображаться нормально?

Буду признателен, если кто-нибудь предоставит некоторую информацию.

1 Ответ

0 голосов
/ 25 апреля 2018

Во-первых, это отличный вопрос.Проблемы с кодированием все еще остаются проблемой, даже сейчас. Windows по умолчанию теперь использует UTF-16 , в то время как большая часть Haskell разработана на платформах UTF-8.Фактическая кодировка, используемая функциями System.IO, не является четко определенной во время выполнения, поскольку она устанавливается средой платформы, или выбирается произвольно, если нет.

Первое, что нужно сделать, - это переключиться на Data.Text для обработки текста.Это не только лучше понимает кодировки, но и значительно эффективнее, чем модель "Список символов", которой является String.Он имеет собственных функций ввода / вывода , которые также учитывают конкретные кодировки.

Чтобы упростить эту задачу, включение OverloadedStrings будет очень полезным.Кроме того, поскольку вы используете строковые литералы, проверка того, что кодировка файла исходного кода соответствует среде при компиляции GHC, также поможет.Есть много мест, где обрабатываются эти данные, и после определенного момента загрузка ваших строк из файла с заведомо исправным результатом оказывается меньше головной болью, чем помещение их в исходный код.

...