取消在Haskell字符串中找到的unicode文字

Rob*_*art 3 unicode haskell rdf unicode-literals

小写的unicode s是U + 0073,该网站称其为\u0073C和Java.

给定一个文件:a.txt包含:

http://www.example.com/\u0073
Run Code Online (Sandbox Code Playgroud)

让我们用Java阅读这篇文章,\然后看看我们得到了什么:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import org.apache.commons.lang3.StringEscapeUtils;

public class Main {
  public static void main(String[] args) throws IOException {
    String s2 = new String(Files.readAllBytes(Paths.get("a.txt")));
    System.out.println(s2); // prints http://www.example.com/\u0073

    String s3 = org.apache.commons.lang3.StringEscapeUtils.unescapeJava(s2);
    System.out.println(s3); // prints http://www.example.com/s
  }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

$ java -cp ./commons-lang3-3.4.jar:. Main
http://www.example.com/\u0073
http://www.example.com/s
Run Code Online (Sandbox Code Playgroud)

所述unescapeJava(s2)方法调用取\\u0073从文件和取消转义到\u0073,然后印刷变为"S".

我们可以在Haskell中做同样的事吗?

让我们使用文本库来使用这两个文件:

Prelude > a <- Data.Text.IO.readFile "a.txt"
Prelude > a
"http://www.example.com/\\u0073\n"
Run Code Online (Sandbox Code Playgroud)

从自动翻译的任何期望\u0073s在Haskell可能被混淆\x,而不是\u前缀用于进行这样的期望:

Prelude> "\x0073"
"s"
Run Code Online (Sandbox Code Playgroud)

那么我如何unescapeJava(..)在apace-common-lang中使用方法,并在Haskell中复制它的功能来\\u0073进行\u0073,并将其打印为"s"?

Rei*_*chs 6

在您的示例中,a并且b不相等,因为生成它们的文件的内容不相等.

readFile使用"运行时系统的语言环境,字符集编码和行结束转换设置"读取文件的文字内容.readFile不会解析W3C兼容(或任何其他)形式的数字或其他字符转义.文件中的字符"\"将始终作为文字"\"读取,而不会作为转义序列的开头.我不确定你为什么会这样做,因为我不知道任何语言的标准库在读取文件内容时会自动尝试将文字"\"解析为转义序列.

如果要解析的文字文本"\ u0073"(这是人物\,u,0,0,7,3,这将通过哈斯克尔显示为"\\ u0073")作为一个字符的数字逃生s,你需要编写一个解析器或使用别人写的.readLitChar是这样的解析器,但它使用Haskell约定,这与W3C定义的不同.但是,您可以看到底层构造lexCharE,这可能有助于您编写自己的构造.