Haskell:未经请求的unicode字符在i / o中转义

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Haskell:未经请求的unicode字符在i / o中转义相关的知识,希望对你有一定的参考价值。

我基本上有一个用于复制文件的CLI实用程序。

{-# 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库吗?是编译选项吗?到目前为止唯一不能逃脱unicode字符的是putStrLn

我希望原始路径完好无损。

UPD:

Make it easy to extract a file path as Text from a FilePath

黑客现在看起来更漂亮:

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)

它暂时有效。尽管如此,我仍然喜欢强制逃避的想法。 showprint一般都非常有用,并且通常逃脱无用。没办法把它关掉?

答案

子串"\8211"show(在let parts = splitOn """ (show path))产生,而不是由realpath产生。可能你应该删除对show的调用,尽管它不是100%清楚你想要的跟踪代码。

以上是关于Haskell:未经请求的unicode字符在i / o中转义的主要内容,如果未能解决你的问题,请参考以下文章

Java中将字符串与unicode的相互转换工具类

在 Qt 中将字符与 unicode 进行比较

如何将unicode字符转换成汉字?

如何将 Json 请求中带有 unicode 的值转换为简单字符?

java中如何获得一个字符的unicode编码

在 Haskell 中获取 Windows 内部版本号