我需要比較的Windows新行字符(「\ r \ n」),但我得到哈斯克爾換行符
lexical error in string/character literal at character '\\'
['\r\n']
我怎樣才能解決這個問題?
謝謝!
我需要比較的Windows新行字符(「\ r \ n」),但我得到哈斯克爾換行符
lexical error in string/character literal at character '\\'
['\r\n']
我怎樣才能解決這個問題?
謝謝!
編譯器告訴你'\r\n'
不是一個有效的字符。這應該不會令人意外,因爲Windows使用兩個字符來表示行結束。這意味着你需要一個String
:
"\r\n"
這也意味着,分析輸入的時候,你需要更復雜的分析。尋找兩個字符的序列比尋找單個字符要困難一些。要解決
一種方法是與應用於每個String
一個簡單的過濾器可能包含"\r\n"
刪除所有'\r'
字符:
deMicrosoftifyString = filter (/= '\r`)
令人失望,我不得不重寫很多代碼 – yonutix 2014-11-04 18:08:14
@CosminMihai只是說,你會遇到任何語言的這個問題,它對於Haskell及其類型/庫來說並不是唯一的。你可以責怪微軟決定兩個字符比一個更好,即使沒有真正需要回車字符。 – bheklilr 2014-11-04 20:38:58
@CosminMihai一個簡單的解決方法是''過濾'每個'字符串'來刪除''\ r''字符。它們基本上是不相關的,即使在現代版本的Windows中也是如此。大多數程序,無論操作系統如何,都會將'\ n'識別爲換行符。 – 2014-11-04 23:13:11
注意,對於文件/在Windows默認的文本模式流,"\r\n"
是輸入時自動轉換爲"\n"
,反之亦然。
如果您有特殊需求,默認不處理,您可能希望查看System.IO.hSetNewlineMode
函數,該函數允許您設置用於特定句柄的換行符轉換。例如:
hSetNewlineMode handle universalNewlineMode
設置一個把手來接受"\r\n"
或"\n"
作爲輸入新行(內部"\n"
),但使用上輸出的本機操作系統約定。
+1肯定比我的回答更好,因爲你給Haskell特定的方式來處理這個問題。 – 2014-11-05 03:43:40
事實上,'\ n'和'\ r \ n'之間的轉換甚至可以由C對Windows中以文本模式打開的文件執行。它是C標準的一部分,它確保您可以編寫可移植的C語言,並且包括Haskell在內的許多語言都可以複製該特性。 – chi 2014-11-06 09:34:44
爲了澄清迄今爲止收到的最佳答案:'\ r \ n'不是一個換行符 - 特別是,它不是一個字符。這是兩個字符;所以你需要一個字符串文字(如上所述)。當然,你遇到的這個問題與Haskell無關。 – MasterMastic 2014-11-06 18:06:02