私は基本的にファイルをコピーするためのCLIユーティリティを持っています。Haskell:I/Oでエスケープするunsolicited unicode文字
{-# LANGUAGE OverloadedStrings #-}
...
import Turtle
...
{- Command line parser -}
-- | Represents command line options.
data Settings = Settings
{ sVerbose :: Bool
...
, sSrc :: FilePath
, sDst :: FilePath
}
...
トレースコード:
...
-- | Extracts String From FilePath (unsafe and unofficial).
-- No double quotes allowed in paths.
strp :: FilePath -> String
strp path =
let parts = splitOn "\"" (show path)
in parts !! 1
...
putStrLn "Наблюдаем юникод"
putStrLn $ strp (sSrc args)
putStrLn $ strp src
...
操作コード:
...
src <- realpath (sSrc args)
...
sSrc
ため
コンソール入力は、実際.
コンソール出力である:
Наблюдаем юникод
./
/home/alexey/common/Downloads/UpDown/Books/Audio/_Nonfiction_/Moral Combat \8211 Good and Evil in World War II [Unabridged]/
1/26 /home/alexey/dir-dst/Moral Combat \\8211 Good and Evil in World War II [Unabridged]/01-Moral Combat \\8211 Part 01.mp3
\8211
はダッシュのようなものです。エスケープされたパスは、.
のすぐ外にrealpath
によって生成されます。私はその理由を知らない。それは特定のI/Oライブラリですか?コンパイラのオプションですか?ユニコード文字をエスケープしない唯一のものはputStrLn
です。
元のパスをそのまま残しておきたいです。
UPD:当分の間、
import qualified Filesystem.Path.CurrentOS as FPS
import Data.Either.Extra
...
-- | Extracts String From FilePath
-- (good until deprecated system-filepath removed).
strp :: FilePath -> String
strp path = T.unpack $ fromRight "" (FPS.toText path)
をそして、それは動作します:
Make it easy to extract a file path as Text from a FilePath
ハックは今きれいに見えます。それでも、私は強制的に逃げるという考えはまったくありません。 show
とprint
は一般的に非常に役立ち、しばしばエスケープすると役に立たなくなります。これをオフにする方法はありませんか?
文字通りのものとパスの間の変換を少なくするために、https://hackage.haskell.org/package/system-filepath-0.4.13.4/docs/Filesystem-Path-Rules.htmlを見てください。 – dfeuer
'strp'は何をする予定ですか? 'show'は間違いなくそれを実装する方法です。 – Ryan
'show'は最初から醜いものでした。私はちょうど良いことを知らなかった。 UPDを参照してください。私は依然としてオプションでエスケープすることを止めることに非常に関心があります。例えば、 'print'はエスケープのためにしばしば無用です。 –