あなたの問題は単なる誤解だと思います。
Prelude> print "Ёжик лижет мёд."
"\1025\1078\1080\1082 \1083\1080\1078\1077\1090 \1084\1105\1076."
Prelude> putStrLn "\1025\1078\1080\1082 \1083\1080\1078\1077\1090 \1084\1105\1076."
Ёжик лижет мёд.
Prelude> "{\"a\": \"Ёжик лижет мёд.\"}"
"{\"a\": \"\1025\1078\1080\1082 \1083\1080\1078\1077\1090 \1084\1105\1076.\"}"
をprint
含む値を指定するString
と、Show
インスタンス forChar
が使用され、コード ポイントが 127 を超えるすべての文字がエスケープされます。必要なグリフを取得するにputStr[Ln]
は、String
.
したがってaeson
、値自体が utf8 でエンコードされているため、予想されるように、utf8 でエンコードされた入力を適切にデコードしました。
encode = {-# SCC "encode" #-} encodeUtf8 . toLazyText . fromValue .
{-# SCC "toJSON" #-} toJSON
では、なぜエンコーディングの最終ターゲットとデコーディングの開始点に and をaeson
使用ByteString
しないのかという質問に。Text
それが適切なタイプだからです。エンコードされた値は、マシン間で移植可能に転送されることを目的としています。これは、バイトのストリームとして発生します (衒学的な気分であれば、オクテットです)。これはまさに がByteString
提供するものであり、アプリケーション固有の方法で処理する必要がある一連のバイトです。の目的のためにaeson
、バイトのストリームは utf-8 でエンコードされaeson
、関数の入力が有効な utf-8 であると想定し、decode
その出力を有効な utf-8 としてエンコードします。
Text
16 ビット エンディアンはエンディアンに依存するため、たとえば転送すると移植性の問題が発生Text
します。マシン間のデータ交換には適切な形式ではありません。中間段階で使用するのに適した型であるため、エンコード時に (おそらくデコード時にも) を中間型としてaeson
使用することに注意してください。Text