3

小写的 unicodes是 U+0073 ,这个网站说它是\u0073用 C 和 Java 编写的。

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

http://www.example.com/\u0073

让我们用 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
  }
}

输出是:

$ java -cp ./commons-lang3-3.4.jar:. Main
http://www.example.com/\u0073
http://www.example.com/s

unescapeJava(s2)方法调用从文件中\\u0073获取 并转义到\u0073,然后打印为“s”。

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

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

Prelude > a <- Data.Text.IO.readFile "a.txt"
Prelude > a
"http://www.example.com/\\u0073\n"

在 Haskell中自动翻译 from \u0073to的任何期望都可能被执行此类期望的而不是前缀s混淆:\x\u

Prelude> "\x0073"
"s"

那么如何unescapeJava(..)在 apace-common-lang 中采用方法,并在 Haskell 中复制其功能以从\\u0073to 开始\u0073,并将其打印为“s”?

4

1 回答 1

6

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

readFile使用“运行时系统的语言环境、字符集编码和行尾转换设置”读取文件的文字内容。readFile不会以 W3C 兼容(或任何其他)形式解析数字或其他字符转义。文件中的字符“\”将始终被读取为文字“\”,而永远不会作为转义序列的开头。我不知道你为什么期望它表现得不同,因为我不知道有任何语言的标准库在读取文件内容时会自动尝试将文字“\”解析为转义序列。

如果您想将文字文本“\ u0073 ”(即字符\, u, 0, 0, 7, 3, 将被 Haskell 显示为“\\u0073”)解析为字符的数字转义s,则需要编写一个解析器或者使用别人写的。readLitChar就是这样一个解析器,但是它使用了 Haskell 约定,这与 W3C 定义的不同。但是,您可以看到 的底层结构lexCharE,这可能会帮助您编写自己的。

于 2015-10-21T03:36:53.973 回答